From b6a95f9970305c8883a27f6bd4e3ed85f43ee519 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 20 Mar 2025 14:08:06 -0400 Subject: [PATCH 01/47] 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 | 179 +- 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, 6339 insertions(+), 40 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 03dba51d0c..28cfd2322a 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 ee9fdbd274..d465994a6b 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 fc0576872a..d4ff75434e 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 d4513068fb..ec39608d3f 100644 --- a/conanfile.py +++ b/conanfile.py @@ -2,6 +2,7 @@ from conan import ConanFile 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 @@ class Xrpl(ConanFile): 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 1c476df617..b6477baa02 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 4393f1a1d9..a89bd4e486 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 bbed539592..a7c184e81c 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 317e9c2c97..01bf4669aa 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 7b120c0b8d..103dc34243 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 5a652baf4f..2d4a3453ea 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 3217bab913..42a706c4de 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 dd3ac42325..19c31d439b 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 483b69a962..fa34cf800b 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 16f0c28879..f14fce4321 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 815b27c001..dc0bdb4a59 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 714fc7734d..123b654835 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 289ce2a713..a49dbb0bca 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 a04316cbd7..55622e4923 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 0000000000..31e8007c72 --- /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 d81551aa84..262c6ebeb8 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -343,6 +343,33 @@ public: } }; +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 1309a52393..fd4949d5a4 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 3f804adda6..662442676f 100644 --- a/src/test/rpc/Subscribe_test.cpp +++ b/src/test/rpc/Subscribe_test.cpp @@ -515,6 +515,22 @@ public: 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 @@ public: { 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 90e77c1e3d..852f73cde1 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 95160f398a..5583b68862 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 @@ public: 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 d46bfa74db..2b3c38eea4 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 0000000000..d94135646b --- /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 0000000000..37988a97e3 --- /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 45834742c8..2f5d1c6e31 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 48b9867d3a..41b51b295f 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(featureDepositAuth)) + if (!ctx_.view().rules().enabled(featureSmartEscrow)) { - if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); - !isTesSuccess(err)) - return err; + // 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; + } + } + + // 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()); + 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 78acdbee00..0a74f31b3a 100644 --- a/src/xrpld/app/tx/detail/Escrow.h +++ b/src/xrpld/app/tx/detail/Escrow.h @@ -36,6 +36,9 @@ public: 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 9d3e9e3946..f192126387 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 4329632b2e..c0cedcc1a4 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 b6375f1a9b..6a34b1db91 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 02/47] 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 | 28 +- 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 | 16 +- src/test/app/AccountDelete_test.cpp | 1 + src/test/app/AccountTxPaging_test.cpp | 13 +- 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 | 5 +- 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 | 6 +- 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 | 129 ++++-- 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, 3542 insertions(+), 1397 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 1d0f396dd8..9100396885 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 d3c67e8668..afce1557d3 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 fe4a2c3e22..2834595e3a 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 36d9f0225a..566e3550e0 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 310c538584..fd985dce81 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 7c132f5429..df1d273f93 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 681f76dd5d..eca7fc6dc2 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 5d4d14d503..6bc7beccc7 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 d465994a6b..7affa212ab 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 ec39608d3f..d49f45903e 100644 --- a/conanfile.py +++ b/conanfile.py @@ -108,7 +108,7 @@ class Xrpl(ConanFile): 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 1b0063663a..4ee5aa70dc 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 7ff07f6ea4..8c3acdee07 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 86b42f79f0..7d7a575d98 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 1c7853d814..8b85ce1540 100644 --- a/external/rocksdb/conanfile.py +++ b/external/rocksdb/conanfile.py @@ -15,10 +15,10 @@ required_conan_version = ">=1.53.0" 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 @@ class RocksDBConan(ConanFile): @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 @@ class RocksDBConan(ConanFile): 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 @@ class RocksDBConan(ConanFile): 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 05725bf2c9..0000000000 --- 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 fb0dd0c46b..0000000000 --- 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 0000000000..bb086e6cb2 --- /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 0000000000..7b5858bc1e --- /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 f7e90c7c9a..2e3478644e 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 eb7a457198..b2f1163452 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 4defd5a490..19db3568d6 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 9ea76aa3bd..ef4b6544d2 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 ced41b13ca..9abc7c8432 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 41556f34f2..1f53fab246 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 442270546e..2506b8ea8d 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 6cba352e0a..2ed32f39bd 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 51fcbdfb0d..49700d2b24 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 9e9991f0dd..65d7acfd94 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 1fcdc3707b..dcc7c0def9 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 b689a1b6ac..4f6e1093b1 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 05d83b3bb0..4b93330ef2 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 d739b6bf44..2ed1a96047 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 bdfc8aac36..bf98964b9e 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 c752a07585..aba797ce31 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 4619ca1f4c..a378011520 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 ca65b581d2..4b8bc81759 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 14a063e27a..5d5097bd2d 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 4629e83091..b826b87db1 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 ca3efcdb3f..966b4686ae 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 ad807e92cf..8c978d0517 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 abafc6b2c4..3b9c83a014 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 4cdc3a0e16..350046d594 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 b01fd8ae14..aa67bcad50 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 9b3c889d6a..d95f92d1c8 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 2cbcd9ae3d..6b11fe1eb3 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 30af05ef0a..381980902a 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 febd5cb3dc..7ef71988a1 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 78195048d7..fb47eeb7fc 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 cdac4abbd9..62469cfda1 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 982a8e50f2..0dfbe3197d 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 7711a970de..98a92dba20 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 83e4d6f8a3..4a4ef73b86 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 7f96e924eb..648fbc22e2 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 9d0f50eebf..9e9f83b897 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 e8e12bd556..641787e814 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 956def1c30..e7a7d4b3ad 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 6330f2c8c8..283f7c8723 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 d49730d4d5..51cd3e17ea 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 5856b4c7db..0095290eac 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 e94108f787..99572a549d 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 41cea2a3a0..91ddf33d27 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 5eaf70453e..18895e2410 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 93f11559cf..0188e5c529 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 689b2d1efb..bbb7afc7b4 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 3ad5d70004..9a4e933a2e 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 ec60e56202..87ef8ea4f2 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 96905c20ba..ef5f68e518 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 882e944093..f4c37c3316 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 264bcd90f3..5d680e6e34 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 6fb07c318d..27d608f850 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 e419940171..91d29c28d6 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 86a5ecd984..1b4ff15508 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 164a5ccfa9..0a04deb277 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 b6477baa02..a2eb7d8e50 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 640635c3fc..0cbf1b608a 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 0b6ddda492..ab825658e8 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 e89feb123d..6895ed08ae 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 5f5a04be1b..db2042eade 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 03bab9b32e..15743e856b 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 81a45c383f..1e8c76dbd8 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 2872a5809d..548a7af6f9 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 b86fb63b85..9fd4cbf19d 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 097341384f..e0f28e03de 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 e1a1215dbd..dd7c4834a6 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 6a57b32451..96b37af0b9 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 4c8db2e01e..b89a415ebe 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 d2052bf1f4..d655969030 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 953a209c15..7605a2283c 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 08b9a1bad1..8de2c8cc31 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 4f3e18de32..11ec733c01 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 @@ public: 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 67dc9c4ca5..1a13cd17c9 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 1d0a736db8..8a43d597a5 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 80829c8000..5724a19f57 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 dcbe5dfd0d..7e1156ceda 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 af49234054..121435dd92 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 01bf4669aa..4f544963f0 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 f0f6c7f223..e94e79aee5 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 44ec8ae93f..9422d697ca 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 4a830cf8d7..6ff7e5ebc1 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 103dc34243..0bcc268ca7 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 b3c7a01410..efec616a0c 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 1f8c39aa13..90fff10d95 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 b33b141ee0..22697d12eb 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 226dea3aef..b07ee00e73 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 f57c9ef57e..d33e8a7edd 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 4ab56efb45..88f824d19f 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 e8157c03c6..232d1c381b 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 25cf1ad747..196f8c78c2 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 0e3f63b0d9..371d6cbf97 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 18cbb35b6f..b63a1e89e4 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 bcdddcc711..51ac866e1e 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 97ad77f7f2..35975efafb 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 20bdf421e3..90de885579 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 7eb0009626..88efc077d8 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 d4b24c0131..ee31c78cad 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 8bcddee7e7..4fdc1f6f49 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 db6af46b5b..fac4b866d3 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 9c88b27539..d7cc0395c7 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 4475f59ab7..fbf60c9a7f 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 e5672bd953..2ddbc8200c 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 2ad47ab7ee..7d6f09b391 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 c18152938a..d3b9455480 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 e133143355..c0456b0556 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 ac42aa9ec4..14873a3fd7 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 3bc58970ef..1515177ab9 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 8951d809de..fde27189e7 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 cd9bdfbd03..5008730718 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 4394d02f78..42ba479fae 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 a8b4e35299..741d978aa0 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 4f0a74644a..b5a7b3f368 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 4a9ea321d5..980f2d48a6 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 7f9ffa4526..882878ebec 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 71b5d21fec..b393844972 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 dfe699848d..e659d63570 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 fcf7e65787..c846ceff3b 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 6253884634..d15e001ace 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 12ea817014..4801bcecab 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 a9febbb307..b0e00c3cfd 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 2ab84c3701..abaf1bb7b8 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 8354147987..29455024f6 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 490777111b..ffe664498c 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 dd160a5870..828f2fa619 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 3d68ea30cf..22d1f898d6 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 952e246f5f..48bd8dc0f8 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 948500734c..986c30d8fd 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 93f189d519..d5f2e25059 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 19387013b5..a8441f39ec 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 f1f30af9a2..62f686e228 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 c24c75b32d..84388884da 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 2f7c0b523c..94c7344788 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 5f027e5189..6818d73ded 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 90926afc6c..709b425d63 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 c1a1bcc56a..20dedf2bb2 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 de0ed5848a..a830f2855f 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 7bf5824120..f6fb65d10a 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 3bebfc4659..aa48827195 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 f271882158..109ac3d028 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 5a49635284..d4a2fccb4a 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 c096dba2b4..cfd1fc61dc 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 151f8f570c..39d34c43e7 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 4cb2a874ae..ca853c690e 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 05164489ec..3065bdf41c 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 7fc879609e..9bd1ceb5eb 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 046be44422..fe8f0c4778 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 179cb1eb14..b6edf77b2a 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 846c3bc07b..8deb2d735a 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 518c3771d6..9755eedf3b 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 284c4dc055..9984a971c8 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 38022a0ed3..c8decb2b3f 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 03c9e79e26..0c0a657512 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 72fb8b87bb..55b03b10a5 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 3d761e6b93..921ba4e1d1 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 fdab288cea..cdf646e0f8 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 ba669d9bd1..f7a970a3b9 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 64e5a36989..9f898dca25 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 e9ca3c3c1e..2fc9ba173b 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 64ac6c4631..dfdf60f02e 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 7043acff96..3d1c718e65 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 20e1e11265..b59e2a2b69 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 d75261c0a6..0b6e321bf4 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 c033e4cb58..ba9a2d1919 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 37830830ad..e0815fbef3 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 0dea9c7665..0c5b4e198c 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 6986957b61..86e52a1f73 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 34e759b4c3..33245a1e16 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 56ac19da11..a17ed2e0d2 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 9525a47c46..bc5b7e855e 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 5a2008cb17..8483b8cfe3 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 0350dd883b..ae80abb69f 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 74961bfbca..c0cdcccd6e 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 821f8f05c9..d0873561e3 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 7d08993a8b..0488189a66 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 57bcaca6b2..d2bd20cfe8 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 bd1c461c8c..a60f7325f0 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 f14fce4321..948a47f0ac 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 c5d3102bfa..3af0345c4e 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 6f70a3849c..50b022d294 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 2347e63379..1499d790cb 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 474c37ac80..06b1061c1e 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 453b4593bf..095c09e7c0 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 f46104f638..339e25db1d 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 32645c3762..27c2b0435c 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 dc0bdb4a59..3766f33c54 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 76b1ae8ad4..b2dd3a656f 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 dad67c1334..d9a9f0db87 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 c57bcc153a..dadfccfa9f 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 82e7344569..e61224b570 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 237e7aa49f..2626ec0968 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 49ec926a77..a822b1937f 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 53df4e592d..8c96e3696f 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 6f0d6dcc49..71a84340cd 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 17fb475394..6d81cbbd25 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 d73ca09002..08e0bcd408 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 ce173b1e9e..69adb235ee 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 9c1f16cda0..95709fc298 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 058cdfd1d2..bebf2844b6 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 c547a537bf..878c570a12 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 96053b93b4..ed9fa0f1f8 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 f1e81132c5..9eee2b8805 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 +#include + namespace ripple { namespace test { diff --git a/src/test/app/AccountDelete_test.cpp b/src/test/app/AccountDelete_test.cpp index f8d3cf4692..c903f95f77 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 680e006a74..46a56f58e3 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 +#include + +#include namespace ripple { diff --git a/src/test/app/AmendmentTable_test.cpp b/src/test/app/AmendmentTable_test.cpp index 2f95fc0280..5ba820da95 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 2c4f44ce79..d27df46468 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 c000433d2a..d41f6de556 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 481850562f..24e656672d 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 6f6a7eb3e7..1e19a178c2 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 3f9cce1d33..3a2ed260c6 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 7a39c5f079..7e209deb1c 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 3c62a47a4a..3c5fd43c18 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 463c606dc6..9e04c5e496 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 1eaa1ad86d..8e306282a7 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 123b654835..1f872d2bdc 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 a49dbb0bca..73bb539a22 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 f8db4df4f9..f87d70aacf 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 4d1397eab8..aa7e819e07 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 99696c11f6..36578cbc6b 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 1234bc5b9c..d8d7ca6851 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 e1a837a9cb..7b1910bd4d 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 5b6df353d8..c151bc7b4a 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 d53d27b318..a5517cccee 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 883aca7bce..15f51889bb 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 fa7489bf1b..9b0cf2fa2d 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 9fd4927d5e..31e5368691 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 0e25300417..deaa2adbad 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 9648bed886..ecac8ac67b 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 a56f0a4567..a970b11789 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 23e4c67152..fe21e02739 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 ec1ee5111e..62a7b00da9 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 2f02a1fd7d..07a4641c0e 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 bf71250368..691d327cd8 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 2b4245a1ae..8ba4113341 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 44eeb1c9f9..291349309a 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 0a7f42e180..f6e4466bab 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 1db15388ff..b500014578 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 bc1cbba69c..dc839f89ec 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 f00a736129..4d743d9d7c 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 7d78652b28..65f75897ae 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 55622e4923..1101f56c69 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 b5440b9090..85ba0ab78d 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 540d98bc1f..31c38f23b1 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 a070051e43..5af06d594d 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 ec52d603eb..ca8dcdf5e2 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 5fd3f79c9f..d3b5917434 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 3dd8ab590a..c531de2d75 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 024d8de137..6a3a5ff2a9 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 57e18d712f..c99a1dafa1 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 89e44b2b98..3b3f338625 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 917d23377b..0269d206cc 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 9467390502..dd83e3036e 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 928fcdb838..472d4e2ab8 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 b438d79727..037a7e0d89 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 5201cb601e..2bedee17ca 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 9281ec4bd7..7c8584698e 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 465723b1a7..819340bfa4 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 1ec302efef..f7db0463c1 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 3d25e9e989..777cd5a68f 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 df76e839a7..63fecde65f 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 da8bcc8f12..43ca048d7f 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 2f8b92eb91..d022d07461 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 c32f98f192..6266288896 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 2b84998da7..b78173f35f 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 eab0e87d0a..d39fd4a716 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 8a0a6702a6..13d8b259d1 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 756988cbda..7ec62a1701 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 a169de9853..3d474def79 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 6fbba1a479..519bc235cd 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 9f3194f4fb..8058e0d6f0 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 #include namespace ripple { diff --git a/src/test/basics/contract_test.cpp b/src/test/basics/contract_test.cpp index 99f118794e..9595dbabcc 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 343894e52b..248e807035 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 22cdc5ad53..cb15d246a6 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 1ad49443dc..7b3eba55f1 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 2f24a0c892..fb7a3e3e4f 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 @@ public: }; 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 e5736764e0..f88d5acc27 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 653b0a8961..839aaaef0a 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 e91f527d3c..bbbc2fc0e0 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 @@ public: }; 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 8fd16a4d51..9a645334ab 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 a026df2637..b86afdb139 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 f3926634dc..c769cde07a 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 9622819430..de3c5d1d20 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 0d36cd7698..ec86d5d7d7 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 9a6840b11c..820b005a3f 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 92dbfc0174..b979943477 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 88280994c1..db56ab58c6 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 @@ public: testShouldCloseLedger() { using namespace std::chrono_literals; + testcase("should close ledger"); // Use default parameters ConsensusParms const p{}; @@ -78,46 +80,102 @@ public: 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, p, true, journal_)); + 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, p, true, journal_)); + 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, true, p, true, journal_)); + + // Agree if no peers and enough time has passed. + BEAST_EXPECT( + ConsensusState::Yes == + 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 @@ public: { using namespace std::chrono_literals; using namespace csf; + testcase("standalone"); Sim s; PeerGroup peers = s.createGroup(1); @@ -149,6 +208,7 @@ public: { using namespace csf; using namespace std::chrono; + testcase("peers agree"); ConsensusParms const parms{}; Sim sim; @@ -186,6 +246,7 @@ public: { 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 @@ public: { 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 @@ public: { 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 @@ public: { 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 @@ public: 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 @@ public: { using namespace csf; using namespace std::chrono; + testcase("fork"); std::uint32_t numPeers = 10; // Vary overlap between two UNLs @@ -748,6 +811,7 @@ public: { 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 @@ public: { 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 @@ public: { 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 @@ public: 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 @@ public: testHubNetwork(); testPreferredByBranch(); testPauseForLaggards(); + testDisputes(); } }; diff --git a/src/test/consensus/DistributedValidatorsSim_test.cpp b/src/test/consensus/DistributedValidatorsSim_test.cpp index 3abac36b4f..2f6ed74c23 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 95e27f5c85..79c0f3f884 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 6f13db43be..f46fea8e6e 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 4993f679e1..7eb05e68bb 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 3e3cec9761..226cf5bfed 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 0279d6330c..4424d7619d 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 83d2fdb6e4..a426a4aea4 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 2bf398c9a9..8b0fce1e20 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 0fdc5a4f49..8458da647d 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 303a217631..21924e582c 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 42338063db..66f110be9c 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 82d0cbe903..8f2a3c6646 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 3fac4808f9..e37f7a71f8 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 61660ae4c4..4173db6502 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 72d1e9545d..309b48af1f 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 80319445ca..0cc4be1976 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 2df1844a21..fb0f532396 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 ea8b864780..40274c9046 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 dceafb9648..678924112e 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 b59bfa6763..0da1ef69c9 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 1d70464bab..eae258a251 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 931150bbeb..1935e40236 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 930338108e..32d657b625 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 649f210646..5770c792bc 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 f87f382167..066aee2268 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 @@ public: { } - ID + ID const& id() const { return id_; diff --git a/src/test/csf/Validation.h b/src/test/csf/Validation.h index 57c2bc6668..e79222c84f 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 8dcaa03531..0494178ae9 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 37d1b4b0bd..2209a10f60 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 8f78ad9233..6cc950180c 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 775ec2e58b..74be491b39 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 + +#include namespace ripple { namespace test { diff --git a/src/test/csf/ledgers.h b/src/test/csf/ledgers.h index 1c8d4eb54c..a02adb9c87 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 35752de89b..2680c09712 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 7e5d88c669..94b421e4b4 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 4a64d6538a..94a9e96cf6 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 ddc5f08992..2343843fe3 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 a4f36dac4e..44992df64b 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 97d4297c92..c5305876ff 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 dacc22cc01..0858786f04 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 f3c69ce33c..6b73ca63ec 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 52039f74ae..71e2e5f34c 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 0481dc98a4..5ff2d21a19 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 f49070dff0..d91bb4a383 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 ddb04cb3ff..a8afb521c3 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 @@ public: } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/CheckMessageLogs.h b/src/test/jtx/CheckMessageLogs.h index e51b84b1c0..fd3915440e 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 @@ public: } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/Env.h b/src/test/jtx/Env.h index 66845ae91d..4e8bb64f59 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 691f96c259..622efe297d 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 bbffc72669..3765893eb7 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 81ba1b406a..198839dd28 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 86477bf99f..c9bf4d4763 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 32ec0b2e85..9d2554c18f 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 0f4c4ddd3d..df9de540a1 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 262c6ebeb8..16bb966317 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 22b8fb7e53..d54439d846 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 b786cae284..6138673484 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 d0356dbcbf..8a479f97c3 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 18dadb0bf9..471e6ff31b 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 9990c77c38..589347b12c 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 2f5c63dccb..9161b7241d 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 46e633dab2..f8b0da2c19 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 4e29fad152..7d54804f87 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 c8887cdee4..b5e8207803 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 089d3508d7..3482e7e867 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 575e2e1d88..8555be01a9 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 9d41456ef7..b61048e66f 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 43286ab782..e006f268cf 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 19c20b5bab..4db13c95fd 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 df9483cbaa..721a1c299d 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 3bf69729ab..e5b136e9c0 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 03e2b2d608..20cca3179a 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 d7f8f10e04..842eea7fc2 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 5be53dc0a9..9134122da9 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 66be9da83b..91abfc459b 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 21af6c9cc3..f5aa76658c 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 bc7ccf93cd..f29bc45e20 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 6e4838c7c0..fe9f4e8fe6 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 d91607c990..5f4ae6bdb3 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 a9a6e974ef..67a523403c 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 fd4949d5a4..b94c79ccb8 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 e390136a3c..71e3dd089a 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 6658d3eba9..a6ddfc1d71 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 c9cf6636cf..b76ad2ef0c 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 57742bab2a..4b4368429f 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 2f121dc267..8c78069191 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 6469748b4f..1214ec2a2c 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 42c3bfc78b..a802528247 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 55a1af4bea..f48c0f2d21 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 393e36e9d6..2a45909eb9 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 2a627223fd..82fe910e9b 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 9cdf7c664f..866ca3bb7e 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 dd10b3c611..46f36cb6d6 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 f95170537f..0526cdc28f 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 9fc260d2d0..cff2de3e8e 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 9514b92316..168ce4659d 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 3a3de002db..82f0e98b4c 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 be456a1e0e..9a8c491da2 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 69bcab4d9f..ef1ffd416b 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 49f473fcd8..bea974a016 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 dee4b28236..5e9eadca8d 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 7bc59876a9..77c46f35b3 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 c10fb91854..afa7ee8f35 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 43b0e7c2f9..c63734ee8f 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 837d652476..47f5a3c223 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 44cee17b7b..6bcb1a671c 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 3951f4f934..260b734ddd 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 2299af2d7f..fc904f9e87 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 cc9caf3af7..d1d5f5849a 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 6294b5b308..f9d8822f53 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 49b420d3d2..ee80c6a69f 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 8dc5f21917..70498074d6 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 0f8186accf..6fb8c9a8e9 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 7d021e4f27..ce87c9b259 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 271419e51b..bec21235a6 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 f996284969..be9ce22bf7 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 495c61c33b..54a1c25e2f 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 d75d9f09d0..ab37275bad 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 0d02c6e76c..5f0cebcbef 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 6d34452cdf..2c21fbd3ff 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 9968317c8d..8ff19bd508 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 b50f4381f4..19a1b5d272 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 bea394f2f3..825d7ff340 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 ecf1c8e397..18b037cbbe 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 dd9b5c5d88..303e700f40 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 1bd42a64a6..e2a43eb585 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 3e8987a806..c2088d77cf 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 fc9dce7de7..a9af8e2a40 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 dc1fe8c7fe..488370fbe9 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 aa423e7dc0..62a66c9dce 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 59557f3c79..bbf6381ee5 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 98608c5fb1..634f2bf005 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 73789c0244..3df18eee66 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 e13fe9c0c8..d7865a20fc 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 da7ae9d285..4f6d3c141c 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 dfc0ee70b8..da976f8901 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 d22674d28c..76bbc9d4e3 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 19669efc23..76c38fd59b 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 93038e522a..2d5155aaee 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 @@ public: 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 e0edae5489..9fc105262b 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 0efc49b84e..739d7ea954 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 3d6c2a4d1e..07ff2bb14a 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 @@ private: 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 7fb9f02f42..a150f02f05 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 a1cb8d7408..9006b8c1c7 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 7d634dc569..2dc4f4d6bb 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 fb61d10a73..0637b52efa 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 cfc8d123c2..f4d9722392 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 7ec1507e04..53ebf5be24 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 bd63e7003a..a7fa846a4d 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 7fa798d148..0f5aef261a 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 64cf0c71b3..aa9918a064 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 b512c42a64..1836fa8595 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 4c9eeb0ba1..6e8d37331b 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 @@ public: 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 071a5f4f63..e02cfeeea4 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 54037eaa5b..f48bea11aa 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 8efb584748..784fc43c24 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 bce89bce73..248be5a0da 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 3619e84541..0b89eb22a7 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 5e44bca5b4..7a660c10d2 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 b445890c32..49326e7dc5 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 c1e059a3ea..a0985ea104 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 7d16ca48a9..3ccb89c471 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 cb9712aef5..238b739611 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 bae00d7a76..6e6f0def19 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 @@ public: 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 232a091114..b723095aeb 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 da6acc97e9..2aa85ac9b9 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 3c6cad00e2..7bca51ae96 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 f6a9225ec4..f10b5b8387 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 196ce0e463..bea9cdf57d 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 6bcc0c2080..79e3f940f8 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 8f3fe26adb..cc021ba08f 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 9ed858e2a3..9a63f24842 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 46637d421e..2ccad9d779 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 12d4b27745..bc789f9a74 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 f8b74ed6d5..06531ef552 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 4e847c8dbd..730d58bcca 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 aad3c9be99..1e09219f57 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 132ed93d7b..d0b3404781 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 2c3bfd30d4..4883cf664f 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 6e97301fc3..03f206707b 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 e136bb04be..07ebd93dd3 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 c3f7f900e3..b0a2216b1f 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 1e4f97a935..b56cb241dd 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 d8fe738b88..a80f706b6f 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 ebc6297fe4..d4fd2fd392 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 61905c99c1..221f639819 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 fcf47a5745..d040ed5632 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 4551365029..6cd566e144 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 aa5e6e1efe..5c41f25128 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 606f2274b8..8d9f9c401f 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 ab9b17b259..d325da12c3 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 b812740fb3..8438ef533d 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 11a0ef787d..531649b8af 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 c3328fb0b2..efe69496fb 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 b0506224f7..ccef6e297e 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 8cef5dcbc6..5ac8654330 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 5e202f275a..21312ef8ff 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 656e5f0577..089c444e11 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 c68131e813..e37fe2dabd 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 662442676f..1546f2c859 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 09423ed25d..bafb01f5ff 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 63151bdaeb..d5b1b27a35 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 2bd20eb370..6aef32dbf3 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 5ca1af7a3c..4904923e0b 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 b53b8d1f82..d03cbbf841 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 b66e502b9f..c0bc5d450b 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 f15085d6ef..bcd355e301 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 c17c752ff1..f8895ae7e9 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 ac2d16ecc9..04385f9441 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 627e97e152..c3af07f036 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 c8c877935f..3197e0944d 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 db5a2c40ac..47308a82f8 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 246ac26237..d247ae3015 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 a4435dd1af..653bbead06 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 12a768ca4c..7cdf15949d 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 fe368a69a6..0a5cee4121 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 6519b90e4c..735c67fd01 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 ed7ad9faeb..cd14c30a94 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 37f61a8c2d..83847b2e9e 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 b5d3d152cb..63cfde8700 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 bbf3797887..baa0899f02 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 c4d9389e89..a04047c78a 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 7b1559fba4..a9f872bee9 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 2b27471c64..a93169800e 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 a82323f628..21efc4983f 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 65a782aef7..6b17d93c9d 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 6bdb602fd8..7944578f77 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 725057aa02..efa16371a7 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 2379807a91..fa5fa65059 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 6ac52de28e..ca58bf3058 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 409fa3529c..0805db6c8d 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 77a0370f7d..e62426b720 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 857f2b8eae..4a68f577ad 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 13f603e79d..e8f244bfc0 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 937a151589..037897392f 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 368375c07c..6feee44004 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 852f73cde1..d3c59fbeb6 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 0eb102eb51..81c26526e5 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 251e8d5128..b086e02134 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 ed0b11723b..bf866abf3f 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 9d414e4aad..33f8bf1d96 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 5636a8ca20..c0c9d74f46 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 dd7f0b6a61..f8d726ec8e 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 8e52c8d5d5..a3bdedf821 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 54863e7095..03110d8442 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 4ce4b20b22..b00430303a 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 8f9316cbc6..40be57fc9c 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 638e070f44..bf86992a69 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 95d4a7cb23..9fe56ff488 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 265e0b6290..5d3616ce20 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 ce0d9f0faf..d120f43aea 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 d296fcacc9..20263fd1f3 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 65f27af602..ffbbe4ae09 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 5d0f4966a4..3f099cd2ea 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 32fdff76ab..c1eed3a9f3 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 99a26ce8f9..b05268f65b 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 b8f327ff8a..54477ccaed 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 27322e302c..7c0dccfb9b 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 b0b2c76c24..2435964766 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 6bc894da48..0c6a5e786c 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 7b9d881d54..5bfad61bf4 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 164fbf8cc5..a9d2657f9b 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 3ef3201567..6de717be4f 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 3f6869df1d..5f1e47e8b3 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 a6eb7721a3..b6bfc8f850 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 a6b93b4694..86a3b4b840 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 912c29a9f6..fc7e4d140c 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 03c8181df6..0e97945174 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 35d8f1fffb..0961488691 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 228e879d4d..85ce6fc3b4 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 fa4758ebcc..23694b3cb6 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 230bce2fc9..f0d9b40928 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 e2e1213a37..7acc3579b0 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 3953b56d67..aa502b4143 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 8f2dd606de..27d1840766 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 504309d083..a4b1a74685 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 1c42a3d333..cd1e8c1a71 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 ae7ff965f5..81f59d8e2b 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 7dc4d03b2c..2ee811dc19 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 0298a40493..2ecbd5e7da 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 01b96a3d26..9ae9e44a3a 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 f818068dcf..166c40538c 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 @@ public: */ ~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 @@ private: 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 6e92c2e83a..2fa0f68df4 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 e0b83d54c8..a1da64a0f9 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 b4da865194..3616255c13 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 f2dce5421f..6ef2ff3ca6 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 b16142b261..c21cc93934 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 c6c0c808bf..f27d542e32 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 52fe819a28..ebc2834109 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 d6193adca2..deb0386236 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 a18cd40336..dcc5975b34 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 acc4f2621d..8b52acf54e 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 3bc875ee4b..815bf52189 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 47769e21e4..35f723aa02 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 5583b68862..e312ab042f 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 875a7bb7df..0064359c76 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 f0284f267a..72ed965717 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 2b3c38eea4..b721c80bfd 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 @@ public: 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 @@ private: 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 be849531e2..e353552213 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 d8415713a7..d2836be287 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 e2e0e3b9c4..52ea40cf94 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 7d36f092be..2b618f6538 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 db5af4509f..6fc61055f1 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 f5b9e5735a..d29d6cdc6d 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 7576455798..4e18aa5db3 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 39bf895807..88e30e28ab 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 0b83afc6d3..5078049a4a 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 898c41b40c..278680581e 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 23a5cbd9c2..062c3e867d 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 d7a5ae8247..ae41a2aa7e 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 50fb0ac14d..96e7555401 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 04c8523aec..c42256495e 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 30af6b773d..89bf1a7202 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 6e7a213908..11d81fb8ae 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 2b36848c88..8227c5bcdb 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 3a81443db6..282c3c9e19 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 1994f49861..799689ef25 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 afd49adf32..15be569566 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 cd90926511..a2b852edfd 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 9b8d86f5e1..51fd6db78c 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 d48f0b5fdf..2d423a9e50 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 fe60d39262..b41e26ac84 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 e90a5b8611..9241ba2057 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 26282e742c..566fad9104 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 e027949e76..ca721e4edf 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 b71ec057ae..0ea2d687dd 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 3df8f6f999..66793fc74c 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 5390394b7f..048b8785f1 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 643923320a..dc2868eaf2 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 21f10d066b..3fdbecf7ed 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 86560445ec..9ada526751 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 670790518a..fadf6b7b7c 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 5864357aec..379bb07e4b 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 01556a3c63..973fda8855 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 c7b2e1f01e..c783bb8e9f 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 9e03da9c90..45f68725cc 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 38b630eeb7..f047dc9500 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 cde1d589f9..5a3188c810 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 6390c8d211..28572b899e 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 4189f7ff48..efbe281f5e 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 @@ public: 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 813554ba7f..83894b2e76 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 16ea8628f3..c719c0a92d 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 1d35f80b18..5e650230fe 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 46aa129ac7..4e5ccea3f1 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 @@ protected: 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 4c3ea5faf1..e28b34f5d1 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 b73b1ac8ac..99f212d548 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 d4fda2bfe6..4acafd1b9a 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 dee90f617a..bb9abf6545 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 0e168b73cc..47037c5f5e 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 ab211a7c85..4f38a7b422 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 a7528e2370..927b08d385 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 e65e9d4d57..595e749f18 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 6130c9fc26..5cbb356520 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 493e277bfc..a230eac6e3 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 59c484d206..0e8c678be5 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 95836a85bb..edd1fb2174 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 3c61fb5790..4231f090a3 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 ffb2859691..0a329f2ccb 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 38325252c9..101f9a946d 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 c1eb17c992..2a5557ff4b 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 e8a14c1492..6fec46be90 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 162224ff91..64a42374ec 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 31773166d4..deafa6f27a 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 430ac17e87..28d56eab98 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 675f560098..6a718a3f04 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 1b8b91e518..84d0905a22 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 23e8529cfc..586f453c6f 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 5a37f74b2f..71fe246f15 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 1ddcff5506..715d4ea471 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 011d992dd7..a766efbde1 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 4de6b785b9..f215cdb620 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 7954e86cf3..cfa3bd10e2 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 30e955a828..6d8c077a62 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 0942e61282..0813dd0aef 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 f6e5f6f3e3..468adbd209 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 2f5d1c6e31..e40e61ff94 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 b0780a75c0..d710827dd6 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 d60acf9fd7..e58faf2286 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 3a278eed73..19ef28b843 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 f1b6646884..92ba54f077 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 234267804c..35808c78fe 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 b04f4af1d3..594335f489 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 099dcde934..86cf91bb5a 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 ca80bc159e..73c397cf37 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 7e7522d82c..5b4acb3998 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 @@ public: }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/DID.cpp b/src/xrpld/app/tx/detail/DID.cpp index 6e5a3108c7..31ce7c8770 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 18ddf01a8d..d562069460 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 5f88a9ba71..c9d3305562 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 807e52ee6b..78e3d55230 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 599fcd6052..f10f09b38f 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 41b51b295f..165a6df5f4 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 d39492c108..b97a0c02ee 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 568ed49304..008d9b6ae7 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 b480d23929..bff51a723c 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 8042c9c698..cfc098ab0f 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 1297a918e1..1bd3fcadd7 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 a0f0b9d860..ed5d3c4f96 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 4e395c30be..12208dba1b 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 9ae6616e38..4c5fdb7683 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 725e35791f..947a663f92 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 ef66ceecd0..f6072bc953 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 43178d31b4..8e1a026415 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 76e561cfc3..42b551b3a4 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 c95fd5944e..f606120c54 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 7e616ea6ca..a3803c423b 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 04eb53ae76..9c9754aa95 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 f5232630ee..38ced59e9c 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 23129952c3..abc0212335 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 4e1cdd9b23..7640cca206 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 be224a67b4..cf6c1c3d2d 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 aa248075d5..fa5d44fb00 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 1ed3bacbbd..c2b7b23a6a 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 3176ae1c0d..775d4e8d46 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 4c2bd6f8d8..64c498b68b 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 ce0d1f14d8..8b5fa68e59 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 @@ public: }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp b/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp index a5141523b3..6e2df2a082 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 7419770946..502d576e32 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 @@ public: }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/SetAccount.cpp b/src/xrpld/app/tx/detail/SetAccount.cpp index c0e115c249..d871cc3280 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 62cae28e51..4604a11a6c 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 055143cc6f..8559c3e7b9 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 9f165612f3..92d130a15a 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 89a714342f..055748aa25 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 173107e02a..4a1ee703a0 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 35951645c2..1827aca975 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 b1e0494ba4..93abcdc4c4 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 6e5a72b306..7a5394c684 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 cab362a8e3..e5e159862a 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 2227aa9810..bd16398f56 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 e98d65fd11..9bfd6dc1d3 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 3e64c59b54..3702a30deb 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 f192126387..d11c20c610 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 a4ba3bfed2..e98269c38a 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 0c6be61040..5fa03557e5 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 2e5e927d12..82b64cc0e3 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 03b0c3d74d..615fd6a92d 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 95cc3521a9..4cb505db50 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 a3120f1b3c..52408127ec 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 e70bcf54d4..8e770352a9 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 3085ace0a3..84c0e4b01a 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 285113ebfb..47fde969a3 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 5185ded7a6..273a29d653 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 3594c9e14d..10a3a43921 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 8e8f8cc842..a701ba8859 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 35d9c7dea5..28943bd640 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 3720062fdb..fb57687df0 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 dd53c74b31..948c00a8b2 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 @@ private: 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 @@ private: 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 a0b6c6be8d..9bfacfb8d6 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. - - //! 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 that must vote yes after we are stuck - std::size_t avSTUCK_CONSENSUS_PCT = 95; + 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 required to reach agreement on ledger close time - std::size_t avCT_CONSENSUS_PCT = 75; + std::size_t const avCT_CONSENSUS_PCT = 75; + + //! 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; + + //! 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 18dcf60006..6734d59205 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 ba8e0a8b1a..ccb421abed 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 bffb100932..513f240829 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 @@ public: 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 @@ public: @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 @@ private: 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 b3ef5ee59c..434f19b081 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 582d36cbcd..c333aeaefd 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 9b1a69bf95..92117a91c4 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 c0cedcc1a4..8e29ecdcf4 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 8c6ba73032..299861e1b0 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 76d26c39e7..66048f4f21 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 06f90dd1c4..051c298251 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 43d63895d8..89532c15d9 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 29b096b7a3..29863893d9 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 458c8a0cd6..3b5f69194f 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 e57429da23..c65a0e6870 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 20f210d4e3..a741504e97 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 6a34b1db91..fb4a4aab21 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 6d49c647a6..89e4daf90e 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 17f600a4f4..d62f49ff49 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 5eb1f24d43..1ea1df51ab 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 2602c0691f..bee2a14579 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 80b08bbdfc..98fa959d6c 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 94f9098d9c..96b1f97977 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 7286f378e8..53b5944ac0 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 3645d4fbcf..3f41e382b0 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 e99e8b2976..1abff33be0 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 74ee290829..1c282565b1 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 2c27a5b659..dc58905c5a 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 fd921c63ca..ae59312f98 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 0e92d7dbca..d3a52558fd 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 c8e1911bf9..ecc618e185 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 d7299b2efb..a41a0211a2 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 cd9bcff876..fb6dcffe06 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 fb695b9a36..53e12083f3 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 aca3f9fa6d..85aa02f1b4 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 2c76b9b587..c11a72d782 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 b95e41363c..b1bac733fc 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 8b491bdcb2..3191b47cbb 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 647927ae96..1d93eae7aa 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 8cc38e4143..f9c9c80af0 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 b9b333eb8b..74b71c8324 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 f584db89e8..41a14945a6 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 0463e5de05..5d6d354688 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 619006161f..5c62d8cef8 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 745d8a90c7..3eab845472 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 b93fc4a2aa..f19eed8297 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 626a5f4743..0dab5e9464 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 85abf7fc62..1860f61445 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 be35c08246..7486d6128d 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 3b7da776ea..2a33500aa4 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 64ca2461d2..2da5ac38de 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 08fba26ff0..c8762c31fd 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 9c78bb20d2..612d80c663 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 b2a751d4a1..9730ca2dec 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 88664139f1..58c8c6c82d 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 61c2875a5f..0ead4cf0dc 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 e22a370480..7acd7f07a7 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 c91005a66d..814ea362e4 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 13bdf9119b..96f91cdcf5 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 ede42b03af..0dbf036e01 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 29f3755332..1097895416 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 c22ede8248..e1aa801c44 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 8853a6ce9a..b0768907da 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 f5a1fdb075..dd7f4c4dc7 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 236c2260ee..663db7eb74 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 a5792fe7df..5e22eb4ddf 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 aac305cea0..dc3106cc91 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 24ebffd33a..2f4e9d502e 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 47254cd50f..5aae8ca7cf 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 2034128949..0e421cd6bd 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 @@ public: 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 c48002f4f8..15ba508f64 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 7564ca60b5..4edafcddca 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 85e5d3c0da..2502d52815 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 d90f02ce87..160bf92d5e 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 c7e6c8c349..a4828ab2c2 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 fbf9f532a0..adec27a68f 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 01b167159e..a238f2b856 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 f633014b09..0e81c047c6 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 f19672b812..7bc3ab2caa 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 75d8e58a75..6ccbe68b87 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 42bda586c0..a2fd7f9c53 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 1ca78208dd..02b4709c52 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 c7437badc4..3a278a3403 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 247e53ec9f..92e2824327 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 9aff156068..7f5c858f67 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 2646b24a3e..9a5bd7136b 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 fb3add61f7..ddd6526161 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 aca6242f9d..6fb4b65643 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 8289e467e6..01d7dc597f 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 92ec09de12..b2db772f5b 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 2919922da9..0507bd4d2d 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 9d25248e8d..b4e5b6fc50 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 4bb76369c4..30763b1357 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 474ac3c069..c3e07f956a 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 8f1aae8c02..657d28072f 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 76c11b287c..37f138b88b 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 cdcf433f61..6473f30c89 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 b69a074e99..2209414d9f 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 c5cfe6274e..4112e6dfd9 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 8989f89fb3..6df9b78df8 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 23916db217..459b359ffb 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 6fd0112f46..1a2842591c 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 54f99eb73d..26c83055a3 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 0fecb301f7..9da1d6416e 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 71ab0d59d7..efdb4908f0 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 9b4fabdc34..b508970e44 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 8759e0122e..bd493d7467 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 eda7f1bb1b..7f369cdda8 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 ac210bf6b9..41d94578b0 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 6532281f3d..3476026562 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 10de99abe6..a670fb8780 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 879c6a5331..171faed945 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 1af5f0e1c9..9652d55802 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 07e8869594..4a5d95fd41 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 338bd83954..e7983471a5 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 0078ae2841..c91b27b026 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 36e9c712e3..4c30af4805 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 03d9959210..503ea0161a 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 01f38ad7fd..b3922f63b3 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 8baa2b50b9..86093fa166 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 45143a9012..e5d8b1e6c5 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 a64da7b9e7..0f388ec3bb 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 52d985a701..0c858dca85 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 f0c033c7a6..2d51dfc204 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 ad8b886d4a..a8e74e6db4 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 3a4f68d94c..fba95e8f22 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 a7d66f57ad..58df185e09 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 559bdb1743..a34faf885c 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 937486f75d..d9354471f1 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 8cac8d6317..8407d51526 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 edc5582a40..32a7cca653 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 679b16fd8a..29e3b1b9ca 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 c056ca27eb..0b5f73bcbe 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 0ce84e09ef..c65db622e7 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 032011ca77..5f72673313 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 93af859914..9a6d0e9dc8 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 7414a4b088..abdfa921bb 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 cb1a2579ec..e0fb66f6fd 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 721be65262..5054ca9cb4 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 19b33709c8..c261666eb9 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 11c7a7698f..3449a744d6 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 74171af28e..89af005292 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 b374f03588..94da34efa2 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 e5b7d9e327..a5aca59657 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 7b23c2cc13..738219b6b5 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 376a0ce24a..2a7807f8ca 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 13e963644a..406707a6a8 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 2267b9147f..1652617455 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 1990cdafd3..b312264f90 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 4b9ff7e43c..5d810d61a0 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 6c8fe28267..2d08561ec9 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 90e3a8d46e..6416309e2e 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 5170342eb9..e921eee386 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 1bdd95a74c..03ea427b12 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 86559a79f4..bc575d2d86 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 ae50401b63..26c8065edf 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 3e887ff730..ee8326a3d6 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 dccc03de5b..bede01b927 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 df2301d03e..b7056e7439 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 eb4f67e76f..81a85fd5ae 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 ce727bb400..113a2f2815 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 50aa9ef289..1bb480544d 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 75e583a352..b2c8098ad1 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 de5bdc4f6c..6d15a4d95f 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 a4287266e5..1e0fa82480 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 26f338cb4f..e8b95bd75c 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 7467b94b63..8001071f85 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 690106ebbd..9f57f08a24 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 dacf93fa91..57b43e44bd 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 dbd7eb9f1c..8784513363 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 48f024c051..943065e522 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 b5644d9910..9a18870046 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 7f1d83c17a..8927e44953 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 ad26b83b43..7bd50cc1e5 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 7298ee290d..7da99b3a76 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 486c587d7e..4015bb9fcc 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 0a1ba2b427..0e47164ad3 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 b73ee260d4..1815c8db56 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 8f79bb04f3..fed89daaf2 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 bf0a0e1e28..0fc266569e 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 b7a887b0e2..959c77d718 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 1debd48422..4d783c1d3b 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 bffb3dfbb6..52a5c69ab0 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 94830a4f39..a6007e9eab 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 83bf8b0ef2..36c14cecaf 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 6c9021ce97..29304227c2 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 f9c40ee776..aaa559895c 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 f3be0df558..33f3af27e6 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 cb0dabcb9d..e96ff19054 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 df50124088..d9a7f3484e 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 1ff2d506af..b19b948469 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 80c336004b..abe1b3b9bb 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 1cb90c0b9d..b303402e2d 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 dec18eca11..dbe80c6599 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 80f5594e1e..5a26450dbe 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 2547ef8ead..f6b068ddd3 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 7d391497f6..3c7340ece3 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 ea37a1aaa1..03e73fb6b7 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 0a3fe41923..b0ea437cf1 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 5535e37681..48ac8245e8 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 66fe89dea0..35b82edb3f 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 e81e043459..c94e95063b 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 b603e3945a..c3b3305af7 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 1122eab51c..786f7c6398 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 d8c21b3fa4..665e78f4de 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 b339453437..4edb86b7b3 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 bab0d99744..c890de593a 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 ce53f84d95..6690e7f284 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 d1a6337198..638aeb7842 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 39bc4e3647..fc24107233 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 599e76f847..4d8318d194 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 f3300b9ed0..2c9cadcbba 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 bbb22c273d..eb04df05e4 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 eed7e6294a..f792b9035f 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 c10f4eb1cb..e63245b51c 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 842c1092dd..1069c363ec 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 d2791915c3..c45621d0c1 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 2aba5d5d8e..4c9ce65469 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 d5d84d3f00..9ff46a9bb7 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 50aa193b2b..73ffe0090a 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 176553fd7d..abdca3a55a 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 b14effac88..a2ac2f99e8 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 d6b0ebce9e..6f209d13d7 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 f4d3f21e90..7444e61813 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 6ea55f4ac4..78cc919b4e 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 f59fdc9280..3eead799a3 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 bf95003aef..21dbe7469e 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 09a546be14..7c3fadbec9 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 baabd4ef13..a6c54b6f22 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 b2fba1f931..7d3c3c8fb2 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 72ec177fb3..cdf0f80a84 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 7f093dbe46..efe4f95936 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 4f93825751..092b1efc5a 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 fe5b5377ee..c50683213c 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 4853407654..beee32a945 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 0e67947a8e..bed821b5c9 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 + 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 03/47] 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 | 6503 +++++++---------------- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 118 + src/xrpld/app/misc/WasmHostFuncImpl.h | 69 + src/xrpld/app/misc/WasmVM.cpp | 849 ++- src/xrpld/app/misc/WasmVM.h | 109 +- src/xrpld/app/tx/detail/Escrow.cpp | 26 +- 11 files changed, 2625 insertions(+), 5119 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 8c3acdee07..41dcd62462 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 0cbf1b608a..fd760d07ae 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 244d683915..cf00aa81fb 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 1d6cae9ecf..bdd0f0b797 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 1f872d2bdc..0ac8bba8a0 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 31e8007c72..ce8d836269 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()); - - { - 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()); + // 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 TestLedgerDataProvider : public LedgerDataProvider + struct TestHostFunctions : public HostFunctions { Env* env; + Bytes accountID; + Bytes data; + int clock_drift = 0; public: - TestLedgerDataProvider(Env* env) : env(env) + explicit TestHostFunctions(Env* env, int cd = 0) + : env(env), clock_drift(cd) { + std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; + accountID = Bytes{s.begin(), s.end()}; + std::string t = "10000"; + data = Bytes{t.begin(), t.end()}; } int32_t - get_ledger_sqn() override + 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}; - 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); + 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 << re.value().cost << std::endl; + std::cout << "good case 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()); + + env.close(); + env.close(); + env.close(); + env.close(); + + { // 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 << "bad case (current time < escrow_finish_after " + "time) result " + << re.value().result << " cost: " << re.value().cost + << std::endl; + } + } + + { // 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 0000000000..9ecbe22f31 --- /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 0000000000..a311073d7b --- /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 d94135646b..22ac65479f 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)); - } - - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(FuncName); - if (ok) - return re; - else - return Unexpected(tecFAILED_PROCESSING); + out[0] = WasmEdge_ValueGenI32(((HostFunctions*)data)->getLedgerSqn()); + return WasmEdge_Result_Success; } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& accountID) +WasmEdge_Result +getParentLedgerTime( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value*, + WasmEdge_Value* out) { - auto dataLen = (int32_t)accountID.size(); - // printf("accountID size: %d\n", dataLen); - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + out[0] = + WasmEdge_ValueGenI32(((HostFunctions*)data)->getParentLedgerTime()); + return WasmEdge_Result_Success; +} - 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) +Expected +getParameterData( + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + size_t index) +{ + 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); + return fname; + } + else + { + return Unexpected(Res); + } +} - 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); +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()); + } +} - ok = WasmEdge_ResultOK(setRes); - if (ok) +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)) { - // 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)); - } + return WasmEdge_ValueGetI32(allocReturns[0]); } else { - printf( - "Set error message: %s\n", WasmEdge_ResultGetMessage(setRes)); + return 0; } - } - 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) + auto dataLen = (int32_t)data.size(); + auto dataPtr = alloc(dataLen); + auto retPtr = alloc(8); + if (dataPtr && retPtr) { - 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 mem = WasmEdge_CallingFrameGetMemoryInstance(fm, 0); + auto res = + WasmEdge_MemoryInstanceSetData(mem, data.data(), dataPtr, dataLen); + 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)) + unsigned char intBuf[8]; // little-endian + for (size_t i = 0; i < 4; ++i) { - return pointer; + intBuf[i] = (dataPtr >> (i * 8)) & 0xFF; + } + for (size_t i = 0; i < 4; ++i) + { + intBuf[i + 4] = (dataLen >> (i * 8)) & 0xFF; + } + + res = WasmEdge_MemoryInstanceSetData(mem, intBuf, retPtr, 8); + if (WasmEdge_ResultOK(res)) + { + return WasmEdge_ValueGenI32(retPtr); } } - - 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); } + return Unexpected(WasmEdge_Result_Fail); } WasmEdge_Result -get_ledger_sqn( +getTxField( 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 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; } -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( +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(5); + 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 +WasmEdge_Result +getCurrentLedgerEntryField( + 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)->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; +} + +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(); + + if (((HostFunctions*)data)->updateData(fname.value())) + return WasmEdge_Result_Success; + else + return WasmEdge_Result_Fail; +} + +WasmEdge_Result +computeSha512HalfHash( + void* data, + 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) +{ + 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 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); + // module + WasmEdge_String libName = WasmEdge_StringCreateByCString("host_lib"); + WasmEdge_ModuleInstanceContext* hostMod = + WasmEdge_ModuleInstanceCreate(libName); + WasmEdge_StringDelete(libName); - WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); - WasmEdge_ModuleInstanceContext* HostMod = - WasmEdge_ModuleInstanceCreate(HostName); - WasmEdge_StringDelete(HostName); + // 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 HostFuncName = - WasmEdge_StringCreateByCString("constInt"); - WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); - WasmEdge_StringDelete(HostFuncName); + 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 37988a97e3..d1e14e4246 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); +typedef std::vector Bytes; +typedef ripple::uint256 Hash; -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& accountID); +template +struct WasmResult +{ + T result; + uint64_t cost; +}; +typedef WasmResult EscrowResult; -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 +struct HostFunctions { virtual int32_t - get_ledger_sqn() + getLedgerSqn() { return 1; } - virtual ~LedgerDataProvider() = default; + 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 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, - 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); + 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 165a6df5f4..89eace193a 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 04/47] 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 0ac8bba8a0..6c0e32179e 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 16bb966317..8a5e30a001 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -372,6 +372,32 @@ public: } }; +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 ebc2834109..b2c0007dc7 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 9ecbe22f31..fe1b02a53b 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 d1e14e4246..796c1ee6bb 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 89eace193a..055fbc1499 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 05/47] 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 7affa212ab..6da6841052 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 a89bd4e486..1a1ecacb36 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 4f544963f0..caf05daf76 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 2d4a3453ea..08849f0fa6 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 42a706c4de..65a4bfcbc1 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 19c31d439b..f9d70ea6db 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 fa34cf800b..96aefb0788 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 948a47f0ac..3a9d16445e 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 3766f33c54..6a2387035b 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 6c0e32179e..6b25da6363 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 73bb539a22..8e333b27ea 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 1101f56c69..0ba7b0e5ba 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 8a5e30a001..b77b00b00c 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -398,6 +398,23 @@ public: } }; +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 b94c79ccb8..ab0969c6cb 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 d3c59fbeb6..d9a0dce151 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 e312ab042f..6c6e2f0865 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 b721c80bfd..049a47bc23 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 e40e61ff94..7d84e003fb 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 055fbc1499..ab91274326 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 8e29ecdcf4..4b297c8610 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 fb4a4aab21..97d6d5fd9d 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 06/47] 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 084f41db85..b62f5e54e5 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 07/47] 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 fe1b02a53b..0383b15662 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 a311073d7b..aa42f79ff6 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -54,12 +54,31 @@ public: 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 22ac65479f..1764734db3 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 796c1ee6bb..b0839dc76d 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 08/47] 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 81f1f9724e..da62a590c1 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 09/47] 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 da62a590c1..52a077615f 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 10/47] 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 | 810 +++------------------ src/xrpld/app/misc/WasmVM.h | 249 ++++++- 18 files changed, 2454 insertions(+), 829 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 afce1557d3..c251daa936 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 d9a67a63e9..2ea9b32544 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 fd985dce81..d348f2d670 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 28cfd2322a..702cb41a0a 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 d4ff75434e..ec56323926 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 d49f45903e..a0b1602daa 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 0000000000..6c49946eca --- /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 0000000000..d54bb6f98f --- /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 0000000000..7cc3544b68 --- /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 6b25da6363..75467fc7c8 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 ce8d836269..a46d71a569 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 0000000000..a92d8e463e --- /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 0000000000..113fcf8886 --- /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 aa42f79ff6..e1943244e7 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 0000000000..d893a93889 --- /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 0000000000..c3f5bb11a9 --- /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 1764734db3..d786cae7fb 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 + +#include namespace ripple { -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; -} - -Expected -getParameterData( - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - size_t index) -{ - 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); - } -} - -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()); - } -} - -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; - } - }; - - 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; - } - - res = WasmEdge_MemoryInstanceSetData(mem, intBuf, retPtr, 8); - if (WasmEdge_ResultOK(res)) - { - return WasmEdge_ValueGenI32(retPtr); - } - } - } - return Unexpected(WasmEdge_Result_Fail); -} - -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) -{ - 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) -{ - 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; -} - -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, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - 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; -} - -WasmEdge_Result -computeSha512HalfHash( - void* data, - 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) -{ - 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 runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, + Bytes const& wasmCode, + std::string_view 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); + auto& vm = WasmEngine::instance(); + vm.initGas(gasLimit); + vm.initMaxPages(MAX_PAGES); - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(conf, NULL); - WasmEdge_StatisticsContext* StatCxt = - WasmEdge_VMGetStatisticsContext(VMCxt); - WasmEdge_StatisticsSetCostLimit(StatCxt, gasLimit); + std::vector imports; - { // register host function - // module - WasmEdge_String libName = WasmEdge_StringCreateByCString("host_lib"); - WasmEdge_ModuleInstanceContext* hostMod = - WasmEdge_ModuleInstanceCreate(libName); - WasmEdge_StringDelete(libName); + 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) - // 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); + 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); - 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); + return EscrowResult{static_cast(ret.value()), spent}; } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +WasmEngine::WasmEngine() : impl(std::make_unique()) +{ +} + +WasmEngine& +WasmEngine::instance() +{ + static WasmEngine e; + return e; +} + +Expected +WasmEngine::run( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params) +{ + return impl->run(wasmCode, funcName, imports, params); +} + +std::int64_t +WasmEngine::initGas(std::int64_t def) +{ + return impl->initGas(def); +} + +std::int32_t +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); +} + } // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index b0839dc76d..b383bba37d 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 11/47] 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 6da6841052..bd2b044c4c 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 ab0969c6cb..79643a8bb9 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 4b297c8610..c1b143b799 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 12/47] 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 7cc3544b68..a2abf37a57 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 a92d8e463e..a781aadea9 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 d786cae7fb..46267d55b5 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 13/47] 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 94e71cfdcf..4e39ac298f 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 a46d71a569..5c9c0afc9c 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 0000000000..1d377676c6 --- /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 46267d55b5..a61b4f73cb 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 e6ef682e49..fd90b48d70 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 14/47] 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 | 107 +++++++++++++++++++++++--- 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, 213 insertions(+), 69 deletions(-) diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index d54bb6f98f..ae83e8c13c 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 @@ class WamrConan(ConanFile): 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 5c9c0afc9c..7f54a636cc 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 a781aadea9..4ed47a2ffb 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 void -print_wasm_error(const char* message, wasm_trap_t* trap) +static log_level_t +getLogLevel(beast::severities::Severity severity) { - fprintf(stderr, "WAMR error: %s\n", message); + 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, beast::Journal j) +{ + 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 113fcf8886..a5b8051cb1 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 @@ public: 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 e1943244e7..f2f70ee558 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 @@ public: { } + 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 a61b4f73cb..8e77bc027b 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 b383bba37d..25079861b9 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 @@ public: 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 15/47] 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 0000000000..1ed246f252 --- /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 1d377676c6..e7bada74a5 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 -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 ledgerSqnHex; -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 allHostFunctionsHex; + +extern std::string const deepRecursionHex; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index f2f70ee558..b87c23a4a8 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 @@ private: }; } // 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 16/47] 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 8e77bc027b..6185826826 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 17/47] 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 6185826826..8e77bc027b 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 18/47] 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 02fde2ffe5..eb594fcc57 100644 --- a/include/xrpl/protocol/TxMeta.h +++ b/include/xrpl/protocol/TxMeta.h @@ -46,10 +46,7 @@ private: 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 @@ public: void setParentBatchId(uint256 const& parentBatchId) { - mParentBatchId = parentBatchId; + parentBatchId_ = parentBatchId; } uint256 @@ -145,13 +142,33 @@ public: 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 @@ private: 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 faeff4ebb2..155d0e8663 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 2083fc8eaf..fb703d9435 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 c326f8c996..df505b317b 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 720d0aeea3..a3bdf9a85a 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -106,6 +106,13 @@ public: 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 375a77022c..42e67621e7 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 d170cf71ff..f7e90b9d54 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -75,6 +75,12 @@ public: deliver_ = amount; } + void + setGasUsed(std::uint32_t const& gasUsed) + { + gasUsed_ = gasUsed; + } + /** Get the number of modified entries */ std::size_t @@ -93,6 +99,7 @@ public: 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 2a740093d9..039088205b 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 5a2e0bcf54..896705042f 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.h +++ b/src/xrpld/ledger/detail/ApplyStateTable.h @@ -73,6 +73,7 @@ public: 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 3fd9478b54..a90fc3fcbb 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 19/47] 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 | 458 +- src/xrpld/app/misc/WamrVM.h | 151 +- src/xrpld/app/misc/WasmHostFunc.h | 224 + src/xrpld/app/misc/WasmHostFuncImpl.cpp | 555 +- src/xrpld/app/misc/WasmHostFuncImpl.h | 111 +- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 801 +- src/xrpld/app/misc/WasmHostFuncWrapper.h | 159 +- src/xrpld/app/misc/WasmParamsHelper.h | 269 + src/xrpld/app/misc/WasmVM.cpp | 145 +- src/xrpld/app/misc/WasmVM.h | 313 +- src/xrpld/app/tx/detail/Escrow.cpp | 3 +- 16 files changed, 13722 insertions(+), 1944 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 898fd06fbd..ab95017db1 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 df505b317b..52abf61fc6 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 16e7f67d99..3156a98a86 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 1ed246f252..7dbc4fdc2f 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 e7bada74a5..acf2de906e 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 3cc18fdea8..fb1852bd00 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,43 +230,36 @@ 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; + + j_ = o.j_; 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* +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 (!export_types.size) - throw std::runtime_error("WAMR: no export"); - if (export_types.size != exports.size) - throw std::runtime_error("WAMR: invalid export"); + if (!mod_inst) + throw std::runtime_error("WAMR no module instance"); - for (unsigned i = 0; i < export_types.size; ++i) + 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.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,6 +352,32 @@ ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) *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)) + , export_types{0, nullptr, 0, 0, nullptr} + , j_(j) +{ + wasm_module_exports(module.get(), &export_types); + if (instantiate) + { + auto wimports = buildImports(s, imports); + addInstance(s, maxPages, gas, wimports); + } +} + +ModuleWrapper::~ModuleWrapper() +{ + if (export_types.size) + wasm_exporttype_vec_delete(&export_types); +} + ModuleWrapper& ModuleWrapper::operator=(ModuleWrapper&& o) { @@ -308,36 +390,11 @@ ModuleWrapper::operator=(ModuleWrapper&& o) 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; + j_ = o.j_; + 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; @@ -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 a5b8051cb1..635673fb9b 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; + 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}; return *this;} - //operator wasm_val_vec_t &() {return r;} + 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 @@ private: 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 @@ public: 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 @@ public: 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 @@ public: 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 @@ public: 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 @@ private: 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 0000000000..1d1f4d011b --- /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 6450647809..1da8c38a2d 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 - -std::optional -WasmHostFunctionsImpl::getTxField(std::string const& fname) +Hash +WasmHostFunctionsImpl::getParentLedgerHash() { - 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; + return ctx.view().info().parentHash; } -std::optional -WasmHostFunctionsImpl::getLedgerEntryField( - int32_t type, - Bytes const& kdata, - std::string const& fname) +int32_t +WasmHostFunctionsImpl::cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) { - auto kl = [&]() -> std::optional { - if (type == ltACCOUNT_ROOT) + 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; + } + else + --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); +} + +static Expected +locateField(STObject const* obj, Slice const& loc) +{ + 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) { - std::string s(kdata.begin(), kdata.end()); - auto const account = parseBase58(s); - if (account) - { - return keylet::account(account.value()); - } + 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); } - return std::nullopt; - }(); + else 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); - 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; - } - - Slice const s = (*jv)[sfURI]; - return Bytes{s.begin(), s.end()}; + auto const* field = r.value(); + return getAnyFieldData(*field); } -bool +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(); + + return sz; +} + +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.begin(), keylet.end()}; + return Bytes{keylet.key.begin(), keylet.key.end()}; } -std::optional -WasmHostFunctionsImpl::escrowKeylet( - std::string const& account, - std::uint32_t const& seq) +Expected +WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, 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()}; + 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 +Expected WasmHostFunctionsImpl::oracleKeylet( - std::string const& account, - std::uint32_t const& documentId) + AccountID const& account, + 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()}; + 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()}; } + +Expected +WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) +{ + if (!account || !nftId) + return Unexpected(HF_ERR_INVALID_PARAMS); + + 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()); +} + +int32_t +WasmHostFunctionsImpl::trace( + std::string const& msg, + Bytes const& data, + bool asHex) +{ +#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 + { + auto const hex = + boost::algorithm::hex(std::string(data.begin(), data.end())); + j << hex; + } + + 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 + + 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 b87c23a4a8..091ca24934 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 @@ public: int32_t getParentLedgerTime() override; - std::optional - getTxField(std::string const& fname) override; + Hash + getParentLedgerHash() override; - std::optional - getLedgerEntryField( - int32_t type, - Bytes const& kdata, - std::string const& fname) override; + int32_t + cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override; - std::optional - getCurrentLedgerEntryField(std::string const& fname) override; + Expected + getTxField(SField const& fname) override; - std::optional - getNFT(std::string const& account, std::string const& nftId) override; + Expected + getCurrentLedgerObjField(SField const& fname) override; - bool + 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; + + 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 543350a7c1..e4196263d6 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,65 +128,57 @@ 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); } -} -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; + uint256 const key(uint256::fromVoid(r->data())); + int32_t const idx = + hf->cacheLedgerObj(keylet::unchecked(key), params->data[2].of.i32); + RET(idx); } wasm_trap_t* @@ -111,224 +187,300 @@ getTxField_wrap( 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->getTxField(fname); if (!fieldData) - return reinterpret_cast(vm.newTrap("Field not found")); + { + RET(fieldData.error()); + } - 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; + RET(setData( + rt, + params->data[1].of.i32, + params->data[2].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -getLedgerEntryField_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()); - int32_t const type = params->data[0].of.i32; - auto lkData = getParameterData(params, 1); - if (!lkData) - 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 fname = getFieldName(params, 3); - if (!fname) - return reinterpret_cast(vm.newTrap()); - - auto fieldData = - hf->getLedgerEntryField(type, lkData.value(), fname.value()); + auto fieldData = hf->getCurrentLedgerObjField(fname); 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[1].of.i32, + params->data[2].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -getCurrentLedgerEntryField_wrap( +getLedgerObjField_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[1].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); - auto fieldData = hf->getCurrentLedgerEntryField(fname.value()); + auto fieldData = hf->getLedgerObjField(params->data[0].of.i32, fname); if (!fieldData) - return reinterpret_cast(vm.newTrap()); + { + RET(fieldData.error()); + } - 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; + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -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 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( +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 account = getFieldName(params, 0); - if (!account) - 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 keylet = hf->accountKeylet(account.value()); - if (!keylet) - return reinterpret_cast(vm.newTrap()); + auto fieldData = hf->getTxNestedField(makeSlice(r.value())); + if (!fieldData) + { + RET(fieldData.error()); + } - 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; + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -credentialKeylet_wrap( +getCurrentLedgerObjNestedField_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[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - auto issuer = getFieldName(params, 2); - if (!issuer) - return reinterpret_cast(vm.newTrap()); + auto fieldData = hf->getCurrentLedgerObjNestedField(makeSlice(r.value())); + if (!fieldData) + { + RET(fieldData.error()); + } - 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; + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -escrowKeylet_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 account = getFieldName(params, 0); - if (!account) - 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()); + } - int32_t const sequence = params->data[2].of.i32; + auto fieldData = hf->getLedgerObjNestedField( + params->data[0].of.i32, makeSlice(r.value())); + if (!fieldData) + { + RET(fieldData.error()); + } - 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; + RET(setData( + rt, + params->data[3].of.i32, + params->data[4].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -oracleKeylet_wrap( +getTxArrayLen_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& 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 documentId = params->data[2].of.i32; + int32_t sz = hf->getTxArrayLen(fname); + RET(sz); +} - auto keylet = hf->escrowKeylet(account.value(), documentId); - if (!keylet) - return reinterpret_cast(vm.newTrap()); +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* rt = reinterpret_cast(hf->getRT()); - auto pointer = setData(keylet.value()); - if (!pointer) - 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); - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return nullptr; + int32_t sz = hf->getCurrentLedgerObjArrayLen(fname); + RET(sz); +} + +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 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); + + int32_t sz = hf->getLedgerObjArrayLen(params->data[0].of.i32, fname); + RET(sz); +} + +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* 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()); + } + + int32_t sz = hf->getTxNestedArrayLen(makeSlice(r.value())); + RET(sz); +} + +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 const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } + + int32_t sz = hf->getCurrentLedgerObjNestedArrayLen(makeSlice(r.value())); + RET(sz); +} + +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* rt = reinterpret_cast(hf->getRT()); + + auto const r = getData(rt, params->data[1].of.i32, params->data[2].of.i32); + if (!r) + { + RET(r.error()); + } + + int32_t sz = hf->getLedgerObjNestedArrayLen( + params->data[0].of.i32, makeSlice(r.value())); + RET(sz); } wasm_trap_t* @@ -337,17 +489,21 @@ updateData_wrap( 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()); + if (params->data[1].of.i32 > maxWasmDataLength) + { + RET(HF_ERR_DATA_FIELD_TOO_LARGE) + } - if (!hf->updateData(fname.value())) - 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()); + } - return nullptr; + RET(hf->updateData(r.value())); } wasm_trap_t* @@ -356,37 +512,238 @@ computeSha512HalfHash_wrap( 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 r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - 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; + auto const hash = hf->computeSha512HalfHash(r.value()); + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + hash.data(), + hash.size())); } wasm_trap_t* -print_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) { - auto& vm = WasmEngine::instance(); - // auto* hf = reinterpret_cast(env); + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - 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 const acc = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!acc) + { + RET(acc.error()); + } + + auto const k = hf->accountKeylet(acc.value()); + if (!k) + { + RET(k.error()); + } + + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + k->data(), + k->size())); +} + +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* rt = reinterpret_cast(hf->getRT()); + + auto const subject = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!subject) + { + RET(subject.error()); + } + + auto const issuer = + getDataAccount(rt, params->data[2].of.i32, params->data[3].of.i32); + if (!issuer) + { + RET(issuer.error()); + } + + auto const credType = + getData(rt, params->data[4].of.i32, params->data[5].of.i32); + if (!credType) + { + RET(credType.error()); + } + + auto const k = + hf->credentialKeylet(subject.value(), issuer.value(), credType.value()); + if (!k) + { + RET(k.error()); + } + + RET(setData( + rt, + params->data[6].of.i32, + params->data[7].of.i32, + k->data(), + k->size())); +} + +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* 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 k = hf->escrowKeylet(acc.value(), params->data[2].of.i32); + if (!k) + { + RET(k.error()); + } + + RET(setData( + rt, + params->data[3].of.i32, + params->data[4].of.i32, + k->data(), + k->size())); +} + +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* 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 k = hf->oracleKeylet(acc.value(), params->data[2].of.i32); + if (!k) + { + RET(k.error()); + } + + RET(setData( + rt, + params->data[3].of.i32, + params->data[4].of.i32, + k->data(), + k->size())); +} + +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 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 d63db3d505..ac0cb88e49 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); - -using accountKeylet_proto = uint32_t*(char const*, int32_t); -wasm_trap_t* -accountKeylet_wrap( +getTxNestedField_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 getCurrentLedgerObjNestedField_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -credentialKeylet_wrap( +getCurrentLedgerObjNestedField_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 getLedgerObjNestedField_proto = + int32_t(int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -escrowKeylet_wrap( +getLedgerObjNestedField_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 getTxArrayLen_proto = int32_t(int32_t); wasm_trap_t* -oracleKeylet_wrap( +getTxArrayLen_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using updateData_proto = void(uint8_t const*, int32_t); +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 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* -print_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 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* +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 0000000000..af2db08ebc --- /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 8e77bc027b..dbfcfe549c 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) + if (hfs) + { + // TODO: remove after escrow_test wasm module will be updated + WASM_IMPORT_FUNC2(imports, getLedgerSqnOld, "getLedgerSqn", hfs); - std::int64_t const sgas = gasLimit; // vm.getGas(); - auto ret = vm.run(wasmCode, funcName, imports, {}, hfs->getJournal()); + 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 74e700883d..b12d7ecc7e 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 @@ public: 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 42e67621e7..75bc54c2bc 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 20/47] 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 52abf61fc6..49d7fb216d 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 7dbc4fdc2f..10330f93bf 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 acf2de906e..308c2668bd 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 1da8c38a2d..9e2ec00d18 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 21/47] 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 3f89f430ed..d052415f9f 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 22/47] 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 fb1852bd00..8f7c9b1c36 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 9e2ec00d18..6c19db6dc4 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 e4196263d6..b654c16aa5 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 23/47] 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 | 510 ++++++++++++---------- src/test/app/Wasm_test.cpp | 371 +++++++++------- src/xrpld/app/misc/WamrVM.cpp | 16 +- src/xrpld/app/misc/WamrVM.h | 4 +- src/xrpld/app/misc/WasmParamsHelper.h | 5 +- 10 files changed, 516 insertions(+), 403 deletions(-) diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index c251daa936..4f7e238333 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 76597a68e0..3b95fbe1d8 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 cc9ce866ec..01c7ccfc9b 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 6c49946eca..b145981630 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 ae83e8c13c..1fa3281c1e 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -13,7 +13,7 @@ required_conan_version = ">=1.55.0" 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 @@ class WamrConan(ConanFile): 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 @@ class WamrConan(ConanFile): 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 a2abf37a57..e9ca69338f 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; - - #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..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() - } #endif -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ -+void -+wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, + 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 +--- a/core/iwasm/common/wasm_exec_env.h ++++ b/core/iwasm/common/wasm_exec_env.h +@@ -89,7 +89,8 @@ 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 +diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c +index dcee0aea..2559be21 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() + #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 - - #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,20 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) - #endif +@@ -1569,13 +1569,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) } -+#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; - 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; + #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 CHECK_INSTRUCTION_LIMIT() (void)0 #endif -@@ -6859,6 +6890,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -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 +- int instructions_left = -1; ++ int64 instructions_left = INT64_MAX; ++ int64 const *instructions_schedule = NULL; + 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, 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; +@@ -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, 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; + + #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: diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 3156a98a86..c5bd2278df 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 @@ public: clock_drift_; } + Hash + getParentLedgerHash() override + { + return env_.current()->info().parentHash; + } + virtual int32_t cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override { @@ -238,29 +153,6 @@ public: 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 { @@ -280,24 +172,97 @@ public: 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 { @@ -307,6 +272,49 @@ public: 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 @@ public: } }; +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 8f7c9b1c36..b44c4bac2e 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 635673fb9b..57c65504e1 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 af2db08ebc..224d7431d3 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 24/47] 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 e9ca69338f..5a41b125b7 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 25/47] 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 d052415f9f..197fab8aaa 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 c5bd2278df..19b7946f5b 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 @@ public: } }; +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 10330f93bf..146c4338a0 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 308c2668bd..d1c689a016 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 b44c4bac2e..cefee723f5 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 6c19db6dc4..71236034af 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[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 (!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()) + 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 b654c16aa5..9b5968c31d 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 26/47] 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 aa838a736e..9fd73520d5 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 85b0d70259..35cf23d50e 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 197fab8aaa..23b2c29c78 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 19b7946f5b..52d3083561 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 cefee723f5..9ad697b1c1 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 57c65504e1..3be35c673e 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 @@ public: 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 @@ private: 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 @@ public: 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 @@ private: 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 @@ private: 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 dbfcfe549c..b21007b9d8 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 b12d7ecc7e..7c68a18696 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -65,6 +65,14 @@ public: 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 6f52d1a4f2..7639b4efa0 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 27/47] chore: Clear CODEOWNERS (#5528) --- .github/CODEOWNERS | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index bc4fe2febd..24620f8d7c 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 28/47] 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 1d1f4d011b..86eb174451 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 71236034af..7c804f376d 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); + return Unexpected(HF_ERR_EMPTY_SLOT); + return getAnyFieldData(cache[cacheIdx]->peekAtPField(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 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 9b5968c31d..0e1f886259 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 29/47] 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 d4824fe1a0..50aea4c7dc 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 30/47] 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 23b2c29c78..00a5302913 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 7639b4efa0..e9a7c78c7f 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 31/47] 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 5a41b125b7..5e09eec8df 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 ab95017db1..e4592d4889 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 00a5302913..1ade21eb59 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 52d3083561..e5d0a9f29f 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 0e1f886259..0c50273362 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 b21007b9d8..3f7d61c349 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) { - // TODO: remove after escrow_test wasm module will be updated - WASM_IMPORT_FUNC2(imports, getLedgerSqnOld, "getLedgerSqn", hfs); + // clang-format off - 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); + // 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); + 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 7c68a18696..c4db2fedd5 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -86,6 +86,9 @@ public: //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +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 32/47] 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 | 909 +-------------------- 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 | 827 +++++++++++-------- 9 files changed, 1531 insertions(+), 1428 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 2ee9e5f1f3..93bb57a081 100644 --- a/src/test/app/AMM_test.cpp +++ b/src/test/app/AMM_test.cpp @@ -7480,7 +7480,7 @@ private: 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 0000000000..680ec03896 --- /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 ccac0e2819..24a951c83c 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 e5d0a9f29f..6c77706b8b 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 @@ public: { } - 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 -{ - 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 + testGetDataHelperFunctions() + { + testcase("getData helper functions"); + BEAST_EXPECT(testGetDataIncrement()); + } + 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 9ad697b1c1..64759ff8d0 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 86eb174451..b507d6fe69 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 7c804f376d..6c7ae43d91 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 091ca24934..58bf4c194a 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -57,83 +57,83 @@ public: 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 0c50273362..f1de9b2235 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); + auto const r = getDataSlice(rt, params, i); + if (!r) + { + return Unexpected(r.error()); + } + + if (r->size() != uint256::bytes) + { + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + return uint256::fromVoid(r->data()); +} + +template +Expected +getDataAccountID(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +{ + auto const r = getDataSlice(rt, params, i); if (!r || (r->size() != AccountID::bytes)) - return Unexpected(HF_ERR_INVALID_PARAMS); + return Unexpected(HostFunctionError::INVALID_PARAMS); return AccountID::fromVoid(r->data()); } -static Expected -getDataString(InstanceWrapper const* rt, int32_t src, int32_t ssz) +template +Expected +getDataString(IW const* rt, wasm_val_vec_t const* params, int32_t& i) { - if (src < 0 || ssz <= 0) - return Unexpected(HF_ERR_INVALID_PARAMS); - - 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_POINTER_OUT_OF_BOUNDS); - - std::string data(mem.p + src, mem.p + src + ssz); - return data; + auto const r = getDataSlice(rt, params, i); + if (!r) + return Unexpected(r.error()); + return std::string_view( + reinterpret_cast(r->data()), r->size()); } -#define RET(x) \ - results->data[0] = WASM_I32_VAL(x); \ - results->num_elems = 1; \ +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( + 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()) + 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->getTxField(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->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); - } - auto const& fname(*it->second); - - auto fieldData = hf->getCurrentLedgerObjField(fname); - if (!fieldData) - { - 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->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); - } - auto const& fname(*it->second); - - auto fieldData = hf->getLedgerObjField(params->data[0].of.i32, fname); - if (!fieldData) - { - RET(fieldData.error()); + return hfResult(results, cache.error()); } - RET(setData( - rt, - params->data[2].of.i32, - params->data[3].of.i32, - fieldData->data(), - fieldData->size())); + auto const fname = getDataSField(rt, params, index); + if (!fname) + { + return hfResult(results, fname.error()); + } + + 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) { - RET(HF_ERR_INVALID_FIELD); + return hfResult(results, cache.error()); } - auto const& fname(*it->second); - int32_t sz = hf->getLedgerObjArrayLen(params->data[0].of.i32, fname); - RET(sz); + auto const fname = getDataSField(rt, params, index); + if (!fname) + { + return hfResult(results, fname.error()); + } + + 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) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(HF_ERR_DATA_FIELD_TOO_LARGE) + return hfResult(results, bytes.error()); } - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) - { - RET(r.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) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(HF_ERR_DATA_FIELD_TOO_LARGE); + return hfResult(results, bytes.error()); } - - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) - { - RET(r.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()); + return hfResult(results, acc.error()); } - auto const k = hf->accountKeylet(acc.value()); - if (!k) - { - RET(k.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 e = hf->trace(msg.value(), data.value(), params->data[4].of.i32); - RET(e); + auto const asHex = getDataInt32(rt, params, index); + if (!asHex) + { + return hfResult(results, asHex.error()); + } + + 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 e = hf->traceNum(msg.value(), params->data[2].of.i64); - RET(e); + 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; + } + + 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 33/47] 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 | 292 ++++++++++++++++++++- 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, 945 insertions(+), 17 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 1ade21eb59..b3409ed14f 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 146c4338a0..c2dab9252a 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 d1c689a016..aa560580ff 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 b5c59f3d29..d56c297b0a 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 b507d6fe69..00f89a4ac7 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 6c7ae43d91..e35af622d4 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 58bf4c194a..a22097ed6b 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -114,17 +114,55 @@ public: 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 f1de9b2235..c2b321e85a 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, @@ -705,7 +818,43 @@ escrowKeylet_wrap( } wasm_trap_t* -oracleKeylet_wrap( +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) @@ -725,8 +874,147 @@ oracleKeylet_wrap( { return hfResult(results, seq.error()); } + return returnResult( - rt, params, results, hf->oracleKeylet(*acc, *seq), index); + 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, + 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 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->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 ac0cb88e49..93b681009d 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 3f7d61c349..c9badfe460 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 e9a7c78c7f..a82aa39999 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 34/47] 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 b3409ed14f..a92fac57eb 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 680ec03896..6a17738049 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 @@ public: #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 @@ public: #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 6c77706b8b..d03135ae65 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 c2dab9252a..48b0d20b73 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 aa560580ff..97b2236d1b 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 e35af622d4..152c946c7c 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 c2b321e85a..9fae700988 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 93b681009d..2259771632 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 c9badfe460..0b94150db2 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 35/47] 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 8acd90eeff..b21d912f44 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 dc895285f9..d404a0fec2 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 254850f26a..369e4869d4 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 19f056dc1d..9a4eccbdce 100644 --- a/conanfile.py +++ b/conanfile.py @@ -193,6 +193,7 @@ class Xrpl(ConanFile): '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 1fa3281c1e..f391ea4350 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 @@ class WamrConan(ConanFile): 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 @@ class WamrConan(ConanFile): 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 ab2e9a993d..3fdccae9ee 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 f70621fa4e..048e54805e 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 36/47] 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 9fae700988..23b89af3d3 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 37/47] 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 64759ff8d0..3f0bd1d95f 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 38/47] 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 b3a6a77bcb..e5c584d1eb 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 5e09eec8df..76a2057cc9 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 39/47] 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 7485605d95..30058fd503 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 418dc38326..f060d530aa 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 3b9c83a014..23200ae007 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 cdf646e0f8..54b50c80ef 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 615012dba4..8be8f906a5 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 a822b1937f..52cffd7a5c 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 31c38f23b1..fce4e94048 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 f88d5acc27..586f486872 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 f46fea8e6e..6ed45777f0 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 4424d7619d..a04e62b723 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 0fc266569e..a93d010706 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 40/47] 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 3fdccae9ee..93a37d8103 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 6a17738049..45de5d7b93 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -69,9 +69,7 @@ public: 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 @@ public: 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 @@ public: 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 @@ public: 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 d03135ae65..5eee6014e5 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 48b0d20b73..bddb076df9 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 97b2236d1b..b82b9aadcf 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 23b89af3d3..a3a6f858c9 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 @@ public: }; 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 41/47] 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 0000000000..5a4b244174 --- /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 152c946c7c..7dce3b865a 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); + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::EMPTY_SLOT); - - 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 a22097ed6b..1fdfbbb20d 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 42/47] 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 9ee05bfb45..eb28721ec3 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 f43288b57b..50583cc290 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 45de5d7b93..0752d6f6f4 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 @@ public: #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 5eee6014e5..98e06a8636 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 bddb076df9..d01835988a 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 b82b9aadcf..3ffb41caf9 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 00f89a4ac7..84e3882cc0 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 7dce3b865a..d8f452159a 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 1fdfbbb20d..e23df2c6ec 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -190,6 +190,42 @@ public: 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 a3a6f858c9..d9488c3b4e 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 @@ public: } }; -namespace test { - // LCOV_EXCL_START bool testGetDataIncrement() diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h index 2259771632..6bad18b368 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 0b94150db2..9194943737 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 43/47] 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 93a37d8103..d77de860fd 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 79cbb7f40d..ff31662494 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 a3bdf9a85a..5334bdabcb 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -108,9 +108,9 @@ public: /** 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 @@ private: // 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 f7e90b9d54..cf494217f4 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -76,7 +76,7 @@ public: } 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 44/47] 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 2a66f7dc76..a1a46c7e35 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 4a41493558..f838f08338 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 e759b2edc8..e2d0ae370f 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 0ea3c12e62..7534e539de 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 898cfe74d7..abffa32f3e 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 b145981630..d475ad987c 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 f391ea4350..eed674adef 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -14,7 +14,7 @@ required_conan_version = ">=1.55.0" 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 @@ class WamrConan(ConanFile): 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 76a2057cc9..9749d475da 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 45/47] 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 0752d6f6f4..562d2091a0 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 @@ public: 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 @@ public: 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 @@ public: 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 5a4b244174..2f19b7dc30 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( - nftResult.error() == - HostFunctionError::LEDGER_OBJ_NOT_FOUND); + result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); } { - auto nftResult = hfs.getNFT(alice.id(), nftId2); - if (BEAST_EXPECT(!nftResult.has_value())) + auto const result = hfs.getNFT(alice.id(), nftId2); + if (BEAST_EXPECT(!result.has_value())) BEAST_EXPECT( - nftResult.error() == HostFunctionError::FIELD_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 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); } } @@ -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 d01835988a..eb3e894d91 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 84e3882cc0..cd1848a522 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 d8f452159a..4adb99a447 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 e23df2c6ec..a6051bb1c7 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -84,6 +84,21 @@ public: 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 @@ public: 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 @@ public: 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 d9488c3b4e..6fb7b0c58c 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 6bad18b368..aac8ba387e 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 9194943737..49990dfb99 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 46/47] 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 | 88 +++++++++++++++------ 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, 281 insertions(+), 31 deletions(-) diff --git a/include/xrpl/protocol/SField.h b/include/xrpl/protocol/SField.h index 777cfa02ba..5d0215102a 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 b259638774..f86d302348 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 6cd083ef85..19d4bc714d 100644 --- a/include/xrpl/protocol/STObject.h +++ b/include/xrpl/protocol/STObject.h @@ -231,6 +231,10 @@ public: 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 @@ public: 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 eb594fcc57..6b1c24e9eb 100644 --- a/include/xrpl/protocol/TxMeta.h +++ b/include/xrpl/protocol/TxMeta.h @@ -161,7 +161,8 @@ public: 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 @@ public: 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 @@ private: 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 d5f98ca999..1fcf1da622 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 a90e21491c..458bc2b57c 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 9c23898a74..384ab52770 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 a5f163ba65..56d5f5c60e 100644 --- a/src/libxrpl/protocol/STParsedJSON.cpp +++ b/src/libxrpl/protocol/STParsedJSON.cpp @@ -501,30 +501,6 @@ parseLeaf( break; } - case STI_UINT192: { - if (!value.isString()) - { - error = bad_type(json_name, fieldName); - return ret; - } - - uint192 num; - - if (auto const s = value.asString(); !num.parseHex(s)) - { - if (!s.empty()) - { - error = invalid_data(json_name, fieldName); - return ret; - } - - num.zero(); - } - - ret = detail::make_stvar(field, num); - break; - } - case STI_UINT160: { if (!value.isString()) { @@ -549,6 +525,30 @@ parseLeaf( break; } + case STI_UINT192: { + if (!value.isString()) + { + error = bad_type(json_name, fieldName); + return ret; + } + + uint192 num; + + if (auto const s = value.asString(); !num.parseHex(s)) + { + if (!s.empty()) + { + error = invalid_data(json_name, fieldName); + return ret; + } + + num.zero(); + } + + ret = detail::make_stvar(field, num); + break; + } + case STI_UINT256: { if (!value.isString()) { @@ -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 24954c4add..72b348091c 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 b8a68d28b8..d85f25ec8b 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 9a33cb81f1..923059e111 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 d77de860fd..640743a869 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 224d7431d3..8bdf11e618 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 ff31662494..42f6c7ecfa 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 5334bdabcb..22b270b847 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -113,6 +113,13 @@ public: 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 @@ private: // 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 83dcef2fa9..c993d8ba59 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 cf494217f4..e6eb4a683d 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -81,6 +81,12 @@ public: gasUsed_ = gasUsed; } + void + setWasmReturnCode(std::int32_t const wasmReturnCode) + { + wasmReturnCode_ = wasmReturnCode; + } + /** Get the number of modified entries */ std::size_t @@ -100,6 +106,7 @@ public: 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 039088205b..026955baba 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 896705042f..1ba7f00945 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.h +++ b/src/xrpld/ledger/detail/ApplyStateTable.h @@ -74,6 +74,7 @@ public: 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 a90fc3fcbb..1191f6573f 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 47/47] 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 98e06a8636..c8db385c67 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 49990dfb99..d815c9939d 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 c4db2fedd5..d4a9072740 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 c993d8ba59..f0389c06ad 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()) {