From 5c7ec5f36f27dd6c01fcbc2174f96cc54e07cf4c Mon Sep 17 00:00:00 2001 From: Denis Angell Date: Fri, 12 Jul 2024 22:51:35 +0200 Subject: [PATCH] more testing --- src/test/app/SetJSHook_test.cpp | 4279 +++++++++++++++++++++++----- src/test/app/SetJSHook_wasm.h | 160 +- src/test/app/build-js-carray.sh | 15 + src/test/app/build_test_jshooks.sh | 47 + src/test/jtx/hook.h | 2 +- src/test/jtx/impl/hook.cpp | 5 +- 6 files changed, 3746 insertions(+), 762 deletions(-) create mode 100755 src/test/app/build-js-carray.sh create mode 100755 src/test/app/build_test_jshooks.sh diff --git a/src/test/app/SetJSHook_test.cpp b/src/test/app/SetJSHook_test.cpp index 8838c62f5..ac686eefa 100644 --- a/src/test/app/SetJSHook_test.cpp +++ b/src/test/app/SetJSHook_test.cpp @@ -72,6 +72,7 @@ public: // without running into fee issues we only want to test fee code specifically in // fee unit tests, the rest of the time we want to ignore it. #define HSFEE fee(100'000'000) +#define HSDROPS drops(99'000) #define M(m) memo(m, "", "") void testHooksOwnerDir(FeatureBitset features) @@ -99,13 +100,13 @@ public: env.close(); env(ripple::test::jtx::hook( - alice, {{hsov1(accept_wasm, 1, overrideFlag)}}, 0), + alice, {{hsov1(accept_wasm, 1, HSDROPS, overrideFlag)}}, 0), HSFEE, ter(tesSUCCESS)); env.close(); env(ripple::test::jtx::hook( - alice, {{hsov1(accept_wasm, 1, overrideFlag)}}, 0), + alice, {{hsov1(accept_wasm, 1, HSDROPS, overrideFlag)}}, 0), HSFEE, ter(tesSUCCESS)); env.close(); @@ -135,7 +136,7 @@ public: env.fund(XRP(10000), alice); env(ripple::test::jtx::hook( - alice, {{hsov1(accept_wasm, 1, overrideFlag)}}, 0), + alice, {{hsov1(accept_wasm, 1, HSDROPS, overrideFlag)}}, 0), M("Hooks Disabled"), HSFEE, ter(temDISABLED)); @@ -166,17 +167,17 @@ public: env(ripple::test::jtx::hook( alice, - {{hsov1(accept_wasm, 1), - hsov1(accept_wasm, 1), - hsov1(accept_wasm, 1), - hsov1(accept_wasm, 1), - hsov1(accept_wasm, 1), - hsov1(accept_wasm, 1), - hsov1(accept_wasm, 1), - hsov1(accept_wasm, 1), - hsov1(accept_wasm, 1), - hsov1(accept_wasm, 1), - hsov1(accept_wasm, 1)}}, + {{hsov1(accept_wasm, 1, HSDROPS), + hsov1(accept_wasm, 1, HSDROPS), + hsov1(accept_wasm, 1, HSDROPS), + hsov1(accept_wasm, 1, HSDROPS), + hsov1(accept_wasm, 1, HSDROPS), + hsov1(accept_wasm, 1, HSDROPS), + hsov1(accept_wasm, 1, HSDROPS), + hsov1(accept_wasm, 1, HSDROPS), + hsov1(accept_wasm, 1, HSDROPS), + hsov1(accept_wasm, 1, HSDROPS), + hsov1(accept_wasm, 1, HSDROPS)}}, 0), M("Must have fewer than 11 entries"), HSFEE, @@ -218,7 +219,7 @@ public: // create a hook that we can then install { env(ripple::test::jtx::hook( - bob, {{hsov1(accept_wasm, 1), hsov1(rollback_wasm, 1)}}, 0), + bob, {{hsov1(accept_wasm, 1, HSDROPS), hsov1(rollback_wasm, 1, HSDROPS)}}, 0), M("First set = tesSUCCESS"), HSFEE, ter(tesSUCCESS)); @@ -363,7 +364,7 @@ public: { { Json::Value jv = ripple::test::jtx::hook( - alice, {{hsov1(accept_wasm, 1)}}, 0); + alice, {{hsov1(accept_wasm, 1, HSDROPS)}}, 0); env(jv, M("Normal accept create"), HSFEE, ter(tesSUCCESS)); env.close(); } @@ -392,10 +393,10 @@ public: { Json::Value jv = ripple::test::jtx::hook( alice, - {{hsov1(accept_wasm, 1), - hsov1(makestate_wasm, 1), - hsov1(rollback_wasm, 1), - hsov1(accept2_wasm, 1)}}, + {{hsov1(accept_wasm, 1, HSDROPS), + hsov1(makestate_wasm, 1, HSDROPS), + hsov1(rollback_wasm, 1, HSDROPS), + hsov1(accept2_wasm, 1, HSDROPS)}}, 0); env(jv, M("Create four"), HSFEE, ter(tesSUCCESS)); env.close(); @@ -548,7 +549,7 @@ public: { // create hook Json::Value jv = - ripple::test::jtx::hook(alice, {{hsov1(makestate_wasm, 1)}}, 0); + ripple::test::jtx::hook(alice, {{hsov1(makestate_wasm, 1, HSDROPS)}}, 0); jv[jss::Hooks][0U][jss::Hook][jss::HookNamespace] = ns_str; env(jv, M("Create makestate hook"), HSFEE, ter(tesSUCCESS)); @@ -617,12 +618,12 @@ public: // test normal create and missing override flag { - env(ripple::test::jtx::hook(bob, {{hsov1(accept_wasm, 1)}}, 0), + env(ripple::test::jtx::hook(bob, {{hsov1(accept_wasm, 1, HSDROPS)}}, 0), M("First set = tesSUCCESS"), HSFEE, ter(tesSUCCESS)); - env(ripple::test::jtx::hook(bob, {{hsov1(accept_wasm, 1)}}, 0), + env(ripple::test::jtx::hook(bob, {{hsov1(accept_wasm, 1, HSDROPS)}}, 0), M("Second set = tecREQUIRES_FLAG"), HSFEE, ter(tecREQUIRES_FLAG)); @@ -719,7 +720,7 @@ public: // hook hash present { Json::Value jv = - ripple::test::jtx::hook(alice, {{hsov1(accept_wasm, 1)}}, 0); + ripple::test::jtx::hook(alice, {{hsov1(accept_wasm, 1, HSDROPS)}}, 0); Json::Value iv = jv[jss::Hooks][0U]; iv[jss::Hook][jss::HookHash] = to_string(uint256{beast::zero}); jv[jss::Hooks][0U] = iv; @@ -733,7 +734,7 @@ public: // correctly formed { Json::Value jv = - ripple::test::jtx::hook(alice, {{hsov1(accept_wasm, 1)}}, 0); + ripple::test::jtx::hook(alice, {{hsov1(accept_wasm, 1, HSDROPS)}}, 0); env(jv, M("Normal accept"), HSFEE, ter(tesSUCCESS)); env.close(); @@ -764,7 +765,7 @@ public: // add a second hook { Json::Value jv = - ripple::test::jtx::hook(alice, {{hsov1(accept_wasm, 1)}}, 0); + ripple::test::jtx::hook(alice, {{hsov1(accept_wasm, 1, HSDROPS)}}, 0); Json::Value iv = jv[jss::Hooks][0U]; jv[jss::Hooks][0U] = Json::Value{}; jv[jss::Hooks][0U][jss::Hook] = Json::Value{}; @@ -803,7 +804,7 @@ public: // test override { Json::Value jv = - ripple::test::jtx::hook(alice, {{hsov1(rollback_wasm, 1)}}, 0); + ripple::test::jtx::hook(alice, {{hsov1(rollback_wasm, 1, HSDROPS)}}, 0); jv[jss::Hooks][0U][jss::Hook][jss::Flags] = hsfOVERRIDE; env(jv, M("Rollback override"), HSFEE, ter(tesSUCCESS)); env.close(); @@ -873,6 +874,7 @@ public: iv[jss::HookOn] = "00000000000000000000000000000000000000000000000000000000000000" "00"; + iv[jss::Fee] = "100"; iv[jss::HookParameters] = Json::Value{Json::arrayValue}; iv[jss::HookParameters][0U] = Json::Value{}; iv[jss::HookParameters][0U][jss::HookParameter] = Json::Value{}; @@ -1296,7 +1298,7 @@ public: { // add a second hook env(ripple::test::jtx::hook( - alice, {{{}, hsov1(accept_wasm, 1)}}, 0), + alice, {{{}, hsov1(accept_wasm, 1, HSDROPS)}}, 0), M("Add second hook"), HSFEE, ter(tesSUCCESS)); @@ -1432,7 +1434,7 @@ public: std::uint32_t const aliceSeq{env.seq(alice)}; env.require(owners(alice, 10)); - env(ripple::test::jtx::hook(alice, {{hsov1(accept_wasm, 1)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(accept_wasm, 1, HSDROPS)}}, 0), HSFEE, ticket::use(aliceTicketSeq++), ter(tesSUCCESS)); @@ -1470,7 +1472,7 @@ public: env.fund(XRP(10000), alice); env.fund(XRP(10000), bob); - env(ripple::test::jtx::hook(alice, {{hsov1(accept_wasm, 1)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(accept_wasm, 1, HSDROPS)}}, 0), M("Install Accept Hook"), HSFEE); env.close(); @@ -1491,7 +1493,7 @@ public: env.fund(XRP(10000), alice); env.fund(XRP(10000), bob); - env(ripple::test::jtx::hook(alice, {{hsov1(rollback_wasm, 1)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(rollback_wasm, 1, HSDROPS)}}, 0), M("Install Rollback Hook"), HSFEE); env.close(); @@ -1543,7 +1545,7 @@ public: )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hso(hook, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set otxn_field"), HSFEE); env.close(); @@ -1638,7 +1640,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set hook_account"), HSFEE); env.close(); @@ -1673,7 +1675,7 @@ public: } // install the same hook bob - env(ripple::test::jtx::hook(bob, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(bob, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set hook_account 2"), HSFEE); env.close(); @@ -1801,7 +1803,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set hook_again"), HSFEE); env.close(); @@ -1842,6 +1844,9 @@ public: auto const test = [&](Account alice) -> void { Env env{*this, features}; + // Env env{*this, envconfig(), features, nullptr, + // beast::severities::kTrace + // }; auto const bob = Account{"bob"}; env.fund(XRP(10000), alice); @@ -1926,7 +1931,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set hook_hash"), HSFEE); env.close(); @@ -2041,7 +2046,7 @@ public: // )[test.hook]"]; // install a slightly different hook on bob - env(ripple::test::jtx::hook(bob, {{hsov1(hook2, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(bob, {{hsov1(hook2, 1, HSDROPS, overrideFlag)}}, 0), M("set hook_hash 2"), HSFEE); env.close(); @@ -2314,6 +2319,7 @@ public: iv[jss::CreateCode] = strHex(hook); iv[jss::HookOn] = "0000000000000000000000000000000000000000000000000000000000000000"; + iv[jss::Fee] = "99000"; iv[jss::HookApiVersion] = 1U; iv[jss::HookNamespace] = to_string(uint256{beast::zero}); Json::Value params{Json::arrayValue}; @@ -2682,6 +2688,7 @@ public: iv[jss::CreateCode] = strHex(setter_wasm); iv[jss::HookOn] = "0000000000000000000000000000000000000000000000000000000000000000"; + iv[jss::Fee] = "99000"; iv[jss::HookApiVersion] = 1U; iv[jss::HookNamespace] = to_string(uint256{beast::zero}); @@ -2763,7 +2770,7 @@ public: // install the hook on alice in all four spots env(ripple::test::jtx::hook( - alice, {{hsov1(hook, 1), hsov1(hook, 1), hsov1(hook, 1), hsov1(hook, 1)}}, 0), + alice, {{hsov1(hook, 1, HSDROPS), hsov1(hook, 1, HSDROPS), hsov1(hook, 1, HSDROPS), hsov1(hook, 1, HSDROPS)}}, 0), M("set hook_pos"), HSFEE, ter(tesSUCCESS)); @@ -2938,10 +2945,10 @@ public: // install the hook on alice in one places env(ripple::test::jtx::hook( alice, - {{hsov1(skip_wasm, 1), - hsov1(pos_wasm, 1), - hsov1(pos_wasm, 1), - hsov1(skip_wasm, 1)}}, + {{hsov1(skip_wasm, 1, HSDROPS), + hsov1(pos_wasm, 1, HSDROPS), + hsov1(pos_wasm, 1, HSDROPS), + hsov1(skip_wasm, 1, HSDROPS)}}, 0), M("set hook_skip"), HSFEE, @@ -3060,7 +3067,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set ledger_last_hash"), HSFEE); env.close(); @@ -3137,7 +3144,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set ledger_last_time"), HSFEE); env.close(); @@ -3274,7 +3281,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set ledger_nonce"), HSFEE); env.close(); @@ -3372,7 +3379,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set ledger_seq"), HSFEE); env.close(); @@ -3405,6 +3412,2831 @@ public: } } + void + test_otxn_id(FeatureBitset features) + { + testcase("Test otxn_id"); + using namespace jtx; + Env env{*this, features}; + + Account const alice{"alice"}; + Account const bob{"bob"}; + env.fund(XRP(10000), alice); + env.fund(XRP(10000), bob); + + TestHook hook = wasm[R"[test.hook]( + #include + extern int32_t _g (uint32_t id, uint32_t maxiter); + #define GUARD(maxiter) _g((1ULL << 31U) + __LINE__, (maxiter)+1) + extern int64_t accept (uint32_t read_ptr, uint32_t read_len, int64_t error_code); + extern int64_t rollback (uint32_t read_ptr, uint32_t read_len, int64_t error_code); + extern int64_t slot (uint32_t write_ptr, uint32_t write_len, uint32_t slot_no); + extern int64_t otxn_id (uint32_t write_ptr, uint32_t write_len, uint32_t flags); + extern int64_t util_sha512h(uint32_t write_ptr, uint32_t write_len, + uint32_t read_ptr, uint32_t read_len ); + extern int64_t otxn_slot ( + uint32_t slot_no + ); + #define TOO_SMALL -4 + #define OUT_OF_BOUNDS -1 + #define ASSERT(x)\ + if (!(x))\ + rollback((uint32_t)#x, sizeof(#x), __LINE__); + #define SBUF(x) (uint32_t)(x), sizeof(x) + int64_t hook(uint32_t reserved ) + { + _g(1,1); + + // bounds check + ASSERT(otxn_id(1, 1000000, 0) == OUT_OF_BOUNDS); + ASSERT(otxn_id(1000000, 1024, 0) == OUT_OF_BOUNDS); + + // size check + ASSERT(otxn_id(1, 0, 0) == TOO_SMALL); + ASSERT(otxn_id(1, 31, 0) == TOO_SMALL); + + uint8_t id[32]; + ASSERT(otxn_id(SBUF(id), 0) == 32); + + // slot the otxn then generate a canonical hash over it + ASSERT(otxn_slot(1) == 1); + + uint8_t buf[1024]; + int64_t size = slot(buf + 4, sizeof(buf) - 4, 1); + + + ASSERT(size > 0); + + buf[0] = 'T'; + buf[1] = 'X'; + buf[2] = 'N'; + buf[3] = 0; + + uint8_t hash[32]; + ASSERT(util_sha512h(SBUF(hash), buf, size+4) == 32); + + for (int i = 0; GUARD(32), i < 32; ++i) + ASSERT(hash[i] == id[i]); + + // RH TODO: test the flags = 1 on emitted txn + + // done! + accept(0,0,0); + } + )[test.hook]"]; + + // install the hook on alice + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), + M("set otxn_id"), + HSFEE); + env.close(); + + // invoke the hook + env(pay(bob, alice, XRP(1)), M("test otxn_id"), fee(XRP(1))); + } + + void + test_otxn_slot(FeatureBitset features) + { + testcase("Test otxn_slot"); + using namespace jtx; + Env env{*this, features}; + + Account const alice{"alice"}; + Account const bob{"bob"}; + env.fund(XRP(10000), alice); + env.fund(XRP(10000), bob); + + TestHook hook = wasm[R"[test.hook]( + #include + extern int32_t _g (uint32_t id, uint32_t maxiter); + #define GUARD(maxiter) _g((1ULL << 31U) + __LINE__, (maxiter)+1) + extern int64_t accept (uint32_t read_ptr, uint32_t read_len, int64_t error_code); + extern int64_t rollback (uint32_t read_ptr, uint32_t read_len, int64_t error_code); + extern int64_t slot (uint32_t write_ptr, uint32_t write_len, uint32_t slot_no); + extern int64_t otxn_id (uint32_t write_ptr, uint32_t write_len, uint32_t flags); + extern int64_t util_sha512h(uint32_t write_ptr, uint32_t write_len, + uint32_t read_ptr, uint32_t read_len ); + extern int64_t otxn_slot ( + uint32_t slot_no + ); + #define INVALID_ARGUMENT -7 + #define NO_FREE_SLOTS -6 + #define ASSERT(x)\ + if (!(x))\ + rollback((uint32_t)#x, sizeof(#x), __LINE__); + #define SBUF(x) (uint32_t)(x), sizeof(x) + int64_t hook(uint32_t reserved ) + { + _g(1,1); + + ASSERT(otxn_slot(256) == INVALID_ARGUMENT); + + ASSERT(otxn_slot(1) == 1); + + uint8_t id[32]; + ASSERT(otxn_id(SBUF(id), 0) == 32); + + // slot the otxn then generate a canonical hash over it + ASSERT(otxn_slot(1) == 1); + + uint8_t buf[1024]; + int64_t size = slot(buf + 4, sizeof(buf) - 4, 1); + + ASSERT(size > 0); + + buf[0] = 'T'; + buf[1] = 'X'; + buf[2] = 'N'; + buf[3] = 0; + + uint8_t hash[32]; + ASSERT(util_sha512h(SBUF(hash), buf, size+4) == 32); + + for (int i = 0; GUARD(32), i < 32; ++i) + ASSERT(hash[i] == id[i]); + + // slot exhaustion + for (int i = 0; GUARD(255), i < 254; ++i) + ASSERT(otxn_slot(0) > 0); + + ASSERT(otxn_slot(0) == NO_FREE_SLOTS); + + // done! + accept(0,0,0); + } + )[test.hook]"]; + + // install the hook on alice + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), + M("set otxn_slot"), + HSFEE); + env.close(); + + // invoke the hook + env(pay(bob, alice, XRP(1)), M("test otxn_slot"), fee(XRP(1))); + } + + void + test_otxn_type(FeatureBitset features) + { + testcase("Test otxn_type"); + using namespace jtx; + Env env{*this, features}; + + Account const alice{"alice"}; + Account const bob{"bob"}; + env.fund(XRP(10000), alice); + env.fund(XRP(10000), bob); + + TestHook hook = wasm[R"[test.hook]( + #include + extern int32_t _g (uint32_t id, uint32_t maxiter); + #define GUARD(maxiter) _g((1ULL << 31U) + __LINE__, (maxiter)+1) + extern int64_t accept (uint32_t read_ptr, uint32_t read_len, int64_t error_code); + extern int64_t rollback (uint32_t read_ptr, uint32_t read_len, int64_t error_code); + extern int64_t slot (uint32_t write_ptr, uint32_t write_len, uint32_t slot_no); + extern int64_t otxn_slot ( + uint32_t slot_no + ); + extern int64_t slot_subfield( + uint32_t parent_slot, + uint32_t field_id, + uint32_t new_slot + ); + extern int64_t otxn_type(void); + #define sfTransactionType ((1U << 16U) + 2U) + #define ASSERT(x)\ + if (!(x))\ + rollback((uint32_t)#x, sizeof(#x), __LINE__); + #define SBUF(x) (uint32_t)(x), sizeof(x) + int64_t hook(uint32_t reserved ) + { + _g(1,1); + + ASSERT(otxn_slot(1) == 1); + + ASSERT(slot_subfield(1, sfTransactionType, 2) == 2); + + int64_t tt = slot(0,0,2); + + ASSERT(tt == otxn_type()); + + // done! + accept(0,0,0); + } + )[test.hook]"]; + + // install the hook on alice + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), + M("set otxn_type"), + HSFEE); + env.close(); + + // invoke the hook + env(pay(bob, alice, XRP(1)), M("test otxn_type"), fee(XRP(1))); + + // invoke it another way + Json::Value jv; + jv[jss::Account] = alice.human(); + jv[jss::TransactionType] = jss::AccountSet; + jv[jss::Flags] = 0; + + // invoke the hook + env(jv, M("test otxn_type 2"), fee(XRP(1))); + + // RH TODO: test behaviour on emit failure + } + + void + test_state(FeatureBitset features) + { + testcase("Test state"); + using namespace jtx; + + Env env{*this, features}; + + auto const bob = Account{"bob"}; + auto const alice = Account{"alice"}; + env.fund(XRP(10000), alice); + env.fund(XRP(10000), bob); + + { + TestHook hook = { + 0x43U, 0x13U, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x2aU, 0x77U, 0x61U, 0x73U, + 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, + 0x31U, 0x38U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, + 0x02U, 0x78U, 0x08U, 0x63U, 0x6fU, 0x64U, 0x65U, 0x0aU, 0x74U, + 0x72U, 0x61U, 0x63U, 0x65U, 0x0aU, 0x65U, 0x72U, 0x72U, 0x6fU, + 0x72U, 0x10U, 0x72U, 0x6fU, 0x6cU, 0x6cU, 0x62U, 0x61U, 0x63U, + 0x6bU, 0x06U, 0x61U, 0x72U, 0x67U, 0x0cU, 0x62U, 0x79U, 0x74U, + 0x65U, 0x73U, 0x31U, 0x0cU, 0x62U, 0x79U, 0x74U, 0x65U, 0x73U, + 0x32U, 0x02U, 0x69U, 0x12U, 0x73U, 0x74U, 0x61U, 0x74U, 0x65U, + 0x5fU, 0x73U, 0x65U, 0x74U, 0x1cU, 0x36U, 0x33U, 0x36U, 0x46U, + 0x36U, 0x45U, 0x37U, 0x34U, 0x36U, 0x35U, 0x36U, 0x45U, 0x37U, + 0x34U, 0x0cU, 0x36U, 0x42U, 0x36U, 0x35U, 0x37U, 0x39U, 0x20U, + 0x36U, 0x33U, 0x36U, 0x46U, 0x36U, 0x45U, 0x37U, 0x34U, 0x36U, + 0x35U, 0x36U, 0x45U, 0x37U, 0x34U, 0x33U, 0x32U, 0x10U, 0x36U, + 0x42U, 0x36U, 0x35U, 0x37U, 0x39U, 0x33U, 0x32U, 0x0aU, 0x73U, + 0x74U, 0x61U, 0x74U, 0x65U, 0x0cU, 0x61U, 0x63U, 0x63U, 0x65U, + 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, + 0x01U, 0x00U, 0x01U, 0x00U, 0x02U, 0x32U, 0x01U, 0xa4U, 0x01U, + 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3fU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x80U, 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x80U, + 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x3aU, 0xe3U, + 0x00U, 0x00U, 0x00U, 0xc2U, 0x01U, 0x4dU, 0xe4U, 0x00U, 0x00U, + 0x00U, 0x3aU, 0xe4U, 0x00U, 0x00U, 0x00U, 0xc7U, 0x28U, 0xcaU, + 0x03U, 0x01U, 0x07U, 0x3dU, 0x00U, 0x0cU, 0x0eU, 0x00U, 0x0cU, + 0x2eU, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x02U, 0x00U, 0x02U, + 0x04U, 0x00U, 0x00U, 0x24U, 0x02U, 0xccU, 0x03U, 0x00U, 0x01U, + 0x00U, 0xceU, 0x03U, 0x00U, 0x01U, 0x00U, 0xd3U, 0x97U, 0xecU, + 0x20U, 0x38U, 0xe8U, 0x00U, 0x00U, 0x00U, 0x04U, 0xe9U, 0x00U, + 0x00U, 0x00U, 0xb7U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xeaU, 0x00U, + 0x00U, 0x00U, 0xd3U, 0x42U, 0x38U, 0x00U, 0x00U, 0x00U, 0x24U, + 0x00U, 0x00U, 0xd4U, 0xf2U, 0x0eU, 0x29U, 0xcaU, 0x03U, 0x02U, + 0x04U, 0x03U, 0x17U, 0x49U, 0x59U, 0x0cU, 0x02U, 0x06U, 0x00U, + 0x00U, 0x01U, 0x04U, 0x01U, 0x0aU, 0x00U, 0x00U, 0x9bU, 0x02U, + 0x05U, 0xd6U, 0x03U, 0x00U, 0x01U, 0x00U, 0xd8U, 0x03U, 0x01U, + 0x00U, 0x30U, 0xdaU, 0x03U, 0x01U, 0x01U, 0x30U, 0xdcU, 0x03U, + 0x02U, 0x02U, 0x20U, 0xdcU, 0x03U, 0x04U, 0x02U, 0x20U, 0x61U, + 0x01U, 0x00U, 0x61U, 0x00U, 0x00U, 0x38U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x38U, 0xefU, 0x00U, 0x00U, 0x00U, 0x04U, 0xf0U, 0x00U, + 0x00U, 0x00U, 0x04U, 0xf1U, 0x00U, 0x00U, 0x00U, 0xf2U, 0xbeU, + 0xaaU, 0xb7U, 0xf2U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xefU, 0x00U, 0x00U, 0x00U, 0x04U, 0xf2U, 0x00U, 0x00U, + 0x00U, 0x04U, 0xf3U, 0x00U, 0x00U, 0x00U, 0xf2U, 0xbfU, 0x08U, + 0xaaU, 0xb8U, 0xf2U, 0x0eU, 0x38U, 0xf4U, 0x00U, 0x00U, 0x00U, + 0x04U, 0xf1U, 0x00U, 0x00U, 0x00U, 0xf1U, 0xcbU, 0x38U, 0xe8U, + 0x00U, 0x00U, 0x00U, 0x04U, 0xecU, 0x00U, 0x00U, 0x00U, 0x62U, + 0x00U, 0x00U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x62U, 0x00U, 0x00U, 0xebU, 0xbeU, 0xaaU, 0xb9U, 0xf2U, + 0x0eU, 0x38U, 0xf4U, 0x00U, 0x00U, 0x00U, 0x04U, 0xf3U, 0x00U, + 0x00U, 0x00U, 0xf1U, 0xccU, 0x38U, 0xe8U, 0x00U, 0x00U, 0x00U, + 0x04U, 0xedU, 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0x09U, + 0xf3U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, + 0x00U, 0xebU, 0xbfU, 0x08U, 0xaaU, 0xbaU, 0xf2U, 0x0eU, 0x61U, + 0x02U, 0x00U, 0xbfU, 0x20U, 0xcdU, 0x62U, 0x02U, 0x00U, 0x62U, + 0x00U, 0x00U, 0xebU, 0xa4U, 0xecU, 0x31U, 0x38U, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x02U, 0x00U, 0x47U, + 0xbfU, 0x63U, 0xbfU, 0x6fU, 0xbfU, 0x6eU, 0xbfU, 0x74U, 0xbfU, + 0x65U, 0xbfU, 0x6eU, 0xbfU, 0x74U, 0x26U, 0x07U, 0x00U, 0x62U, + 0x02U, 0x00U, 0x47U, 0xacU, 0xbbU, 0xf2U, 0x0eU, 0x62U, 0x02U, + 0x00U, 0x90U, 0x11U, 0x63U, 0x02U, 0x00U, 0x0eU, 0xeeU, 0xc7U, + 0x61U, 0x03U, 0x00U, 0xbfU, 0x20U, 0xceU, 0x62U, 0x03U, 0x00U, + 0x62U, 0x01U, 0x00U, 0xebU, 0xa4U, 0xecU, 0x33U, 0x38U, 0xe3U, + 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0x62U, 0x03U, 0x00U, + 0x47U, 0xbfU, 0x63U, 0xbfU, 0x6fU, 0xbfU, 0x6eU, 0xbfU, 0x74U, + 0xbfU, 0x65U, 0xbfU, 0x6eU, 0xbfU, 0x74U, 0xbfU, 0x32U, 0x26U, + 0x08U, 0x00U, 0x62U, 0x03U, 0x00U, 0x47U, 0xacU, 0xbcU, 0xf2U, + 0x0eU, 0x62U, 0x03U, 0x00U, 0x90U, 0x11U, 0x63U, 0x03U, 0x00U, + 0x0eU, 0xeeU, 0xc5U, 0x38U, 0xf5U, 0x00U, 0x00U, 0x00U, 0xc3U, + 0xb7U, 0xf2U, 0x29U, 0xcaU, 0x03U, 0x09U, 0x10U, 0x21U, 0x85U, + 0x8bU, 0x3fU, 0x53U, 0x4aU, 0x3fU, 0x53U, 0x4fU, 0x53U, 0xbcU, + 0x3bU, 0x53U, 0xc6U, 0x3bU, 0x2bU}; + // TestHook hook = jswasm[R"[test.hook]( + // const ASSERT = (x, code) => { + // if (!x) { + // trace('error', 0, false) + // rollback(x.toString(), code) + // } + // } + + // const Hook = (arg) => { + // ASSERT(state_set('636F6E74656E74', '6B6579') == 7, 0) + // ASSERT(state_set('636F6E74656E7432', '6B657932') == 8, 1) + + // const bytes1 = state('6B6579') + // trace('bytes1', bytes1, false) + // ASSERT(bytes1.length == 7, 2) + + // const bytes2 = state('6B657932') + // trace('bytes2', bytes2, false) + // ASSERT(bytes2.length == 8, 3) + + // for (let i = 32; i < bytes1.length; ++i) { + // ASSERT(bytes1[i] === [99, 111, 110, 116, 101, 110, 116][i], 4) + // } + + // for (let i = 32; i < bytes2.length; ++i) { + // ASSERT(bytes2[i] === [99, 111, 110, 116, 101, 110, 116, 50][i], 5) + // } + + // accept('', 0) + // } + // )[test.hook]"]; + + // install the hook on alice + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), + M("set state"), + HSFEE); + env.close(); + + // invoke the hook + env(pay(bob, alice, XRP(1)), M("test state"), fee(XRP(1))); + env.close(); + } + + // override hook with a second version that just reads those state + // objects + { + TestHook hook = { + 0x43U, 0x10U, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x2aU, 0x77U, 0x61U, 0x73U, + 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, + 0x31U, 0x39U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, + 0x02U, 0x78U, 0x08U, 0x63U, 0x6fU, 0x64U, 0x65U, 0x0aU, 0x74U, + 0x72U, 0x61U, 0x63U, 0x65U, 0x0aU, 0x65U, 0x72U, 0x72U, 0x6fU, + 0x72U, 0x10U, 0x72U, 0x6fU, 0x6cU, 0x6cU, 0x62U, 0x61U, 0x63U, + 0x6bU, 0x06U, 0x61U, 0x72U, 0x67U, 0x0cU, 0x62U, 0x79U, 0x74U, + 0x65U, 0x73U, 0x31U, 0x0cU, 0x62U, 0x79U, 0x74U, 0x65U, 0x73U, + 0x32U, 0x02U, 0x69U, 0x0aU, 0x73U, 0x74U, 0x61U, 0x74U, 0x65U, + 0x0cU, 0x36U, 0x42U, 0x36U, 0x35U, 0x37U, 0x39U, 0x10U, 0x36U, + 0x42U, 0x36U, 0x35U, 0x37U, 0x39U, 0x33U, 0x32U, 0x0cU, 0x61U, + 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, + 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, 0x00U, 0x02U, 0x32U, + 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x80U, 0x3fU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3eU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe4U, 0x00U, + 0x00U, 0x00U, 0x80U, 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x3aU, 0xe3U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x01U, 0x4dU, + 0xe4U, 0x00U, 0x00U, 0x00U, 0x3aU, 0xe4U, 0x00U, 0x00U, 0x00U, + 0xc7U, 0x28U, 0xcaU, 0x03U, 0x01U, 0x07U, 0x3dU, 0x00U, 0x0cU, + 0x0eU, 0x00U, 0x0cU, 0x28U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, + 0x02U, 0x00U, 0x02U, 0x04U, 0x00U, 0x00U, 0x24U, 0x02U, 0xccU, + 0x03U, 0x00U, 0x01U, 0x00U, 0xceU, 0x03U, 0x00U, 0x01U, 0x00U, + 0xd3U, 0x97U, 0xecU, 0x20U, 0x38U, 0xe8U, 0x00U, 0x00U, 0x00U, + 0x04U, 0xe9U, 0x00U, 0x00U, 0x00U, 0xb7U, 0x09U, 0xf3U, 0x0eU, + 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0xd3U, 0x42U, 0x38U, 0x00U, + 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, 0x0eU, 0x29U, + 0xcaU, 0x03U, 0x02U, 0x04U, 0x03U, 0x17U, 0x49U, 0x59U, 0x0cU, + 0x02U, 0x06U, 0x00U, 0x00U, 0x01U, 0x04U, 0x01U, 0x0aU, 0x00U, + 0x00U, 0xe6U, 0x01U, 0x05U, 0xd6U, 0x03U, 0x00U, 0x01U, 0x00U, + 0xd8U, 0x03U, 0x01U, 0x00U, 0x30U, 0xdaU, 0x03U, 0x01U, 0x01U, + 0x30U, 0xdcU, 0x03U, 0x02U, 0x02U, 0x20U, 0xdcU, 0x03U, 0x04U, + 0x02U, 0x20U, 0x61U, 0x01U, 0x00U, 0x61U, 0x00U, 0x00U, 0x38U, + 0xefU, 0x00U, 0x00U, 0x00U, 0x04U, 0xf0U, 0x00U, 0x00U, 0x00U, + 0xf1U, 0xcbU, 0x38U, 0xe8U, 0x00U, 0x00U, 0x00U, 0x04U, 0xecU, + 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x09U, 0xf3U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0xebU, + 0xbeU, 0xaaU, 0xb9U, 0xf2U, 0x0eU, 0x38U, 0xefU, 0x00U, 0x00U, + 0x00U, 0x04U, 0xf1U, 0x00U, 0x00U, 0x00U, 0xf1U, 0xccU, 0x38U, + 0xe8U, 0x00U, 0x00U, 0x00U, 0x04U, 0xedU, 0x00U, 0x00U, 0x00U, + 0x62U, 0x01U, 0x00U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xebU, 0xbfU, 0x08U, 0xaaU, + 0xbaU, 0xf2U, 0x0eU, 0x61U, 0x02U, 0x00U, 0xbfU, 0x20U, 0xcdU, + 0x62U, 0x02U, 0x00U, 0x62U, 0x00U, 0x00U, 0xebU, 0xa4U, 0xecU, + 0x31U, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, + 0x62U, 0x02U, 0x00U, 0x47U, 0xbfU, 0x63U, 0xbfU, 0x6fU, 0xbfU, + 0x6eU, 0xbfU, 0x74U, 0xbfU, 0x65U, 0xbfU, 0x6eU, 0xbfU, 0x74U, + 0x26U, 0x07U, 0x00U, 0x62U, 0x02U, 0x00U, 0x47U, 0xacU, 0xbbU, + 0xf2U, 0x0eU, 0x62U, 0x02U, 0x00U, 0x90U, 0x11U, 0x63U, 0x02U, + 0x00U, 0x0eU, 0xeeU, 0xc7U, 0x61U, 0x03U, 0x00U, 0xbfU, 0x20U, + 0xceU, 0x62U, 0x03U, 0x00U, 0x62U, 0x01U, 0x00U, 0xebU, 0xa4U, + 0xecU, 0x33U, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, + 0x00U, 0x62U, 0x03U, 0x00U, 0x47U, 0xbfU, 0x63U, 0xbfU, 0x6fU, + 0xbfU, 0x6eU, 0xbfU, 0x74U, 0xbfU, 0x65U, 0xbfU, 0x6eU, 0xbfU, + 0x74U, 0xbfU, 0x32U, 0x26U, 0x08U, 0x00U, 0x62U, 0x03U, 0x00U, + 0x47U, 0xacU, 0xbcU, 0xf2U, 0x0eU, 0x62U, 0x03U, 0x00U, 0x90U, + 0x11U, 0x63U, 0x03U, 0x00U, 0x0eU, 0xeeU, 0xc5U, 0x38U, 0xf2U, + 0x00U, 0x00U, 0x00U, 0xc3U, 0xb7U, 0xf2U, 0x29U, 0xcaU, 0x03U, + 0x09U, 0x0eU, 0x21U, 0x3fU, 0x53U, 0x4aU, 0x3fU, 0x53U, 0x4fU, + 0x53U, 0xbcU, 0x3bU, 0x53U, 0xc6U, 0x3bU, 0x2bU}; + // TestHook hook = jswasm[R"[test.hook]( + // const ASSERT = (x, code) => { + // if (!x) { + // trace('error', 0, false) + // rollback(x.toString(), code) + // } + // } + + // const Hook = (arg) => { + // const bytes1 = state('6B6579') + // trace('bytes1', bytes1, false) + // ASSERT(bytes1.length == 7, 2) + + // const bytes2 = state('6B657932') + // trace('bytes2', bytes2, false) + // ASSERT(bytes2.length == 8, 3) + + // for (let i = 32; i < bytes1.length; ++i) { + // ASSERT(bytes1[i] === [99, 111, 110, 116, 101, 110, 116][i], 4) + // } + + // for (let i = 32; i < bytes2.length; ++i) { + // ASSERT(bytes2[i] === [99, 111, 110, 116, 101, 110, 116, 50][i], 5) + // } + + // accept('', 0) + // } + // )[test.hook]"]; + + // install the hook on alice + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), + M("set state 2"), + HSFEE); + env.close(); + + // invoke the hook + env(pay(bob, alice, XRP(1)), M("test state 2"), fee(XRP(1))); + } + } + + void + test_state_foreign(FeatureBitset features) + { + testcase("Test state_foreign"); + using namespace jtx; + + Env env{*this, features}; + + auto const bob = Account{"bob"}; + auto const alice = Account{"alice"}; + env.fund(XRP(10000), alice); + env.fund(XRP(10000), bob); + + { + TestHook hook = { + 0x43U, 0x13U, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x2aU, 0x77U, 0x61U, 0x73U, + 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, + 0x32U, 0x30U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, + 0x02U, 0x78U, 0x08U, 0x63U, 0x6fU, 0x64U, 0x65U, 0x0aU, 0x74U, + 0x72U, 0x61U, 0x63U, 0x65U, 0x0aU, 0x65U, 0x72U, 0x72U, 0x6fU, + 0x72U, 0x10U, 0x72U, 0x6fU, 0x6cU, 0x6cU, 0x62U, 0x61U, 0x63U, + 0x6bU, 0x06U, 0x61U, 0x72U, 0x67U, 0x04U, 0x6eU, 0x73U, 0x06U, + 0x61U, 0x63U, 0x63U, 0x12U, 0x73U, 0x74U, 0x61U, 0x74U, 0x65U, + 0x5fU, 0x73U, 0x65U, 0x74U, 0x1cU, 0x36U, 0x33U, 0x36U, 0x46U, + 0x36U, 0x45U, 0x37U, 0x34U, 0x36U, 0x35U, 0x36U, 0x45U, 0x37U, + 0x34U, 0x0cU, 0x36U, 0x42U, 0x36U, 0x35U, 0x37U, 0x39U, 0x18U, + 0x68U, 0x6fU, 0x6fU, 0x6bU, 0x5fU, 0x61U, 0x63U, 0x63U, 0x6fU, + 0x75U, 0x6eU, 0x74U, 0x22U, 0x73U, 0x74U, 0x61U, 0x74U, 0x65U, + 0x5fU, 0x66U, 0x6fU, 0x72U, 0x65U, 0x69U, 0x67U, 0x6eU, 0x5fU, + 0x73U, 0x65U, 0x74U, 0x20U, 0x36U, 0x33U, 0x36U, 0x46U, 0x36U, + 0x45U, 0x37U, 0x34U, 0x36U, 0x35U, 0x36U, 0x45U, 0x37U, 0x34U, + 0x33U, 0x32U, 0x10U, 0x36U, 0x42U, 0x36U, 0x35U, 0x37U, 0x39U, + 0x33U, 0x32U, 0x0cU, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, + 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, + 0x01U, 0x00U, 0x02U, 0x32U, 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, + 0x00U, 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe4U, + 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x00U, 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x00U, + 0x4dU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x39U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0xc2U, 0x01U, 0x4dU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x39U, + 0xe4U, 0x00U, 0x00U, 0x00U, 0xc7U, 0x28U, 0xcaU, 0x03U, 0x01U, + 0x07U, 0x3dU, 0x00U, 0x0cU, 0x0eU, 0x00U, 0x0cU, 0x18U, 0x0cU, + 0x02U, 0x06U, 0x00U, 0x00U, 0x02U, 0x00U, 0x02U, 0x04U, 0x00U, + 0x00U, 0x24U, 0x02U, 0xccU, 0x03U, 0x00U, 0x01U, 0x00U, 0xceU, + 0x03U, 0x00U, 0x01U, 0x00U, 0xd3U, 0x97U, 0xecU, 0x20U, 0x38U, + 0xe8U, 0x00U, 0x00U, 0x00U, 0x04U, 0xe9U, 0x00U, 0x00U, 0x00U, + 0xb7U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, + 0xd3U, 0x42U, 0x38U, 0x00U, 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, + 0xd4U, 0xf2U, 0x0eU, 0x29U, 0xcaU, 0x03U, 0x02U, 0x04U, 0x03U, + 0x17U, 0x49U, 0x59U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x01U, + 0x02U, 0x01U, 0x20U, 0x00U, 0x00U, 0x88U, 0x01U, 0x03U, 0xd6U, + 0x03U, 0x00U, 0x01U, 0x00U, 0xd8U, 0x03U, 0x01U, 0x00U, 0x30U, + 0xdaU, 0x03U, 0x01U, 0x01U, 0x30U, 0x61U, 0x01U, 0x00U, 0x61U, + 0x00U, 0x00U, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xeeU, + 0x00U, 0x00U, 0x00U, 0x04U, 0xefU, 0x00U, 0x00U, 0x00U, 0x04U, + 0xf0U, 0x00U, 0x00U, 0x00U, 0xf2U, 0xbeU, 0xaaU, 0xb7U, 0xf2U, + 0x0eU, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xc0U, 0xabU, 0x00U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0x26U, + 0x20U, 0x00U, 0xcbU, 0x38U, 0xf1U, 0x00U, 0x00U, 0x00U, 0xf0U, + 0xccU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, + 0xebU, 0xbfU, 0x14U, 0xacU, 0xb8U, 0xf2U, 0x0eU, 0x38U, 0xe3U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xf2U, 0x00U, 0x00U, 0x00U, 0x04U, + 0xf3U, 0x00U, 0x00U, 0x00U, 0x04U, 0xf4U, 0x00U, 0x00U, 0x00U, + 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0x22U, 0x04U, 0x00U, + 0xbfU, 0x08U, 0xacU, 0xb9U, 0xf2U, 0x0eU, 0x38U, 0xf5U, 0x00U, + 0x00U, 0x00U, 0xc3U, 0xb7U, 0xf2U, 0x29U, 0xcaU, 0x03U, 0x08U, + 0x0bU, 0x21U, 0x85U, 0x08U, 0x49U, 0x3fU, 0x35U, 0x08U, 0x26U, + 0x4eU, 0xb2U, 0x2bU, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x00U, 0x00U, 0x00U, 0xabU, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U}; + // TestHook hook = jswasm[R"[test.hook]( + // var ASSERT = (x, code) => { + // if (!x) { + // trace('error', 0, false) + // rollback(x.toString(), code) + // } + // } + // var Hook = (arg) => { + // ASSERT(state_set('636F6E74656E74', '6B6579') == 7, 0) + // const ns = [ + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // ] + // const acc = hook_account() + // ASSERT(acc.length === 20, 1) + // ASSERT(state_foreign_set('636F6E74656E7432', '6B657932', ns, acc) === 8, 2) + // accept('', 0) + // } + // )[test.hook]"]; + + // install the hook on alice + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), + M("set state_foreign"), + HSFEE); + env.close(); + + // invoke the hook + env(pay(bob, alice, XRP(1)), M("test state_foreign"), fee(XRP(1))); + } + + // set a second hook on bob that will read the state objects from alice + { + TestHook hook = { + 0x43U, 0x16U, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x12U, 0x73U, 0x66U, 0x41U, 0x63U, 0x63U, 0x6fU, 0x75U, 0x6eU, + 0x74U, 0x18U, 0x44U, 0x4fU, 0x45U, 0x53U, 0x4eU, 0x54U, 0x5fU, + 0x45U, 0x58U, 0x49U, 0x53U, 0x54U, 0x08U, 0x48U, 0x6fU, 0x6fU, + 0x6bU, 0x2aU, 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, + 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, 0x32U, 0x31U, 0x2dU, 0x67U, + 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x02U, 0x78U, 0x08U, 0x63U, + 0x6fU, 0x64U, 0x65U, 0x0aU, 0x74U, 0x72U, 0x61U, 0x63U, 0x65U, + 0x0aU, 0x65U, 0x72U, 0x72U, 0x6fU, 0x72U, 0x10U, 0x72U, 0x6fU, + 0x6cU, 0x6cU, 0x62U, 0x61U, 0x63U, 0x6bU, 0x06U, 0x61U, 0x72U, + 0x67U, 0x06U, 0x61U, 0x63U, 0x63U, 0x06U, 0x6eU, 0x73U, 0x31U, + 0x0cU, 0x62U, 0x79U, 0x74U, 0x65U, 0x73U, 0x31U, 0x0cU, 0x62U, + 0x79U, 0x74U, 0x65U, 0x73U, 0x32U, 0x06U, 0x6eU, 0x73U, 0x32U, + 0x02U, 0x69U, 0x14U, 0x6fU, 0x74U, 0x78U, 0x6eU, 0x5fU, 0x66U, + 0x69U, 0x65U, 0x6cU, 0x64U, 0x1aU, 0x73U, 0x74U, 0x61U, 0x74U, + 0x65U, 0x5fU, 0x66U, 0x6fU, 0x72U, 0x65U, 0x69U, 0x67U, 0x6eU, + 0x0cU, 0x36U, 0x42U, 0x36U, 0x35U, 0x37U, 0x39U, 0x10U, 0x36U, + 0x42U, 0x36U, 0x35U, 0x37U, 0x39U, 0x33U, 0x32U, 0x0cU, 0x61U, + 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, + 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, 0x00U, 0x02U, 0x5bU, + 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3fU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3fU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe6U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3eU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe5U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3eU, 0xe6U, 0x00U, 0x00U, 0x00U, 0x00U, + 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x39U, 0xe3U, + 0x00U, 0x00U, 0x00U, 0x01U, 0x01U, 0x00U, 0x08U, 0x00U, 0x39U, + 0xe4U, 0x00U, 0x00U, 0x00U, 0xbfU, 0xfbU, 0x39U, 0xe5U, 0x00U, + 0x00U, 0x00U, 0xc2U, 0x01U, 0x4dU, 0xe6U, 0x00U, 0x00U, 0x00U, + 0x39U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xc7U, 0x28U, 0xceU, 0x03U, + 0x01U, 0x09U, 0x79U, 0x00U, 0x18U, 0x0eU, 0x3fU, 0x35U, 0x00U, + 0x07U, 0x38U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x02U, 0x00U, + 0x02U, 0x04U, 0x00U, 0x00U, 0x24U, 0x02U, 0xd0U, 0x03U, 0x00U, + 0x01U, 0x00U, 0xd2U, 0x03U, 0x00U, 0x01U, 0x00U, 0xd3U, 0x97U, + 0xecU, 0x20U, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0x04U, 0xebU, + 0x00U, 0x00U, 0x00U, 0xb7U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xecU, + 0x00U, 0x00U, 0x00U, 0xd3U, 0x42U, 0x38U, 0x00U, 0x00U, 0x00U, + 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, 0x0eU, 0x29U, 0xceU, 0x03U, + 0x02U, 0x04U, 0x03U, 0x17U, 0x49U, 0x59U, 0x0cU, 0x02U, 0x06U, + 0x00U, 0x00U, 0x01U, 0x07U, 0x01U, 0x20U, 0x00U, 0x00U, 0x9aU, + 0x03U, 0x08U, 0xdaU, 0x03U, 0x00U, 0x01U, 0x00U, 0xdcU, 0x03U, + 0x01U, 0x00U, 0x30U, 0xdeU, 0x03U, 0x01U, 0x01U, 0x30U, 0xe0U, + 0x03U, 0x01U, 0x02U, 0x30U, 0xe2U, 0x03U, 0x01U, 0x03U, 0x20U, + 0xe4U, 0x03U, 0x01U, 0x04U, 0x30U, 0xe6U, 0x03U, 0x02U, 0x05U, + 0x20U, 0xe6U, 0x03U, 0x04U, 0x05U, 0x20U, 0x61U, 0x04U, 0x00U, + 0x61U, 0x03U, 0x00U, 0x61U, 0x02U, 0x00U, 0x61U, 0x01U, 0x00U, + 0x61U, 0x00U, 0x00U, 0x38U, 0xf4U, 0x00U, 0x00U, 0x00U, 0x38U, + 0xe4U, 0x00U, 0x00U, 0x00U, 0xf1U, 0xcbU, 0x38U, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0xebU, 0xbfU, 0x14U, 0xacU, + 0xb8U, 0xf2U, 0x0eU, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0x26U, + 0x20U, 0x00U, 0xccU, 0x38U, 0xf5U, 0x00U, 0x00U, 0x00U, 0x04U, + 0xf6U, 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0x62U, 0x00U, + 0x00U, 0xf3U, 0xcdU, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0x04U, + 0xf0U, 0x00U, 0x00U, 0x00U, 0x62U, 0x02U, 0x00U, 0x09U, 0xf3U, + 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x02U, 0x00U, + 0xebU, 0xbeU, 0xaaU, 0xb9U, 0xf2U, 0x0eU, 0x38U, 0xf5U, 0x00U, + 0x00U, 0x00U, 0x04U, 0xf7U, 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, + 0x00U, 0x62U, 0x00U, 0x00U, 0xf3U, 0xceU, 0x38U, 0xeaU, 0x00U, + 0x00U, 0x00U, 0x04U, 0xf1U, 0x00U, 0x00U, 0x00U, 0x62U, 0x03U, + 0x00U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x62U, 0x03U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xaaU, + 0xbaU, 0xf2U, 0x0eU, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xc0U, 0xabU, 0x00U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0x26U, 0x20U, 0x00U, 0xc5U, 0x04U, 0x38U, 0xf5U, 0x00U, + 0x00U, 0x00U, 0x04U, 0xf7U, 0x00U, 0x00U, 0x00U, 0x62U, 0x04U, + 0x00U, 0x62U, 0x00U, 0x00U, 0xf3U, 0x11U, 0x63U, 0x03U, 0x00U, + 0x0eU, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0x04U, 0xf1U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x03U, 0x00U, 0x09U, 0xf3U, 0x0eU, 0x38U, + 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x03U, 0x00U, 0xebU, 0xbfU, + 0x08U, 0xaaU, 0xbbU, 0xf2U, 0x0eU, 0x61U, 0x05U, 0x00U, 0xbfU, + 0x20U, 0xc5U, 0x05U, 0x62U, 0x05U, 0x00U, 0x62U, 0x02U, 0x00U, + 0xebU, 0xa4U, 0xecU, 0x31U, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x62U, 0x02U, 0x00U, 0x62U, 0x05U, 0x00U, 0x47U, 0xbfU, 0x63U, + 0xbfU, 0x6fU, 0xbfU, 0x6eU, 0xbfU, 0x74U, 0xbfU, 0x65U, 0xbfU, + 0x6eU, 0xbfU, 0x74U, 0x26U, 0x07U, 0x00U, 0x62U, 0x05U, 0x00U, + 0x47U, 0xacU, 0xbcU, 0xf2U, 0x0eU, 0x62U, 0x05U, 0x00U, 0x90U, + 0x11U, 0x63U, 0x05U, 0x00U, 0x0eU, 0xeeU, 0xc7U, 0x61U, 0x06U, + 0x00U, 0xbfU, 0x20U, 0xc5U, 0x06U, 0x62U, 0x06U, 0x00U, 0x62U, + 0x03U, 0x00U, 0xebU, 0xa4U, 0xecU, 0x33U, 0x38U, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x03U, 0x00U, 0x62U, 0x06U, 0x00U, 0x47U, + 0xbfU, 0x63U, 0xbfU, 0x6fU, 0xbfU, 0x6eU, 0xbfU, 0x74U, 0xbfU, + 0x65U, 0xbfU, 0x6eU, 0xbfU, 0x74U, 0xbfU, 0x32U, 0x26U, 0x08U, + 0x00U, 0x62U, 0x06U, 0x00U, 0x47U, 0xacU, 0xbdU, 0xf2U, 0x0eU, + 0x62U, 0x06U, 0x00U, 0x90U, 0x11U, 0x63U, 0x06U, 0x00U, 0x0eU, + 0xeeU, 0xc5U, 0x38U, 0xf8U, 0x00U, 0x00U, 0x00U, 0xc3U, 0xb7U, + 0xf2U, 0x29U, 0xceU, 0x03U, 0x0aU, 0x1bU, 0x4eU, 0x3fU, 0x4eU, + 0x08U, 0x80U, 0x30U, 0x08U, 0x5dU, 0x53U, 0x49U, 0x5dU, 0x53U, + 0x58U, 0x08U, 0x8aU, 0x30U, 0x0dU, 0x71U, 0x53U, 0x4eU, 0x58U, + 0xbcU, 0x3aU, 0x58U, 0xc6U, 0x3aU, 0x2bU}; + // TestHook hook = jswasm[R"[test.hook]( + // var ASSERT = (x, code) => { + // if (!x) { + // trace('error', 0, false) + // rollback(x.toString(), code) + // } + // } + // var sfAccount = 524289 + // var DOESNT_EXIST = -5 + // var Hook = (arg) => { + // const acc = otxn_field(sfAccount) + // ASSERT(acc.length === 20, 1) + // const ns1 = [ + // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 0, 0, 0, 0, 0, 0, 0, + // ] + // const bytes1 = state_foreign('6B6579', ns1, acc) + // trace('bytes1', bytes1, false) + // ASSERT(bytes1.length == 7, 2) + // let bytes2 = state_foreign('6B657932', ns1, acc) + // trace('bytes2', bytes2, false) + // ASSERT(bytes2 == DOESNT_EXIST, 3) + // const ns2 = [ + // 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 0, 0, 0, 0, 0, 0, 0, + // ] + // bytes2 = state_foreign('6B657932', ns2, acc) + // trace('bytes2', bytes2, false) + // ASSERT(bytes2.length == 8, 4) + // for (let i = 32; i < bytes1.length; ++i) { + // ASSERT(bytes1[i] === [99, 111, 110, 116, 101, 110, 116][i], 5) + // } + // for (let i = 32; i < bytes2.length; ++i) { + // ASSERT(bytes2[i] === [99, 111, 110, 116, 101, 110, 116, 50][i], 6) + // } + // accept('', 0) + // } + // )[test.hook]"]; + + // install the hook on bob + env(ripple::test::jtx::hook(bob, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), + M("set state_foreign 2"), + HSFEE); + env.close(); + + // invoke the hook + + env(pay(alice, bob, XRP(1)), + M("test state_foreign 2"), + fee(XRP(1))); + } + } + + void + test_state_foreign_set(FeatureBitset features) + { + testcase("Test state_foreign_set"); + using namespace jtx; + + Env env{*this, features}; + // Env env{*this, envconfig(), features, nullptr, + // beast::severities::kTrace + // }; + + auto const david = Account("david"); // grantee generic + auto const cho = Account{"cho"}; // invoker + auto const bob = Account{"bob"}; // grantee specific + auto const alice = Account{"alice"}; // grantor + auto const eve = Account{"eve"}; // grantor with small balance + env.fund(XRP(10000), alice); + env.fund(XRP(10000), bob); + env.fund(XRP(10000), cho); + env.fund(XRP(10000), david); + env.fund(XRP(2600), eve); + + TestHook grantee_wasm = { + 0x43U, 0x1aU, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x16U, 0x73U, 0x66U, 0x49U, 0x6eU, 0x76U, 0x6fU, 0x69U, 0x63U, + 0x65U, 0x49U, 0x44U, 0x20U, 0x49U, 0x4eU, 0x56U, 0x41U, 0x4cU, + 0x49U, 0x44U, 0x5fU, 0x41U, 0x52U, 0x47U, 0x55U, 0x4dU, 0x45U, + 0x4eU, 0x54U, 0x02U, 0x61U, 0x04U, 0x61U, 0x61U, 0x04U, 0x62U, + 0x61U, 0x04U, 0x73U, 0x61U, 0x04U, 0x68U, 0x61U, 0x08U, 0x48U, + 0x6fU, 0x6fU, 0x6bU, 0x2aU, 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, + 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, 0x32U, 0x32U, + 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x02U, 0x78U, + 0x08U, 0x6cU, 0x69U, 0x6eU, 0x65U, 0x0aU, 0x74U, 0x72U, 0x61U, + 0x63U, 0x65U, 0x10U, 0x72U, 0x6fU, 0x6cU, 0x6cU, 0x62U, 0x61U, + 0x63U, 0x6bU, 0x06U, 0x61U, 0x72U, 0x67U, 0x06U, 0x74U, 0x78U, + 0x6eU, 0x0eU, 0x67U, 0x72U, 0x61U, 0x6eU, 0x74U, 0x6fU, 0x72U, + 0x06U, 0x6fU, 0x6eU, 0x65U, 0x08U, 0x7aU, 0x65U, 0x72U, 0x6fU, + 0x22U, 0x73U, 0x74U, 0x61U, 0x74U, 0x65U, 0x5fU, 0x66U, 0x6fU, + 0x72U, 0x65U, 0x69U, 0x67U, 0x6eU, 0x5fU, 0x73U, 0x65U, 0x74U, + 0x18U, 0x68U, 0x6fU, 0x6fU, 0x6bU, 0x5fU, 0x61U, 0x63U, 0x63U, + 0x6fU, 0x75U, 0x6eU, 0x74U, 0x0eU, 0x6fU, 0x74U, 0x78U, 0x6eU, + 0x5fU, 0x69U, 0x64U, 0x14U, 0x6fU, 0x74U, 0x78U, 0x6eU, 0x5fU, + 0x66U, 0x69U, 0x65U, 0x6cU, 0x64U, 0x0aU, 0x73U, 0x6cU, 0x69U, + 0x63U, 0x65U, 0x06U, 0x23U, 0x32U, 0x35U, 0x0cU, 0x61U, 0x63U, + 0x63U, 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, + 0x01U, 0x00U, 0x01U, 0x00U, 0x20U, 0x00U, 0x02U, 0xaaU, 0x0dU, + 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3fU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3fU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe6U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3fU, 0xe7U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3fU, 0xe8U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe9U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3fU, 0xeaU, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3fU, 0xebU, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3eU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe6U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3eU, 0xe7U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3eU, 0xe8U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe9U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3eU, 0xeaU, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3eU, 0xebU, 0x00U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x00U, 0x4dU, + 0xe3U, 0x00U, 0x00U, 0x00U, 0x39U, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x01U, 0x11U, 0x00U, 0x05U, 0x00U, 0x39U, 0xe4U, 0x00U, 0x00U, + 0x00U, 0xbfU, 0xf9U, 0x39U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0x26U, 0x20U, 0x00U, 0x39U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0x26U, 0x14U, 0x00U, 0x39U, + 0xe7U, 0x00U, 0x00U, 0x00U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0x26U, 0x20U, 0x00U, 0xb8U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, + 0x39U, 0xe8U, 0x00U, 0x00U, 0x00U, 0xb8U, 0x26U, 0x01U, 0x00U, + 0x39U, 0xe9U, 0x00U, 0x00U, 0x00U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0x26U, 0x20U, 0x00U, 0xb8U, 0x4cU, 0x20U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x22U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x23U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x24U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x25U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x26U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x27U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x28U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x29U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x2aU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x2bU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x2cU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x2dU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x2eU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x2fU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x30U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x31U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x32U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x33U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x34U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x35U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x36U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x37U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x38U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x39U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x3aU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x3bU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x3cU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x3dU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x3eU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x3fU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x40U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x41U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x42U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x43U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x44U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x45U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x46U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x47U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x48U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x49U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x4aU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x4bU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x4cU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x4dU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x4eU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x4fU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x50U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x51U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x52U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x53U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x54U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x55U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x56U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x57U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x58U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x59U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x5aU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x5bU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x5cU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x5dU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x5eU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x5fU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x60U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x61U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x62U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x63U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x64U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x65U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x66U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x67U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x68U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x69U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x6aU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x6bU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x6cU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x6dU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x6eU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x6fU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x70U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x71U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x72U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x73U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x74U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x75U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x76U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x77U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x78U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x79U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x7aU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x7bU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x7cU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x7dU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x7eU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x7fU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x80U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x81U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x82U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x83U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x84U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x85U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x86U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x87U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x88U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x89U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x8aU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x8bU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x8cU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x8dU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x8eU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x8fU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x90U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x91U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x92U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x93U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x94U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x95U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x96U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x97U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x98U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x99U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x9aU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x9bU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x9cU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x9dU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x9eU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x9fU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xa0U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xa1U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xa2U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xa3U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xa4U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xa5U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xa6U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xa7U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xa8U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xa9U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xaaU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xabU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xacU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xadU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xaeU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xafU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xb0U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xb1U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xb2U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xb3U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xb4U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xb5U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xb6U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xb7U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xb8U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xb9U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xbaU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xbbU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xbcU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xbdU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xbeU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xbfU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xc0U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xc1U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xc2U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xc3U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xc4U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xc5U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xc6U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xc7U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xc8U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xc9U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xcaU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xcbU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xccU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xcdU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xceU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xcfU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xd0U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xd1U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xd2U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xd3U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xd4U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xd5U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xd6U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xd7U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xd8U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xd9U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xdaU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xdbU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xdcU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xddU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xdeU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xdfU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xe0U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xe1U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xe2U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xe3U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xe4U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xe5U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xe6U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xe7U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xe8U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xe9U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xeaU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xebU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xecU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xedU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xeeU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xefU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xf0U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xf1U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xf2U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xf3U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xf4U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xf5U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xf6U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xf7U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xf8U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xf9U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xfaU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xfbU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xfcU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0xfdU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xfeU, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0xffU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x00U, 0x01U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x01U, 0x01U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x02U, 0x01U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x03U, 0x01U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x04U, 0x01U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x05U, 0x01U, 0x00U, 0x80U, 0xb8U, 0x4cU, + 0x06U, 0x01U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x07U, 0x01U, 0x00U, + 0x80U, 0x39U, 0xeaU, 0x00U, 0x00U, 0x00U, 0xc2U, 0x01U, 0x4dU, + 0xebU, 0x00U, 0x00U, 0x00U, 0x39U, 0xebU, 0x00U, 0x00U, 0x00U, + 0xc7U, 0x28U, 0xd8U, 0x03U, 0x01U, 0x3dU, 0x00U, 0x36U, 0x01U, + 0x00U, 0x36U, 0x0eU, 0x3fU, 0x35U, 0x26U, 0x08U, 0x85U, 0x2bU, + 0x1cU, 0x8fU, 0x08U, 0x85U, 0x49U, 0x1cU, 0x30U, 0x08U, 0x85U, + 0x00U, 0x81U, 0x01U, 0x02U, 0x00U, 0x9cU, 0x01U, 0x02U, 0x00U, + 0x9cU, 0x01U, 0x02U, 0x00U, 0x9cU, 0x01U, 0x02U, 0x00U, 0x9cU, + 0x01U, 0x02U, 0x00U, 0x9cU, 0x01U, 0x02U, 0x00U, 0x9cU, 0x01U, + 0x02U, 0x00U, 0x9cU, 0x01U, 0x02U, 0x00U, 0x9cU, 0x01U, 0x02U, + 0x76U, 0x00U, 0x05U, 0x50U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, + 0x02U, 0x00U, 0x02U, 0x04U, 0x00U, 0x00U, 0x24U, 0x02U, 0xdaU, + 0x03U, 0x00U, 0x01U, 0x00U, 0xdcU, 0x03U, 0x00U, 0x01U, 0x00U, + 0xd3U, 0x97U, 0xecU, 0x20U, 0x38U, 0xefU, 0x00U, 0x00U, 0x00U, + 0x04U, 0xeeU, 0x00U, 0x00U, 0x00U, 0xd4U, 0x09U, 0xf3U, 0x0eU, + 0x38U, 0xf0U, 0x00U, 0x00U, 0x00U, 0xd3U, 0x42U, 0x38U, 0x00U, + 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, 0x0eU, 0x29U, + 0xd8U, 0x03U, 0x02U, 0x04U, 0x03U, 0x17U, 0x49U, 0x59U, 0x0cU, + 0x02U, 0x06U, 0x00U, 0x00U, 0x01U, 0x04U, 0x01U, 0x20U, 0x00U, + 0x00U, 0xd8U, 0x08U, 0x05U, 0xe2U, 0x03U, 0x00U, 0x01U, 0x00U, + 0xe4U, 0x03U, 0x01U, 0x00U, 0x30U, 0xe6U, 0x03U, 0x01U, 0x01U, + 0x30U, 0xe8U, 0x03U, 0x01U, 0x02U, 0x30U, 0xeaU, 0x03U, 0x01U, + 0x03U, 0x30U, 0x61U, 0x03U, 0x00U, 0x61U, 0x02U, 0x00U, 0x61U, + 0x01U, 0x00U, 0x61U, 0x00U, 0x00U, 0x38U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, + 0x00U, 0x00U, 0x26U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, + 0x00U, 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, 0x22U, 0x04U, 0x00U, + 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xacU, 0xb8U, 0xf2U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, + 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xc3U, 0x38U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, 0x22U, + 0x04U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xacU, 0xb9U, + 0xf2U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, + 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe8U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, 0x22U, 0x04U, 0x00U, 0x38U, + 0xe5U, 0x00U, 0x00U, 0x00U, 0xacU, 0xbaU, 0xf2U, 0x0eU, 0x38U, + 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, + 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe7U, 0x00U, + 0x00U, 0x00U, 0x22U, 0x04U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, + 0x00U, 0xacU, 0xbbU, 0xf2U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, + 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe8U, 0x00U, 0x00U, 0x00U, 0x22U, + 0x04U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xacU, 0xbcU, + 0xf2U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, + 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x22U, 0x04U, 0x00U, 0x38U, + 0xe5U, 0x00U, 0x00U, 0x00U, 0xacU, 0xbdU, 0xf2U, 0x0eU, 0x38U, + 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, + 0x00U, 0x07U, 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, 0x22U, 0x04U, + 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xacU, 0xbeU, 0xf2U, + 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, + 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0xb7U, 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, + 0x22U, 0x04U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xacU, + 0xbfU, 0x08U, 0xf2U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xf6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, + 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x06U, 0x38U, 0xf7U, + 0x00U, 0x00U, 0x00U, 0xf0U, 0x22U, 0x04U, 0x00U, 0xbfU, 0x20U, + 0xacU, 0xbfU, 0x09U, 0xf2U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, + 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x26U, 0x00U, + 0x00U, 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, 0x22U, 0x04U, 0x00U, + 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xacU, 0xbfU, 0x0aU, 0xf2U, + 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, + 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0xc3U, 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, + 0x22U, 0x04U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xacU, + 0xbfU, 0x0bU, 0xf2U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xf6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, + 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, + 0x00U, 0x00U, 0x07U, 0x22U, 0x04U, 0x00U, 0x38U, 0xe5U, 0x00U, + 0x00U, 0x00U, 0xacU, 0xbfU, 0x0cU, 0xf2U, 0x0eU, 0x38U, 0xe3U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, 0x00U, 0x38U, + 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xb7U, 0x22U, 0x04U, 0x00U, + 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xacU, 0xbfU, 0x0dU, 0xf2U, + 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, + 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x06U, + 0x22U, 0x04U, 0x00U, 0xbfU, 0x20U, 0xacU, 0xbfU, 0x0eU, 0xf2U, + 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, + 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x26U, + 0x00U, 0x00U, 0x22U, 0x04U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, + 0x00U, 0xacU, 0xbfU, 0x0fU, 0xf2U, 0x0eU, 0x38U, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, + 0xe6U, 0x00U, 0x00U, 0x00U, 0xc3U, 0x22U, 0x04U, 0x00U, 0x38U, + 0xe5U, 0x00U, 0x00U, 0x00U, 0xacU, 0xbfU, 0x10U, 0xf2U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, + 0x00U, 0x07U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xf7U, 0x00U, 0x00U, 0x00U, 0xf0U, + 0x22U, 0x04U, 0x00U, 0xb7U, 0xacU, 0xbfU, 0x11U, 0xf2U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, + 0x00U, 0xb7U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xf7U, 0x00U, 0x00U, 0x00U, 0xf0U, + 0x22U, 0x04U, 0x00U, 0xb7U, 0xacU, 0xbfU, 0x12U, 0xf2U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, + 0x00U, 0x06U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xf7U, 0x00U, 0x00U, 0x00U, 0xf0U, + 0x22U, 0x04U, 0x00U, 0xb7U, 0xacU, 0xbfU, 0x13U, 0xf2U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, + 0x00U, 0xc3U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xf7U, 0x00U, 0x00U, 0x00U, 0xf0U, + 0x22U, 0x04U, 0x00U, 0xb7U, 0xacU, 0xbfU, 0x14U, 0xf2U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, + 0x00U, 0x26U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf7U, 0x00U, 0x00U, + 0x00U, 0xf0U, 0x22U, 0x04U, 0x00U, 0xb7U, 0xacU, 0xbfU, 0x15U, + 0xf2U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0x38U, + 0xe6U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xf7U, 0x00U, 0x00U, 0x00U, 0xf0U, 0x22U, 0x04U, 0x00U, + 0xb7U, 0xacU, 0xbfU, 0x16U, 0xf2U, 0x0eU, 0x38U, 0xf8U, 0x00U, + 0x00U, 0x00U, 0xb7U, 0xf1U, 0xcbU, 0x38U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x62U, 0x00U, 0x00U, 0xebU, 0xbfU, 0x20U, 0xacU, 0xbfU, + 0x17U, 0xf2U, 0x0eU, 0x38U, 0xf9U, 0x00U, 0x00U, 0x00U, 0x38U, + 0xe4U, 0x00U, 0x00U, 0x00U, 0xf1U, 0xccU, 0x38U, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xebU, 0xbfU, 0x20U, 0xacU, + 0xbfU, 0x18U, 0xf2U, 0x0eU, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb8U, + 0x26U, 0x20U, 0x00U, 0xcdU, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0x26U, 0x20U, 0x00U, 0xceU, 0x38U, 0xefU, 0x00U, 0x00U, 0x00U, + 0x04U, 0xf3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0x42U, + 0xfaU, 0x00U, 0x00U, 0x00U, 0xbfU, 0x0cU, 0x24U, 0x01U, 0x00U, + 0x09U, 0xf3U, 0x0eU, 0x38U, 0xefU, 0x00U, 0x00U, 0x00U, 0x04U, + 0xfbU, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, 0x00U, + 0x62U, 0x00U, 0x00U, 0x62U, 0x02U, 0x00U, 0x62U, 0x03U, 0x00U, + 0x62U, 0x01U, 0x00U, 0x42U, 0xfaU, 0x00U, 0x00U, 0x00U, 0xbfU, + 0x0cU, 0x24U, 0x01U, 0x00U, 0x22U, 0x04U, 0x00U, 0x0aU, 0xf3U, + 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x02U, 0x00U, 0x62U, + 0x03U, 0x00U, 0x62U, 0x01U, 0x00U, 0x42U, 0xfaU, 0x00U, 0x00U, + 0x00U, 0xbfU, 0x0cU, 0x24U, 0x01U, 0x00U, 0x22U, 0x04U, 0x00U, + 0xbfU, 0x20U, 0xaaU, 0xbfU, 0x19U, 0xf2U, 0x0eU, 0x38U, 0xfcU, + 0x00U, 0x00U, 0x00U, 0xc3U, 0xb7U, 0xf2U, 0x29U, 0xd8U, 0x03U, + 0x21U, 0x27U, 0x3fU, 0xcbU, 0xc1U, 0xd5U, 0xd5U, 0xd5U, 0xd5U, + 0xc1U, 0xc6U, 0xbcU, 0xd0U, 0xc6U, 0xc6U, 0xc6U, 0xb7U, 0xd0U, + 0xc6U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xc1U, 0xcbU, 0x2bU, 0x53U, + 0x3fU, 0x53U, 0x08U, 0x80U, 0x30U, 0x08U, 0x08U, 0x80U, 0x30U, + 0x08U, 0x85U, 0xdaU, 0xd5U, 0x2bU}; + // TestHook grantee_wasm = jswasm[R"[test.hook]( + // var ASSERT = (x, line) => { + // if (!x) { + // trace('line', line, false) + // rollback(x.toString(), line) + // } + // } + // var sfInvoiceID = 327697 + // var INVALID_ARGUMENT = -7 + // var a = [ + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, + // ] + // var aa = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + // var ba = [ + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, + // ] + // var sa = [1] + // var ha = [ + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, + // ] + // var Hook = (arg) => { + // ASSERT(state_foreign_set(a, [], a, aa) === INVALID_ARGUMENT, 1) + // ASSERT(state_foreign_set(a, '', a, aa) === INVALID_ARGUMENT, 2) + // ASSERT(state_foreign_set(a, a, ba, aa) === INVALID_ARGUMENT, 3) + // ASSERT(state_foreign_set(a, a, sa, aa) === INVALID_ARGUMENT, 4) + // ASSERT(state_foreign_set(a, a, a, ba) === INVALID_ARGUMENT, 5) + // ASSERT(state_foreign_set(a, a, a, sa) === INVALID_ARGUMENT, 6) + // ASSERT(state_foreign_set(a, a, null, aa) === INVALID_ARGUMENT, 7) + // ASSERT(state_foreign_set(a, a, 0, aa) === INVALID_ARGUMENT, 8) + // ASSERT(state_foreign_set(a, a, void 0, hook_account()) === 32, 9) + // ASSERT(state_foreign_set(a, a, [], aa) === INVALID_ARGUMENT, 10) + // ASSERT(state_foreign_set(a, a, '', aa) === INVALID_ARGUMENT, 11) + // ASSERT(state_foreign_set(a, a, a, null) === INVALID_ARGUMENT, 12) + // ASSERT(state_foreign_set(a, a, a, 0) === INVALID_ARGUMENT, 13) + // ASSERT(state_foreign_set(a, a, a, void 0) === 32, 14) + // ASSERT(state_foreign_set(a, a, a, []) === INVALID_ARGUMENT, 15) + // ASSERT(state_foreign_set(a, a, a, '') === INVALID_ARGUMENT, 16) + // ASSERT(state_foreign_set(null, a, a, hook_account()) === 0, 17) + // ASSERT(state_foreign_set(0, a, a, hook_account()) === 0, 18) + // ASSERT(state_foreign_set(void 0, a, a, hook_account()) === 0, 19) + // ASSERT(state_foreign_set('', a, a, hook_account()) === 0, 20) + // ASSERT(state_foreign_set([], a, a, hook_account()) === 0, 21) + // ASSERT(state_foreign_set(ha, a, a, hook_account()) === 0, 22) + // const txn = otxn_id(0) + // ASSERT(txn.length === 32, 23) + // const grantor = otxn_field(sfInvoiceID) + // ASSERT(grantor.length === 32, 24) + // const one = [ + // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 0, 0, 0, 0, 0, 0, 1, + // ] + // const zero = [ + // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 0, 0, 0, 0, 0, 0, 0, + // ] + // trace('grantor', grantor.slice(12), false) + // trace('#25', state_foreign_set(txn, one, zero, grantor.slice(12)), true) + // ASSERT(state_foreign_set(txn, one, zero, grantor.slice(12)) == 32, 25) + // accept('', 0) + // } + // )[test.hook]"]; + + HASH_WASM(grantee); + + // this is the grantor + TestHook grantor_wasm = { + 0x43U, 0x18U, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x14U, 0x61U, 0x72U, 0x72U, 0x61U, 0x79U, 0x45U, 0x71U, 0x75U, + 0x61U, 0x6cU, 0x12U, 0x73U, 0x66U, 0x41U, 0x63U, 0x63U, 0x6fU, + 0x75U, 0x6eU, 0x74U, 0x18U, 0x44U, 0x4fU, 0x45U, 0x53U, 0x4eU, + 0x54U, 0x5fU, 0x45U, 0x58U, 0x49U, 0x53U, 0x54U, 0x08U, 0x48U, + 0x6fU, 0x6fU, 0x6bU, 0x2aU, 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, + 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, 0x32U, 0x33U, + 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x02U, 0x78U, + 0x08U, 0x63U, 0x6fU, 0x64U, 0x65U, 0x0aU, 0x74U, 0x72U, 0x61U, + 0x63U, 0x65U, 0x0aU, 0x65U, 0x72U, 0x72U, 0x6fU, 0x72U, 0x10U, + 0x72U, 0x6fU, 0x6cU, 0x6cU, 0x62U, 0x61U, 0x63U, 0x6bU, 0x08U, + 0x61U, 0x72U, 0x72U, 0x31U, 0x08U, 0x61U, 0x72U, 0x72U, 0x32U, + 0x02U, 0x69U, 0x06U, 0x61U, 0x72U, 0x67U, 0x0eU, 0x6fU, 0x74U, + 0x78U, 0x6eU, 0x61U, 0x63U, 0x63U, 0x0eU, 0x68U, 0x6fU, 0x6fU, + 0x6bU, 0x61U, 0x63U, 0x63U, 0x06U, 0x6fU, 0x6eU, 0x65U, 0x08U, + 0x7aU, 0x65U, 0x72U, 0x6fU, 0x02U, 0x79U, 0x14U, 0x6fU, 0x74U, + 0x78U, 0x6eU, 0x5fU, 0x66U, 0x69U, 0x65U, 0x6cU, 0x64U, 0x18U, + 0x68U, 0x6fU, 0x6fU, 0x6bU, 0x5fU, 0x61U, 0x63U, 0x63U, 0x6fU, + 0x75U, 0x6eU, 0x74U, 0x22U, 0x73U, 0x74U, 0x61U, 0x74U, 0x65U, + 0x5fU, 0x66U, 0x6fU, 0x72U, 0x65U, 0x69U, 0x67U, 0x6eU, 0x5fU, + 0x73U, 0x65U, 0x74U, 0x0cU, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, + 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, 0x01U, + 0x00U, 0x01U, 0x00U, 0x03U, 0x69U, 0x01U, 0xa4U, 0x01U, 0x00U, + 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, + 0xe4U, 0x00U, 0x00U, 0x00U, 0x40U, 0x3fU, 0xe5U, 0x00U, 0x00U, + 0x00U, 0x00U, 0x3fU, 0xe6U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, + 0xe7U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x00U, 0xc2U, 0x01U, 0x40U, 0xe4U, 0x00U, 0x00U, 0x00U, + 0x00U, 0x3eU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe6U, + 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe7U, 0x00U, 0x00U, 0x00U, + 0x00U, 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x39U, + 0xe3U, 0x00U, 0x00U, 0x00U, 0x01U, 0x01U, 0x00U, 0x08U, 0x00U, + 0x39U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xbfU, 0xfbU, 0x39U, 0xe6U, + 0x00U, 0x00U, 0x00U, 0xc2U, 0x02U, 0x4dU, 0xe7U, 0x00U, 0x00U, + 0x00U, 0x39U, 0xe7U, 0x00U, 0x00U, 0x00U, 0xc7U, 0x28U, 0xd0U, + 0x03U, 0x01U, 0x0bU, 0x97U, 0x00U, 0x20U, 0x0eU, 0x00U, 0x0cU, + 0x10U, 0x35U, 0x00U, 0x07U, 0x28U, 0x0cU, 0x02U, 0x06U, 0x00U, + 0x00U, 0x02U, 0x00U, 0x02U, 0x04U, 0x00U, 0x00U, 0x24U, 0x02U, + 0xd2U, 0x03U, 0x00U, 0x01U, 0x00U, 0xd4U, 0x03U, 0x00U, 0x01U, + 0x00U, 0xd3U, 0x97U, 0xecU, 0x20U, 0x38U, 0xebU, 0x00U, 0x00U, + 0x00U, 0x04U, 0xecU, 0x00U, 0x00U, 0x00U, 0xb7U, 0x09U, 0xf3U, + 0x0eU, 0x38U, 0xedU, 0x00U, 0x00U, 0x00U, 0xd3U, 0x42U, 0x38U, + 0x00U, 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, 0x0eU, + 0x29U, 0xd0U, 0x03U, 0x02U, 0x04U, 0x03U, 0x17U, 0x49U, 0x59U, + 0x0cU, 0x43U, 0x06U, 0x00U, 0xc8U, 0x03U, 0x02U, 0x01U, 0x02U, + 0x03U, 0x00U, 0x00U, 0x31U, 0x03U, 0xdcU, 0x03U, 0x00U, 0x01U, + 0x00U, 0xdeU, 0x03U, 0x00U, 0x01U, 0x00U, 0xe0U, 0x03U, 0x03U, + 0x00U, 0x20U, 0xd3U, 0xebU, 0xd4U, 0xebU, 0xadU, 0xecU, 0x03U, + 0x09U, 0x28U, 0x61U, 0x00U, 0x00U, 0xb7U, 0xcbU, 0x62U, 0x00U, + 0x00U, 0xd3U, 0xebU, 0xa4U, 0xecU, 0x1aU, 0xd3U, 0x62U, 0x00U, + 0x00U, 0x47U, 0xd4U, 0x62U, 0x00U, 0x00U, 0x47U, 0xadU, 0xecU, + 0x03U, 0x09U, 0x28U, 0x62U, 0x00U, 0x00U, 0x92U, 0x63U, 0x00U, + 0x00U, 0x0eU, 0xeeU, 0xe0U, 0x0aU, 0x28U, 0xd0U, 0x03U, 0x08U, + 0x05U, 0x03U, 0x30U, 0x44U, 0x4eU, 0x35U, 0x0cU, 0x02U, 0x06U, + 0x00U, 0x00U, 0x01U, 0x05U, 0x01U, 0x20U, 0x00U, 0x00U, 0xe4U, + 0x01U, 0x06U, 0xe2U, 0x03U, 0x00U, 0x01U, 0x00U, 0xe4U, 0x03U, + 0x01U, 0x00U, 0x30U, 0xe6U, 0x03U, 0x01U, 0x01U, 0x30U, 0xe8U, + 0x03U, 0x03U, 0x02U, 0x30U, 0xeaU, 0x03U, 0x03U, 0x03U, 0x30U, + 0xecU, 0x03U, 0x03U, 0x04U, 0x30U, 0x61U, 0x01U, 0x00U, 0x61U, + 0x00U, 0x00U, 0x38U, 0xf7U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe5U, + 0x00U, 0x00U, 0x00U, 0xf1U, 0xcbU, 0x38U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x62U, 0x00U, 0x00U, 0xebU, 0xbfU, 0x14U, 0xacU, 0xb7U, + 0xf2U, 0x0eU, 0x38U, 0xf8U, 0x00U, 0x00U, 0x00U, 0xf0U, 0xccU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xebU, + 0xbfU, 0x14U, 0xaaU, 0xb8U, 0xf2U, 0x0eU, 0x38U, 0xe4U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, + 0x6aU, 0x97U, 0x00U, 0x00U, 0x00U, 0x61U, 0x04U, 0x00U, 0x61U, + 0x03U, 0x00U, 0x61U, 0x02U, 0x00U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb8U, 0x26U, 0x20U, 0x00U, 0xcdU, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0x26U, 0x20U, 0x00U, 0xceU, 0x38U, 0xf9U, 0x00U, 0x00U, + 0x00U, 0x38U, 0x46U, 0x00U, 0x00U, 0x00U, 0x62U, 0x02U, 0x00U, + 0x62U, 0x03U, 0x00U, 0x62U, 0x01U, 0x00U, 0x22U, 0x04U, 0x00U, + 0xc5U, 0x04U, 0x38U, 0xebU, 0x00U, 0x00U, 0x00U, 0x04U, 0xf6U, + 0x00U, 0x00U, 0x00U, 0x62U, 0x04U, 0x00U, 0x09U, 0xf3U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x04U, 0x00U, 0xb7U, + 0xacU, 0x11U, 0xedU, 0x0bU, 0x0eU, 0x62U, 0x04U, 0x00U, 0x38U, + 0xe6U, 0x00U, 0x00U, 0x00U, 0xacU, 0xb9U, 0xf2U, 0x0eU, 0x38U, + 0xfaU, 0x00U, 0x00U, 0x00U, 0xc3U, 0xb7U, 0xf2U, 0x29U, 0xd0U, + 0x03U, 0x11U, 0x12U, 0x21U, 0x3fU, 0x4eU, 0x26U, 0x4eU, 0x85U, + 0x08U, 0x80U, 0x30U, 0x08U, 0x08U, 0x80U, 0x30U, 0x08U, 0x7bU, + 0x53U, 0x86U, 0x2bU}; + // TestHook grantor_wasm = jswasm[R"[test.hook]( + // var ASSERT = (x, code) => { + // if (!x) { + // trace('error', 0, false) + // rollback(x.toString(), code) + // } + // } + // function arrayEqual(arr1, arr2) { + // if (arr1.length !== arr2.length) return false + // for (let i = 0; i < arr1.length; i++) { + // if (arr1[i] !== arr2[i]) return false + // } + // return true + // } + // var sfAccount = 524289 + // var DOESNT_EXIST = -5 + // var Hook = (arg) => { + // const otxnacc = otxn_field(sfAccount) + // ASSERT(otxnacc.length === 20, 0) + // const hookacc = hook_account() + // ASSERT(hookacc.length == 20, 1) + // if (arrayEqual(otxnacc, hookacc)) { + // const one = [ + // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 0, 0, 0, 0, 0, 0, 1, + // ] + // const zero = [ + // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 0, 0, 0, 0, 0, 0, 0, + // ] + // const y = state_foreign_set(undefined, one, zero, hookacc) + // trace('y', y, false) + // ASSERT(y === 0 || y === DOESNT_EXIST, 2) + // } + // accept('', 0) + // } + // )[test.hook]"]; + + HASH_WASM(grantor); + + // install the grantor hook on alice + { + Json::Value grants{Json::arrayValue}; + grants[0U][jss::HookGrant] = Json::Value{}; + grants[0U][jss::HookGrant][jss::HookHash] = grantee_hash_str; + grants[0U][jss::HookGrant][jss::Authorize] = bob.human(); + + Json::Value json = ripple::test::jtx::hook( + alice, {{hsov1(grantor_wasm, 1, HSDROPS, overrideFlag)}}, 0); + json[jss::Hooks][0U][jss::Hook][jss::HookGrants] = grants; + + env(json, M("set state_foreign_set"), HSFEE); + env.close(); + } + + // install the grantee hook on bob + { + // invoice ID contains the grantor account + Json::Value json = ripple::test::jtx::hook( + bob, {{hsov1(grantee_wasm, 1, HSDROPS, overrideFlag)}}, 0); + env(json, M("set state_foreign_set 2"), HSFEE); + env.close(); + } + + auto const aliceid = Account("alice").id(); + auto const nsdirkl = keylet::hookStateDir(aliceid, beast::zero); + + std::string const invid = std::string(24, '0') + strHex(alice.id()); + + auto const one = ripple::uint256( + "0000000000000000000000000000000000000000000000000000000000000001"); + + // ensure there's no way the state or directory exist before we start + { + auto const nsdir = env.le(nsdirkl); + BEAST_REQUIRE(!nsdir); + + auto const state1 = + env.le(ripple::keylet::hookState(aliceid, one, beast::zero)); + BEAST_REQUIRE(!state1); + + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 2); + } + + // inovke the grantee hook but supply an account to foreign_set (through + // invoiceid) should definitely fail + { + Json::Value json = pay(cho, bob, XRP(1)); + json[jss::InvoiceID] = + "00000000000000000000000000000000000000000000000000000000000000" + "01"; + env(json, + fee(XRP(1)), + M("test state_foreign_set 6a"), + ter(tecHOOK_REJECTED)); + } + + // invoke the grantee hook but supply a valid account for which no + // grants exist + { + Json::Value json = pay(cho, bob, XRP(1)); + json[jss::InvoiceID] = std::string(24, '0') + strHex(david.id()); + env(json, + fee(XRP(1)), + M("test state_foreign_set 6b"), + ter(tecHOOK_REJECTED)); + { + auto const nsdir = env.le(nsdirkl); + BEAST_REQUIRE(!nsdir); + + auto const state1 = env.le( + ripple::keylet::hookState(david.id(), one, beast::zero)); + BEAST_REQUIRE(!state1); + + BEAST_EXPECT((*env.le("david"))[sfOwnerCount] == 0); + } + } + + // invoke the grantee hook, this will create the state on the grantor + { + Json::Value json = pay(cho, bob, XRP(1)); + json[jss::InvoiceID] = invid; + env(json, + fee(XRP(1)), + M("test state_foreign_set 6"), + ter(tesSUCCESS)); + } + + // check state + { + auto const nsdir = env.le(nsdirkl); + BEAST_REQUIRE(!!nsdir); + + auto const state1 = + env.le(ripple::keylet::hookState(aliceid, one, beast::zero)); + BEAST_REQUIRE(!!state1); + + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 3); + + BEAST_EXPECT(state1->getFieldH256(sfHookStateKey) == one); + + auto const data1 = state1->getFieldVL(sfHookStateData); + BEAST_EXPECT(data1.size() == 32); + BEAST_EXPECT(uint256::fromVoid(data1.data()) == env.txid()); + } + + // invoke the grantor hook, this will delete the state + env(pay(alice, cho, XRP(1)), + M("test state_foreign_set 4"), + fee(XRP(1))); + + // check state was removed + { + auto const nsdir = env.le(nsdirkl); + BEAST_REQUIRE(!nsdir); + + auto const state1 = + env.le(ripple::keylet::hookState(aliceid, one, beast::zero)); + BEAST_REQUIRE(!state1); + + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 2); + } + + // install grantee hook on david + { + // invoice ID contains the grantor account + Json::Value json = ripple::test::jtx::hook( + david, {{hsov1(grantee_wasm, 1, HSDROPS, overrideFlag)}}, 0); + env(json, M("set state_foreign_set 5"), HSFEE); + env.close(); + } + + // invoke daivd, expect failure + { + Json::Value json = pay(cho, david, XRP(1)); + json[jss::InvoiceID] = invid; + env(json, + fee(XRP(1)), + M("test state_foreign_set 6"), + ter(tecHOOK_REJECTED)); + } + + // remove sfAuthorize from alice grants + { + Json::Value grants{Json::arrayValue}; + grants[0U][jss::HookGrant] = Json::Value{}; + grants[0U][jss::HookGrant][jss::HookHash] = grantee_hash_str; + + Json::Value json = ripple::test::jtx::hook( + alice, {{hsov1(grantor_wasm, 1, HSDROPS, overrideFlag)}}, 0); + json[jss::Hooks][0U][jss::Hook][jss::HookGrants] = grants; + + env(json, M("set state_foreign_set 7"), HSFEE); + env.close(); + } + + // invoke david again, expect success + { + Json::Value json = pay(cho, david, XRP(1)); + json[jss::InvoiceID] = invid; + env(json, + fee(XRP(1)), + M("test state_foreign_set 8"), + ter(tesSUCCESS)); + } + + // check state + { + auto const nsdir = env.le(nsdirkl); + BEAST_REQUIRE(!!nsdir); + + auto const state1 = + env.le(ripple::keylet::hookState(aliceid, one, beast::zero)); + BEAST_REQUIRE(!!state1); + + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 3); + + BEAST_EXPECT(state1->getFieldH256(sfHookStateKey) == one); + + auto const data1 = state1->getFieldVL(sfHookStateData); + BEAST_EXPECT(data1.size() == 32); + BEAST_EXPECT(uint256::fromVoid(data1.data()) == env.txid()); + } + + // change alice's namespace + { + Json::Value json = ripple::test::jtx::hook( + alice, {{hsov1(grantor_wasm, 1, HSDROPS, overrideFlag)}}, 0); + json[jss::Hooks][0U][jss::Hook][jss::HookNamespace] = + "77777777777777777777777777777777777777777777777777777777777777" + "77"; + env(json, M("set state_foreign_set 9"), HSFEE); + env.close(); + } + + // invoke david again, expect failure + { + Json::Value json = pay(cho, david, XRP(1)); + json[jss::InvoiceID] = invid; + env(json, + fee(XRP(1)), + M("test state_foreign_set 10"), + ter(tecHOOK_REJECTED)); + } + + // check reserve exhaustion + TestHook exhaustion_wasm = { + 0x43U, 0x16U, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x16U, 0x73U, 0x66U, 0x49U, 0x6eU, 0x76U, 0x6fU, 0x69U, 0x63U, + 0x65U, 0x49U, 0x44U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x2aU, + 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, + 0x73U, 0x74U, 0x2dU, 0x32U, 0x34U, 0x2dU, 0x67U, 0x65U, 0x6eU, + 0x2eU, 0x6aU, 0x73U, 0x02U, 0x78U, 0x08U, 0x63U, 0x6fU, 0x64U, + 0x65U, 0x0aU, 0x74U, 0x72U, 0x61U, 0x63U, 0x65U, 0x0aU, 0x65U, + 0x72U, 0x72U, 0x6fU, 0x72U, 0x10U, 0x72U, 0x6fU, 0x6cU, 0x6cU, + 0x62U, 0x61U, 0x63U, 0x6bU, 0x06U, 0x61U, 0x72U, 0x67U, 0x06U, + 0x74U, 0x78U, 0x6eU, 0x0eU, 0x67U, 0x72U, 0x61U, 0x6eU, 0x74U, + 0x6fU, 0x72U, 0x14U, 0x69U, 0x74U, 0x65U, 0x72U, 0x61U, 0x74U, + 0x69U, 0x6fU, 0x6eU, 0x73U, 0x08U, 0x7aU, 0x65U, 0x72U, 0x6fU, + 0x02U, 0x69U, 0x0eU, 0x6fU, 0x74U, 0x78U, 0x6eU, 0x5fU, 0x69U, + 0x64U, 0x14U, 0x6fU, 0x74U, 0x78U, 0x6eU, 0x5fU, 0x66U, 0x69U, + 0x65U, 0x6cU, 0x64U, 0x1cU, 0x65U, 0x78U, 0x68U, 0x61U, 0x75U, + 0x73U, 0x74U, 0x69U, 0x6fU, 0x6eU, 0x20U, 0x69U, 0x3aU, 0x20U, + 0x20U, 0x65U, 0x78U, 0x68U, 0x61U, 0x75U, 0x73U, 0x74U, 0x69U, + 0x6fU, 0x6eU, 0x20U, 0x74U, 0x78U, 0x6eU, 0x3aU, 0x20U, 0x22U, + 0x73U, 0x74U, 0x61U, 0x74U, 0x65U, 0x5fU, 0x66U, 0x6fU, 0x72U, + 0x65U, 0x69U, 0x67U, 0x6eU, 0x5fU, 0x73U, 0x65U, 0x74U, 0x0aU, + 0x73U, 0x6cU, 0x69U, 0x63U, 0x65U, 0x0cU, 0x61U, 0x63U, 0x63U, + 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, + 0x00U, 0x01U, 0x00U, 0x01U, 0x00U, 0x02U, 0x48U, 0x01U, 0xa4U, + 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x00U, 0x3fU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe5U, + 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x00U, 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe5U, + 0x00U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x39U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x01U, 0x11U, + 0x00U, 0x05U, 0x00U, 0x39U, 0xe4U, 0x00U, 0x00U, 0x00U, 0xc2U, + 0x01U, 0x4dU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x39U, 0xe5U, 0x00U, + 0x00U, 0x00U, 0xc7U, 0x28U, 0xccU, 0x03U, 0x01U, 0x08U, 0x5bU, + 0x00U, 0x12U, 0x0eU, 0x3fU, 0x00U, 0x0aU, 0x2aU, 0x0cU, 0x02U, + 0x06U, 0x00U, 0x00U, 0x02U, 0x00U, 0x02U, 0x04U, 0x00U, 0x00U, + 0x24U, 0x02U, 0xceU, 0x03U, 0x00U, 0x01U, 0x00U, 0xd0U, 0x03U, + 0x00U, 0x01U, 0x00U, 0xd3U, 0x97U, 0xecU, 0x20U, 0x38U, 0xe9U, + 0x00U, 0x00U, 0x00U, 0x04U, 0xeaU, 0x00U, 0x00U, 0x00U, 0xb7U, + 0x09U, 0xf3U, 0x0eU, 0x38U, 0xebU, 0x00U, 0x00U, 0x00U, 0xd3U, + 0x42U, 0x38U, 0x00U, 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, 0xd4U, + 0xf2U, 0x0eU, 0x29U, 0xccU, 0x03U, 0x02U, 0x04U, 0x03U, 0x17U, + 0x49U, 0x59U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x01U, 0x05U, + 0x01U, 0x20U, 0x00U, 0x00U, 0x8dU, 0x02U, 0x06U, 0xd8U, 0x03U, + 0x00U, 0x01U, 0x00U, 0xdaU, 0x03U, 0x01U, 0x00U, 0x30U, 0xdcU, + 0x03U, 0x01U, 0x01U, 0x30U, 0xdeU, 0x03U, 0x01U, 0x02U, 0x30U, + 0xe0U, 0x03U, 0x01U, 0x03U, 0x30U, 0xe2U, 0x03U, 0x02U, 0x04U, + 0x20U, 0x61U, 0x03U, 0x00U, 0x61U, 0x02U, 0x00U, 0x61U, 0x01U, + 0x00U, 0x61U, 0x00U, 0x00U, 0x38U, 0xf2U, 0x00U, 0x00U, 0x00U, + 0xb7U, 0xf1U, 0xcbU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, + 0x00U, 0x00U, 0xebU, 0xbfU, 0x20U, 0xacU, 0xb7U, 0xf2U, 0x0eU, + 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x04U, 0xedU, 0x00U, 0x00U, + 0x00U, 0x62U, 0x00U, 0x00U, 0x0aU, 0xf3U, 0x0eU, 0x38U, 0xf3U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0xf1U, + 0xccU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, + 0xebU, 0xbfU, 0x20U, 0xacU, 0xb8U, 0xf2U, 0x0eU, 0x62U, 0x01U, + 0x00U, 0xb7U, 0x47U, 0xcdU, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, + 0x04U, 0xefU, 0x00U, 0x00U, 0x00U, 0x62U, 0x02U, 0x00U, 0x09U, + 0xf3U, 0x0eU, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0x26U, 0x20U, + 0x00U, 0xceU, 0x61U, 0x04U, 0x00U, 0xb7U, 0xc5U, 0x04U, 0x62U, + 0x04U, 0x00U, 0x62U, 0x02U, 0x00U, 0xa4U, 0xecU, 0x6eU, 0x62U, + 0x00U, 0x00U, 0xb7U, 0x73U, 0x62U, 0x04U, 0x00U, 0x49U, 0x38U, + 0xe9U, 0x00U, 0x00U, 0x00U, 0x04U, 0xf4U, 0x00U, 0x00U, 0x00U, + 0x62U, 0x04U, 0x00U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xe9U, 0x00U, + 0x00U, 0x00U, 0x04U, 0xf5U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, + 0x00U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, + 0x04U, 0xf5U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x0aU, + 0xf3U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf6U, + 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, + 0x62U, 0x03U, 0x00U, 0x62U, 0x01U, 0x00U, 0x42U, 0xf7U, 0x00U, + 0x00U, 0x00U, 0xbfU, 0x0cU, 0x24U, 0x01U, 0x00U, 0x22U, 0x04U, + 0x00U, 0xbfU, 0x20U, 0xaaU, 0xb9U, 0xf2U, 0x0eU, 0x62U, 0x04U, + 0x00U, 0x90U, 0x11U, 0x63U, 0x04U, 0x00U, 0x0eU, 0xeeU, 0x8bU, + 0x38U, 0xf8U, 0x00U, 0x00U, 0x00U, 0xc3U, 0xb7U, 0xf2U, 0x29U, + 0xccU, 0x03U, 0x09U, 0x14U, 0x3fU, 0x2bU, 0x4eU, 0x53U, 0x3fU, + 0x4eU, 0x21U, 0x53U, 0x08U, 0x80U, 0x30U, 0x08U, 0x4eU, 0x30U, + 0x53U, 0x53U, 0x53U, 0xd0U, 0x3aU, 0x2bU}; + // TestHook exhaustion_wasm = jswasm[R"[test.hook]( + // var ASSERT = (x, code) => { + // if (!x) { + // trace('error', 0, false) + // rollback(x.toString(), code) + // } + // } + // var sfInvoiceID = 327697 + // var Hook = (arg) => { + // let txn = otxn_id(0) + // ASSERT(txn.length === 32, 0) + // trace('txn', txn, true) + // const grantor = otxn_field(sfInvoiceID) + // ASSERT(grantor.length === 32, 1) + // const iterations = grantor[0] + // trace('iterations', iterations, false) + // const zero = [ + // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 0, 0, 0, 0, 0, 0, 0, + // ] + // for (let i = 0; i < iterations; ++i) { + // txn[0] = i + // trace('exhaustion i: ', i, false) + // trace('exhaustion txn: ', txn, false) + // trace('exhaustion txn: ', txn, true) + // ASSERT(state_foreign_set(txn, txn, zero, grantor.slice(12)) == 32, 2) + // } + // accept('', 0) + // } + // )[test.hook]"]; + + HASH_WASM(exhaustion); + + // install the grantor hook on eve + { + Json::Value grants{Json::arrayValue}; + grants[0U][jss::HookGrant] = Json::Value{}; + grants[0U][jss::HookGrant][jss::HookHash] = exhaustion_hash_str; + grants[0U][jss::HookGrant][jss::Authorize] = bob.human(); + + Json::Value json = ripple::test::jtx::hook( + eve, {{hsov1(grantor_wasm, 1, HSDROPS, overrideFlag)}}, 0); + json[jss::Hooks][0U][jss::Hook][jss::HookGrants] = grants; + + env(json, M("set state_foreign_set 11"), HSFEE); + env.close(); + } + + // install exhaustion grantee on bob + { + Json::Value json = ripple::test::jtx::hook( + bob, {{hsov1(exhaustion_wasm, 1, HSDROPS, overrideFlag)}}, 0); + env(json, M("set state_foreign_set 12"), HSFEE); + env.close(); + } + + // now invoke repeatedly until exhaustion is reached + { + Json::Value json = pay(cho, bob, XRP(1)); + json[jss::InvoiceID] = + "01" + std::string(22, '0') + strHex(eve.id()); + + // 2500 xrp less 1 account reserve (200) divided by 50xrp per object + // reserve = 46 objects of these we already have: 1 hook, 1 + // sfAuthorize, so 44 objects can be allocated + env(json, + fee(XRP(1)), + M("test state_foreign_set 13"), + ter(tesSUCCESS)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 3); + + // now we have allocated 1 state object, so 43 more can be allocated + + // try to set 44 state entries, this will fail + json[jss::InvoiceID] = + "2C" + std::string(22, '0') + strHex(eve.id()); + env(json, + fee(XRP(1)), + M("test state_foreign_set 14"), + ter(tecHOOK_REJECTED)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 3); + + // try to set 43 state objects, this will succeed + json[jss::InvoiceID] = + "2B" + std::string(22, '0') + strHex(eve.id()); + env(json, + fee(XRP(1)), + M("test state_foreign_set 15"), + ter(tesSUCCESS)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 46); + + // try to set one state object, this will fail + env(json, + fee(XRP(1)), + M("test state_foreign_set 16"), + ter(tecHOOK_REJECTED)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 46); + } + } + + void + test_state_set(FeatureBitset features) + { + testcase("Test state_set"); + using namespace jtx; + + Env env{*this, features}; + // Env env{*this, envconfig(), features, nullptr, + // beast::severities::kTrace + // }; + + + auto const bob = Account{"bob"}; + auto const alice = Account{"alice"}; + auto const cho = Account{"cho"}; + auto const david = Account{"david"}; + auto const eve = Account{"eve"}; // small balance + auto const frank = Account{"frank"}; // big balance + env.fund(XRP(10000), alice); + env.fund(XRP(10000), bob); + env.fund(XRP(10000), cho); + env.fund(XRP(1000000), david); + env.fund(XRP(2600), eve); + env.fund(XRP(1000000000), frank); + + // install a rollback hook on cho + env(ripple::test::jtx::hook( + cho, {{hsov1(rollback_wasm, 1, HSDROPS, overrideFlag)}}, 0), + M("set state_set rollback"), + HSFEE); + env.close(); + + auto const aliceid = Account("alice").id(); + + auto const nsdirkl = keylet::hookStateDir(aliceid, beast::zero); + + // ensure there's no way the state or directory exist before we start + { + auto const nsdir = env.le(nsdirkl); + BEAST_REQUIRE(!nsdir); + + auto const state1 = env.le( + ripple::keylet::hookState(aliceid, beast::zero, beast::zero)); + BEAST_REQUIRE(!state1); + + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 0); + } + + // first hook will set two state objects with different keys and data on + // alice + { + TestHook hook = { + 0x43U, 0x12U, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x20U, 0x49U, 0x4eU, 0x56U, 0x41U, 0x4cU, 0x49U, 0x44U, 0x5fU, + 0x41U, 0x52U, 0x47U, 0x55U, 0x4dU, 0x45U, 0x4eU, 0x54U, 0x02U, + 0x61U, 0x04U, 0x62U, 0x61U, 0x04U, 0x68U, 0x61U, 0x0aU, 0x64U, + 0x61U, 0x74U, 0x61U, 0x32U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, + 0x2aU, 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, + 0x65U, 0x73U, 0x74U, 0x2dU, 0x32U, 0x35U, 0x2dU, 0x67U, 0x65U, + 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x02U, 0x78U, 0x08U, 0x6cU, 0x69U, + 0x6eU, 0x65U, 0x0aU, 0x74U, 0x72U, 0x61U, 0x63U, 0x65U, 0x10U, + 0x72U, 0x6fU, 0x6cU, 0x6cU, 0x62U, 0x61U, 0x63U, 0x6bU, 0x06U, + 0x61U, 0x72U, 0x67U, 0x06U, 0x6bU, 0x65U, 0x79U, 0x08U, 0x64U, + 0x61U, 0x74U, 0x61U, 0x08U, 0x6bU, 0x65U, 0x79U, 0x32U, 0x12U, + 0x73U, 0x74U, 0x61U, 0x74U, 0x65U, 0x5fU, 0x73U, 0x65U, 0x74U, + 0x0cU, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, + 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, 0x20U, 0x00U, + 0x02U, 0x80U, 0x13U, 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, 0x00U, + 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe4U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3fU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3fU, 0xe6U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe7U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3fU, 0xe8U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3fU, 0xe9U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3eU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe6U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3eU, 0xe7U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3eU, 0xe8U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe9U, 0x00U, + 0x00U, 0x00U, 0x00U, 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x39U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0xf9U, 0x39U, + 0xe4U, 0x00U, 0x00U, 0x00U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0x26U, 0x20U, 0x00U, 0x39U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0x26U, 0x20U, 0x00U, 0xb8U, 0x4cU, + 0x20U, 0x00U, 0x00U, 0x80U, 0x39U, 0xe6U, 0x00U, 0x00U, 0x00U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0x26U, 0x20U, 0x00U, 0xb8U, + 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x21U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x22U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x23U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x24U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x25U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x26U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x27U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x28U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x29U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x2aU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x2bU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x2cU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x2dU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x2eU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x2fU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x30U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x31U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x32U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x33U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x34U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x35U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x36U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x37U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x38U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x39U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x3aU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x3bU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x3cU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x3dU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x3eU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x3fU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x40U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x41U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x42U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x43U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x44U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x45U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x46U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x47U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x48U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x49U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x4aU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x4bU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x4cU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x4dU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x4eU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x4fU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x50U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x51U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x52U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x53U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x54U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x55U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x56U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x57U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x58U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x59U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x5aU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x5bU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x5cU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x5dU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x5eU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x5fU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x60U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x61U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x62U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x63U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x64U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x65U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x66U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x67U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x68U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x69U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x6aU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x6bU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x6cU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x6dU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x6eU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x6fU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x70U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x71U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x72U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x73U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x74U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x75U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x76U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x77U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x78U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x79U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x7aU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x7bU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x7cU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x7dU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x7eU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x7fU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x80U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x81U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x82U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x83U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x84U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x85U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x86U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x87U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x88U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x89U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x8aU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x8bU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x8cU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x8dU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x8eU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x8fU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x90U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x91U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x92U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x93U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x94U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x95U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x96U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x97U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x98U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x99U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x9aU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x9bU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x9cU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x9dU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x9eU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x9fU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xa0U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xa1U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xa2U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xa3U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xa4U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xa5U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xa6U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xa7U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xa8U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xa9U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xaaU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xabU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xacU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xadU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xaeU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xafU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xb0U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xb1U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xb2U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xb3U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xb4U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xb5U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xb6U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xb7U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xb8U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xb9U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xbaU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xbbU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xbcU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xbdU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xbeU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xbfU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xc0U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xc1U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xc2U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xc3U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xc4U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xc5U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xc6U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xc7U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xc8U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xc9U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xcaU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xcbU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xccU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xcdU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xceU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xcfU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xd0U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xd1U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xd2U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xd3U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xd4U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xd5U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xd6U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xd7U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xd8U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xd9U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xdaU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xdbU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xdcU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xddU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xdeU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xdfU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xe0U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xe1U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xe2U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xe3U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xe4U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xe5U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xe6U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xe7U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xe8U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xe9U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xeaU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xebU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xecU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xedU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xeeU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xefU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xf0U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xf1U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xf2U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xf3U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xf4U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xf5U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xf6U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xf7U, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xf8U, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xf9U, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xfaU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xfbU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xfcU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0xfdU, 0x00U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0xfeU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0xffU, 0x00U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x00U, 0x01U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x01U, 0x01U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x02U, 0x01U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x03U, 0x01U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x04U, 0x01U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x05U, 0x01U, + 0x00U, 0x80U, 0xb8U, 0x4cU, 0x06U, 0x01U, 0x00U, 0x80U, 0xb8U, + 0x4cU, 0x07U, 0x01U, 0x00U, 0x80U, 0x39U, 0xe7U, 0x00U, 0x00U, + 0x00U, 0xbfU, 0x23U, 0xbfU, 0x13U, 0xc0U, 0x96U, 0x00U, 0xbfU, + 0x68U, 0xbfU, 0x78U, 0xc0U, 0xdcU, 0x00U, 0xc0U, 0xabU, 0x00U, + 0xc0U, 0xc4U, 0x00U, 0xbfU, 0x40U, 0xbfU, 0x26U, 0xbeU, 0xbfU, + 0x2bU, 0xc0U, 0xa3U, 0x00U, 0xc0U, 0xd2U, 0x00U, 0xbfU, 0x0cU, + 0xbfU, 0x69U, 0xbfU, 0x40U, 0xc0U, 0xddU, 0x00U, 0xc0U, 0xcdU, + 0x00U, 0xc0U, 0xe7U, 0x00U, 0xbfU, 0x38U, 0xc0U, 0x9bU, 0x00U, + 0xbfU, 0x0bU, 0xc0U, 0xa9U, 0x00U, 0xbfU, 0x6cU, 0xbfU, 0x3cU, + 0xc0U, 0xb3U, 0x00U, 0xc0U, 0x87U, 0x00U, 0xbfU, 0x37U, 0xb9U, + 0xc0U, 0x81U, 0x00U, 0xc0U, 0xe8U, 0x00U, 0x26U, 0x20U, 0x00U, + 0xbfU, 0x2bU, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xddU, + 0x00U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x5dU, 0x4cU, + 0x22U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xbbU, 0x00U, 0x4cU, 0x23U, + 0x00U, 0x00U, 0x80U, 0xbfU, 0x40U, 0x4cU, 0x24U, 0x00U, 0x00U, + 0x80U, 0xc0U, 0xd9U, 0x00U, 0x4cU, 0x25U, 0x00U, 0x00U, 0x80U, + 0xbfU, 0x66U, 0x4cU, 0x26U, 0x00U, 0x00U, 0x80U, 0xc0U, 0x96U, + 0x00U, 0x4cU, 0x27U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x6fU, 0x4cU, + 0x28U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xc1U, 0x00U, 0x4cU, 0x29U, + 0x00U, 0x00U, 0x80U, 0xbfU, 0x6bU, 0x4cU, 0x2aU, 0x00U, 0x00U, + 0x80U, 0xc0U, 0xe8U, 0x00U, 0x4cU, 0x2bU, 0x00U, 0x00U, 0x80U, + 0xc0U, 0xd4U, 0x00U, 0x4cU, 0x2cU, 0x00U, 0x00U, 0x80U, 0xbfU, + 0x7cU, 0x4cU, 0x2dU, 0x00U, 0x00U, 0x80U, 0xbfU, 0x7bU, 0x4cU, + 0x2eU, 0x00U, 0x00U, 0x80U, 0xbfU, 0x62U, 0x4cU, 0x2fU, 0x00U, + 0x00U, 0x80U, 0xbfU, 0x14U, 0x4cU, 0x30U, 0x00U, 0x00U, 0x80U, + 0xbfU, 0x4cU, 0x4cU, 0x31U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xd1U, + 0x00U, 0x4cU, 0x32U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x4bU, 0x4cU, + 0x33U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xaaU, 0x00U, 0x4cU, 0x34U, + 0x00U, 0x00U, 0x80U, 0xc0U, 0x99U, 0x00U, 0x4cU, 0x35U, 0x00U, + 0x00U, 0x80U, 0xbfU, 0x36U, 0x4cU, 0x36U, 0x00U, 0x00U, 0x80U, + 0xbfU, 0x75U, 0x4cU, 0x37U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xe9U, + 0x00U, 0x4cU, 0x38U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x22U, 0x4cU, + 0x39U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xadU, 0x00U, 0x4cU, 0x3aU, + 0x00U, 0x00U, 0x80U, 0xbfU, 0x0fU, 0x4cU, 0x3bU, 0x00U, 0x00U, + 0x80U, 0xbfU, 0x5fU, 0x4cU, 0x3cU, 0x00U, 0x00U, 0x80U, 0xc0U, + 0x94U, 0x00U, 0x4cU, 0x3dU, 0x00U, 0x00U, 0x80U, 0xbfU, 0x1dU, + 0x4cU, 0x3eU, 0x00U, 0x00U, 0x80U, 0xc0U, 0x86U, 0x00U, 0x4cU, + 0x3fU, 0x00U, 0x00U, 0x80U, 0xc0U, 0xebU, 0x00U, 0x4cU, 0x40U, + 0x00U, 0x00U, 0x80U, 0xc0U, 0xa8U, 0x00U, 0x4cU, 0x41U, 0x00U, + 0x00U, 0x80U, 0xbfU, 0x13U, 0x4cU, 0x42U, 0x00U, 0x00U, 0x80U, + 0xc0U, 0x99U, 0x00U, 0x4cU, 0x43U, 0x00U, 0x00U, 0x80U, 0xc0U, + 0xf9U, 0x00U, 0x4cU, 0x44U, 0x00U, 0x00U, 0x80U, 0xc0U, 0x98U, + 0x00U, 0x4cU, 0x45U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xffU, 0x00U, + 0x4cU, 0x46U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xcaU, 0x00U, 0x4cU, + 0x47U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x5bU, 0x4cU, 0x48U, 0x00U, + 0x00U, 0x80U, 0xc0U, 0x86U, 0x00U, 0x4cU, 0x49U, 0x00U, 0x00U, + 0x80U, 0xbfU, 0x2fU, 0x4cU, 0x4aU, 0x00U, 0x00U, 0x80U, 0xc0U, + 0xdfU, 0x00U, 0x4cU, 0x4bU, 0x00U, 0x00U, 0x80U, 0xbfU, 0x67U, + 0x4cU, 0x4cU, 0x00U, 0x00U, 0x80U, 0xc0U, 0x8fU, 0x00U, 0x4cU, + 0x4dU, 0x00U, 0x00U, 0x80U, 0xc0U, 0xe2U, 0x00U, 0x4cU, 0x4eU, + 0x00U, 0x00U, 0x80U, 0xc0U, 0xe3U, 0x00U, 0x4cU, 0x4fU, 0x00U, + 0x00U, 0x80U, 0xc0U, 0xc3U, 0x00U, 0x4cU, 0x50U, 0x00U, 0x00U, + 0x80U, 0xbfU, 0x37U, 0x4cU, 0x51U, 0x00U, 0x00U, 0x80U, 0xc0U, + 0xccU, 0x00U, 0x4cU, 0x52U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x47U, + 0x4cU, 0x53U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x0fU, 0x4cU, 0x54U, + 0x00U, 0x00U, 0x80U, 0xbfU, 0x33U, 0x4cU, 0x55U, 0x00U, 0x00U, + 0x80U, 0xc0U, 0x88U, 0x00U, 0x4cU, 0x56U, 0x00U, 0x00U, 0x80U, + 0xc0U, 0xb0U, 0x00U, 0x4cU, 0x57U, 0x00U, 0x00U, 0x80U, 0xbfU, + 0x33U, 0x4cU, 0x58U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x3bU, 0x4cU, + 0x59U, 0x00U, 0x00U, 0x80U, 0xb9U, 0x4cU, 0x5aU, 0x00U, 0x00U, + 0x80U, 0xbfU, 0x55U, 0x4cU, 0x5bU, 0x00U, 0x00U, 0x80U, 0xbfU, + 0x67U, 0x4cU, 0x5cU, 0x00U, 0x00U, 0x80U, 0xbfU, 0x16U, 0x4cU, + 0x5dU, 0x00U, 0x00U, 0x80U, 0xc0U, 0xa4U, 0x00U, 0x4cU, 0x5eU, + 0x00U, 0x00U, 0x80U, 0xc0U, 0xfbU, 0x00U, 0x4cU, 0x5fU, 0x00U, + 0x00U, 0x80U, 0xc0U, 0x8eU, 0x00U, 0x4cU, 0x60U, 0x00U, 0x00U, + 0x80U, 0xc0U, 0x85U, 0x00U, 0x4cU, 0x61U, 0x00U, 0x00U, 0x80U, + 0xbfU, 0x6fU, 0x4cU, 0x62U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xd8U, + 0x00U, 0x4cU, 0x63U, 0x00U, 0x00U, 0x80U, 0xc0U, 0x84U, 0x00U, + 0x4cU, 0x64U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x16U, 0x4cU, 0x65U, + 0x00U, 0x00U, 0x80U, 0xc0U, 0xa3U, 0x00U, 0x4cU, 0x66U, 0x00U, + 0x00U, 0x80U, 0xbfU, 0x54U, 0x4cU, 0x67U, 0x00U, 0x00U, 0x80U, + 0xbfU, 0x18U, 0x4cU, 0x68U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x34U, + 0x4cU, 0x69U, 0x00U, 0x00U, 0x80U, 0xbdU, 0x4cU, 0x6aU, 0x00U, + 0x00U, 0x80U, 0xbfU, 0x0eU, 0x4cU, 0x6bU, 0x00U, 0x00U, 0x80U, + 0xc0U, 0xf6U, 0x00U, 0x4cU, 0x6cU, 0x00U, 0x00U, 0x80U, 0xbfU, + 0x65U, 0x4cU, 0x6dU, 0x00U, 0x00U, 0x80U, 0xbfU, 0x34U, 0x4cU, + 0x6eU, 0x00U, 0x00U, 0x80U, 0xbcU, 0x4cU, 0x6fU, 0x00U, 0x00U, + 0x80U, 0xbfU, 0x26U, 0x4cU, 0x70U, 0x00U, 0x00U, 0x80U, 0xbfU, + 0x7eU, 0x4cU, 0x71U, 0x00U, 0x00U, 0x80U, 0xbcU, 0x4cU, 0x72U, + 0x00U, 0x00U, 0x80U, 0xbfU, 0x74U, 0x4cU, 0x73U, 0x00U, 0x00U, + 0x80U, 0xc0U, 0xdaU, 0x00U, 0x4cU, 0x74U, 0x00U, 0x00U, 0x80U, + 0xbfU, 0x09U, 0x4cU, 0x75U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xbfU, + 0x00U, 0x4cU, 0x76U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x55U, 0x4cU, + 0x77U, 0x00U, 0x00U, 0x80U, 0xc0U, 0x8cU, 0x00U, 0x4cU, 0x78U, + 0x00U, 0x00U, 0x80U, 0xbfU, 0x75U, 0x4cU, 0x79U, 0x00U, 0x00U, + 0x80U, 0xc0U, 0x92U, 0x00U, 0x4cU, 0x7aU, 0x00U, 0x00U, 0x80U, + 0xc0U, 0xacU, 0x00U, 0x4cU, 0x7bU, 0x00U, 0x00U, 0x80U, 0xbfU, + 0x33U, 0x4cU, 0x7cU, 0x00U, 0x00U, 0x80U, 0xc0U, 0xfbU, 0x00U, + 0x4cU, 0x7dU, 0x00U, 0x00U, 0x80U, 0xb8U, 0x4cU, 0x7eU, 0x00U, + 0x00U, 0x80U, 0xc0U, 0x8dU, 0x00U, 0x4cU, 0x7fU, 0x00U, 0x00U, + 0x80U, 0x39U, 0xe8U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x01U, 0x4dU, + 0xe9U, 0x00U, 0x00U, 0x00U, 0x39U, 0xe9U, 0x00U, 0x00U, 0x00U, + 0xc7U, 0x28U, 0xd4U, 0x03U, 0x01U, 0x51U, 0xd3U, 0x00U, 0x2aU, + 0x0eU, 0x3fU, 0x26U, 0x08U, 0x85U, 0x2bU, 0x1cU, 0x08U, 0x85U, + 0x49U, 0x1cU, 0x08U, 0x85U, 0x00U, 0x81U, 0x01U, 0x02U, 0x00U, + 0x9cU, 0x01U, 0x02U, 0x00U, 0x9cU, 0x01U, 0x02U, 0x00U, 0x9cU, + 0x01U, 0x02U, 0x00U, 0x9cU, 0x01U, 0x02U, 0x00U, 0x9cU, 0x01U, + 0x02U, 0x00U, 0x9cU, 0x01U, 0x02U, 0x00U, 0x9cU, 0x01U, 0x02U, + 0x00U, 0x9cU, 0x01U, 0x02U, 0x76U, 0x1cU, 0x0dU, 0xcbU, 0x00U, + 0x37U, 0x02U, 0x00U, 0x77U, 0x02U, 0x00U, 0x80U, 0x01U, 0x02U, + 0x00U, 0x7bU, 0x02U, 0x00U, 0x7eU, 0x02U, 0x00U, 0x7fU, 0x02U, + 0x00U, 0x48U, 0x02U, 0x00U, 0x05U, 0x1aU, 0x0cU, 0x02U, 0x06U, + 0x00U, 0x00U, 0x02U, 0x00U, 0x02U, 0x04U, 0x00U, 0x00U, 0x24U, + 0x02U, 0xd6U, 0x03U, 0x00U, 0x01U, 0x00U, 0xd8U, 0x03U, 0x00U, + 0x01U, 0x00U, 0xd3U, 0x97U, 0xecU, 0x20U, 0x38U, 0xedU, 0x00U, + 0x00U, 0x00U, 0x04U, 0xecU, 0x00U, 0x00U, 0x00U, 0xd4U, 0x09U, + 0xf3U, 0x0eU, 0x38U, 0xeeU, 0x00U, 0x00U, 0x00U, 0xd3U, 0x42U, + 0x38U, 0x00U, 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, + 0x0eU, 0x29U, 0xd4U, 0x03U, 0x02U, 0x04U, 0x03U, 0x17U, 0x49U, + 0x59U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x01U, 0x03U, 0x01U, + 0x20U, 0x00U, 0x00U, 0xbdU, 0x01U, 0x04U, 0xdeU, 0x03U, 0x00U, + 0x01U, 0x00U, 0xe0U, 0x03U, 0x01U, 0x00U, 0x30U, 0xe2U, 0x03U, + 0x01U, 0x01U, 0x30U, 0xe4U, 0x03U, 0x01U, 0x02U, 0x30U, 0x61U, + 0x02U, 0x00U, 0x61U, 0x01U, 0x00U, 0x61U, 0x00U, 0x00U, 0x38U, + 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf3U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, + 0x00U, 0xf2U, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0xacU, 0xbfU, + 0x0bU, 0xf2U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, + 0xf3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, 0xf2U, 0x38U, 0xe4U, 0x00U, + 0x00U, 0x00U, 0xacU, 0xbfU, 0x0cU, 0xf2U, 0x0eU, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0x26U, 0x20U, 0x00U, 0xcbU, 0xc0U, 0xcaU, + 0x00U, 0xc0U, 0xfeU, 0x00U, 0xc0U, 0xbaU, 0x00U, 0xc0U, 0xbeU, + 0x00U, 0x26U, 0x04U, 0x00U, 0xccU, 0x38U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x38U, 0xf3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, + 0x62U, 0x00U, 0x00U, 0xf2U, 0xbbU, 0xacU, 0xbfU, 0x0dU, 0xf2U, + 0x0eU, 0xb8U, 0xb9U, 0xbaU, 0x26U, 0x03U, 0x00U, 0xcdU, 0x38U, + 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf3U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe8U, 0x00U, 0x00U, 0x00U, 0x62U, 0x02U, 0x00U, 0xf2U, + 0xc0U, 0x80U, 0x00U, 0xacU, 0xbfU, 0x0eU, 0xf2U, 0x0eU, 0x38U, + 0xf4U, 0x00U, 0x00U, 0x00U, 0xc3U, 0xb7U, 0xf2U, 0x29U, 0xd4U, + 0x03U, 0x28U, 0x0cU, 0x30U, 0x9eU, 0x9eU, 0x08U, 0x80U, 0x30U, + 0x08U, 0x53U, 0x76U, 0x26U, 0x8aU, 0x2bU}; + // TestHook hook = jswasm[R"[test.hook]( + // var ASSERT = (x, line) => { + // if (!x) { + // trace('line', line, false) + // rollback(x.toString(), line) + // } + // } + // var INVALID_ARGUMENT = -7 + // var a = [ + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, + // ] + // var ba = [ + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, + // ] + // var ha = [ + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 1, 1, 1, 1, + // ] + // var data2 = [ + // 35, 19, 150, 104, 120, 220, 171, 196, 64, 38, 7, 43, 163, 210, 12, 105, 64, + // 221, 205, 231, 56, 155, 11, 169, 108, 60, 179, 135, 55, 2, 129, 232, 43, 221, + // 93, 187, 64, 217, 102, 150, 111, 193, 107, 232, 212, 124, 123, 98, 20, 76, + // 209, 75, 170, 153, 54, 117, 233, 34, 173, 15, 95, 148, 29, 134, 235, 168, 19, + // 153, 249, 152, 255, 202, 91, 134, 47, 223, 103, 143, 226, 227, 195, 55, 204, + // 71, 15, 51, 136, 176, 51, 59, 2, 85, 103, 22, 164, 251, 142, 133, 111, 216, + // 132, 22, 163, 84, 24, 52, 6, 14, 246, 101, 52, 5, 38, 126, 5, 116, 218, 9, + // 191, 85, 140, 117, 146, 172, 51, 251, 1, 141, + // ] + // var Hook = (arg) => { + // ASSERT(state_set(a, ba) === INVALID_ARGUMENT, 11) + // ASSERT(state_set(a, ha) === INVALID_ARGUMENT, 12) + // const key = [ + // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 0, 0, 0, 0, 0, 0, 0, + // ] + // const data = [202, 254, 186, 190] + // ASSERT(state_set(data, key) === 4, 13) + // const key2 = [1, 2, 3] + // ASSERT(state_set(data2, key2) === 128, 14) + // accept('', 0) + // } + // )[test.hook]"]; + + // install the hook on alice + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), + M("set state_set 1"), + HSFEE); + env.close(); + + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 1); + + // invoke the hook with cho (rollback after alice's hooks have + // executed) + env(pay(alice, cho, XRP(1)), + M("test state_set 1 rollback"), + fee(XRP(1)), + ter(tecHOOK_REJECTED)); + + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 1); + + auto const nsdir = env.le(nsdirkl); + BEAST_EXPECT(!nsdir); + + auto const state1 = env.le( + ripple::keylet::hookState(aliceid, beast::zero, beast::zero)); + BEAST_EXPECT(!state1); + + // invoke the hook from bob to alice, this will work + env(pay(bob, alice, XRP(1)), M("test state_set 1"), fee(XRP(1))); + env.close(); + } + + // check that the state object and namespace exists + { + // owner count should be 1 hook + 2 state objects == 3 + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 3); + + auto const nsdir = env.le(nsdirkl); + BEAST_REQUIRE(!!nsdir); + + BEAST_EXPECT(nsdir->getFieldV256(sfIndexes).size() == 2); + + auto const state1 = env.le( + ripple::keylet::hookState(aliceid, beast::zero, beast::zero)); + BEAST_REQUIRE(!!state1); + + BEAST_EXPECT(state1->getFieldH256(sfHookStateKey) == beast::zero); + + auto const data1 = state1->getFieldVL(sfHookStateData); + BEAST_EXPECT(data1.size() == 4); + BEAST_EXPECT( + data1[0] == 0xCAU && data1[1] == 0xFEU && data1[2] == 0xBAU && + data1[3] == 0xBEU); + + uint8_t key2[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3}; + + auto const state2 = env.le(ripple::keylet::hookState( + aliceid, uint256::fromVoid(key2), beast::zero)); + + BEAST_REQUIRE(!!state2); + + auto const lekey2 = state2->getFieldH256(sfHookStateKey); + + BEAST_EXPECT(lekey2 == uint256::fromVoid(key2)); + + uint8_t data2[128] = { + 0x23U, 0x13U, 0x96U, 0x68U, 0x78U, 0xDCU, 0xABU, 0xC4U, 0x40U, + 0x26U, 0x07U, 0x2BU, 0xA3U, 0xD2U, 0x0CU, 0x69U, 0x40U, 0xDDU, + 0xCDU, 0xE7U, 0x38U, 0x9BU, 0x0BU, 0xA9U, 0x6CU, 0x3CU, 0xB3U, + 0x87U, 0x37U, 0x02U, 0x81U, 0xE8U, 0x2BU, 0xDDU, 0x5DU, 0xBBU, + 0x40U, 0xD9U, 0x66U, 0x96U, 0x6FU, 0xC1U, 0x6BU, 0xE8U, 0xD4U, + 0x7CU, 0x7BU, 0x62U, 0x14U, 0x4CU, 0xD1U, 0x4BU, 0xAAU, 0x99U, + 0x36U, 0x75U, 0xE9U, 0x22U, 0xADU, 0x0FU, 0x5FU, 0x94U, 0x1DU, + 0x86U, 0xEBU, 0xA8U, 0x13U, 0x99U, 0xF9U, 0x98U, 0xFFU, 0xCAU, + 0x5BU, 0x86U, 0x2FU, 0xDFU, 0x67U, 0x8FU, 0xE2U, 0xE3U, 0xC3U, + 0x37U, 0xCCU, 0x47U, 0x0FU, 0x33U, 0x88U, 0xB0U, 0x33U, 0x3BU, + 0x02U, 0x55U, 0x67U, 0x16U, 0xA4U, 0xFBU, 0x8EU, 0x85U, 0x6FU, + 0xD8U, 0x84U, 0x16U, 0xA3U, 0x54U, 0x18U, 0x34U, 0x06U, 0x0EU, + 0xF6U, 0x65U, 0x34U, 0x05U, 0x26U, 0x7EU, 0x05U, 0x74U, 0xDAU, + 0x09U, 0xBFU, 0x55U, 0x8CU, 0x75U, 0x92U, 0xACU, 0x33U, 0xFBU, + 0x01U, 0x8DU}; + + auto const ledata2 = state2->getFieldVL(sfHookStateData); + BEAST_REQUIRE(ledata2.size() == sizeof(data2)); + + for (uint32_t i = 0; i < sizeof(data2); ++i) + BEAST_EXPECT(data2[i] == ledata2[i]); + } + + // make amother hook to override an existing state and delete an + // existing state + { + TestHook hook = { + 0x43U, 0x0dU, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x2aU, 0x77U, 0x61U, 0x73U, + 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, + 0x32U, 0x36U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, + 0x02U, 0x78U, 0x08U, 0x6cU, 0x69U, 0x6eU, 0x65U, 0x0aU, 0x74U, + 0x72U, 0x61U, 0x63U, 0x65U, 0x10U, 0x72U, 0x6fU, 0x6cU, 0x6cU, + 0x62U, 0x61U, 0x63U, 0x6bU, 0x06U, 0x61U, 0x72U, 0x67U, 0x06U, + 0x6bU, 0x65U, 0x79U, 0x08U, 0x64U, 0x61U, 0x74U, 0x61U, 0x08U, + 0x6bU, 0x65U, 0x79U, 0x32U, 0x12U, 0x73U, 0x74U, 0x61U, 0x74U, + 0x65U, 0x5fU, 0x73U, 0x65U, 0x74U, 0x0cU, 0x61U, 0x63U, 0x63U, + 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, + 0x00U, 0x01U, 0x00U, 0x01U, 0x00U, 0x02U, 0x32U, 0x01U, 0xa4U, + 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x00U, 0x3fU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe3U, + 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, + 0x00U, 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x39U, + 0xe3U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x01U, 0x4dU, 0xe4U, 0x00U, + 0x00U, 0x00U, 0x39U, 0xe4U, 0x00U, 0x00U, 0x00U, 0xc7U, 0x28U, + 0xcaU, 0x03U, 0x01U, 0x07U, 0x3dU, 0x00U, 0x0cU, 0x0eU, 0x00U, + 0x0cU, 0x16U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x02U, 0x00U, + 0x02U, 0x04U, 0x00U, 0x00U, 0x24U, 0x02U, 0xccU, 0x03U, 0x00U, + 0x01U, 0x00U, 0xceU, 0x03U, 0x00U, 0x01U, 0x00U, 0xd3U, 0x97U, + 0xecU, 0x20U, 0x38U, 0xe8U, 0x00U, 0x00U, 0x00U, 0x04U, 0xe7U, + 0x00U, 0x00U, 0x00U, 0xd4U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xe9U, + 0x00U, 0x00U, 0x00U, 0xd3U, 0x42U, 0x38U, 0x00U, 0x00U, 0x00U, + 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, 0x0eU, 0x29U, 0xcaU, 0x03U, + 0x02U, 0x04U, 0x03U, 0x17U, 0x49U, 0x59U, 0x0cU, 0x02U, 0x06U, + 0x00U, 0x00U, 0x01U, 0x03U, 0x01U, 0x20U, 0x00U, 0x00U, 0x7cU, + 0x04U, 0xd4U, 0x03U, 0x00U, 0x01U, 0x00U, 0xd6U, 0x03U, 0x01U, + 0x00U, 0x30U, 0xd8U, 0x03U, 0x01U, 0x01U, 0x30U, 0xdaU, 0x03U, + 0x01U, 0x02U, 0x30U, 0x61U, 0x02U, 0x00U, 0x61U, 0x01U, 0x00U, + 0x61U, 0x00U, 0x00U, 0xb7U, 0x26U, 0x01U, 0x00U, 0xcbU, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb9U, 0x26U, 0x10U, 0x00U, + 0xccU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xeeU, 0x00U, + 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0x62U, 0x00U, 0x00U, 0xf2U, + 0xbfU, 0x10U, 0xacU, 0xbfU, 0x15U, 0xf2U, 0x0eU, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb8U, 0xb9U, 0xbaU, 0x26U, 0x20U, 0x00U, 0xcdU, 0x38U, 0xe3U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xeeU, 0x00U, 0x00U, 0x00U, 0x06U, + 0x62U, 0x02U, 0x00U, 0xf2U, 0xb7U, 0xacU, 0xbfU, 0x16U, 0xf2U, + 0x0eU, 0x38U, 0xefU, 0x00U, 0x00U, 0x00U, 0xc3U, 0xb7U, 0xf2U, + 0x29U, 0xcaU, 0x03U, 0x08U, 0x0aU, 0x30U, 0x1cU, 0x67U, 0x7bU, + 0x08U, 0x80U, 0x30U, 0x08U, 0x6cU, 0x2bU}; + // TestHook hook = jswasm[R"[test.hook]( + // var ASSERT = (x, line) => { + // if (!x) { + // trace('line', line, false) + // rollback(x.toString(), line) + // } + // } + // var Hook = (arg) => { + // const key = [0] + // const data = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2] + // ASSERT(state_set(data, key) === 16, 21) + // const key2 = [ + // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 0, 0, 0, 0, 1, 2, 3, + // ] + // ASSERT(state_set(void 0, key2) === 0, 22) + // accept('', 0) + // } + // )[test.hook]"]; + + TestHook hook2 = { + 0x43U, 0x0eU, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x2aU, 0x77U, 0x61U, 0x73U, + 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, + 0x32U, 0x37U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, + 0x02U, 0x78U, 0x08U, 0x6cU, 0x69U, 0x6eU, 0x65U, 0x0aU, 0x74U, + 0x72U, 0x61U, 0x63U, 0x65U, 0x10U, 0x72U, 0x6fU, 0x6cU, 0x6cU, + 0x62U, 0x61U, 0x63U, 0x6bU, 0x06U, 0x61U, 0x72U, 0x67U, 0x06U, + 0x6bU, 0x65U, 0x79U, 0x08U, 0x64U, 0x61U, 0x74U, 0x61U, 0x12U, + 0x64U, 0x61U, 0x74U, 0x61U, 0x5fU, 0x72U, 0x65U, 0x61U, 0x64U, + 0x02U, 0x69U, 0x0aU, 0x73U, 0x74U, 0x61U, 0x74U, 0x65U, 0x0cU, + 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, + 0x00U, 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, 0x00U, 0x02U, + 0x32U, 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, + 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe4U, 0x00U, 0x00U, 0x00U, + 0x00U, 0x3eU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe4U, + 0x00U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x39U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x01U, + 0x4dU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x39U, 0xe4U, 0x00U, 0x00U, + 0x00U, 0xc7U, 0x28U, 0xcaU, 0x03U, 0x01U, 0x07U, 0x3dU, 0x00U, + 0x0cU, 0x0eU, 0x00U, 0x0cU, 0x10U, 0x0cU, 0x02U, 0x06U, 0x00U, + 0x00U, 0x02U, 0x00U, 0x02U, 0x04U, 0x00U, 0x00U, 0x24U, 0x02U, + 0xccU, 0x03U, 0x00U, 0x01U, 0x00U, 0xceU, 0x03U, 0x00U, 0x01U, + 0x00U, 0xd3U, 0x97U, 0xecU, 0x20U, 0x38U, 0xe8U, 0x00U, 0x00U, + 0x00U, 0x04U, 0xe7U, 0x00U, 0x00U, 0x00U, 0xd4U, 0x09U, 0xf3U, + 0x0eU, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0xd3U, 0x42U, 0x38U, + 0x00U, 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, 0x0eU, + 0x29U, 0xcaU, 0x03U, 0x02U, 0x04U, 0x03U, 0x17U, 0x49U, 0x59U, + 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x01U, 0x04U, 0x01U, 0x10U, + 0x00U, 0x00U, 0x75U, 0x05U, 0xd4U, 0x03U, 0x00U, 0x01U, 0x00U, + 0xd6U, 0x03U, 0x01U, 0x00U, 0x30U, 0xd8U, 0x03U, 0x01U, 0x01U, + 0x30U, 0xdaU, 0x03U, 0x01U, 0x02U, 0x30U, 0xdcU, 0x03U, 0x02U, + 0x03U, 0x20U, 0x61U, 0x02U, 0x00U, 0x61U, 0x01U, 0x00U, 0x61U, + 0x00U, 0x00U, 0xb7U, 0x26U, 0x01U, 0x00U, 0xcbU, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb9U, 0x26U, 0x10U, 0x00U, 0xccU, + 0x38U, 0xefU, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0xf1U, + 0xcdU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x02U, 0x00U, + 0xebU, 0xbfU, 0x10U, 0xacU, 0xbfU, 0x1fU, 0xf2U, 0x0eU, 0x61U, + 0x03U, 0x00U, 0xb7U, 0xceU, 0x62U, 0x03U, 0x00U, 0xbfU, 0x10U, + 0xa4U, 0xecU, 0x24U, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, + 0x01U, 0x00U, 0x62U, 0x03U, 0x00U, 0x47U, 0x62U, 0x02U, 0x00U, + 0x62U, 0x03U, 0x00U, 0x47U, 0xacU, 0xbfU, 0x20U, 0xf2U, 0x0eU, + 0x62U, 0x03U, 0x00U, 0x90U, 0x11U, 0x63U, 0x03U, 0x00U, 0x0eU, + 0xeeU, 0xd6U, 0x38U, 0xf0U, 0x00U, 0x00U, 0x00U, 0xc3U, 0xb7U, + 0xf2U, 0x29U, 0xcaU, 0x03U, 0x08U, 0x07U, 0x30U, 0x1cU, 0x67U, + 0x35U, 0x53U, 0xf3U, 0x2bU}; + // TestHook hook2 = jswasm[R"[test.hook]( + // var ASSERT = (x, line) => { + // if (!x) { + // trace('line', line, false) + // rollback(x.toString(), line) + // } + // } + // var Hook = (arg) => { + // const key = [0] + // const data = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2] + // const data_read = state(key) + // ASSERT(data_read.length === 16, 31) + // for (let i = 0; i < 16; ++i) ASSERT(data[i] === data_read[i], 32) + // accept('', 0) + // } + // )[test.hook]"]; + // install the hook on alice + env(ripple::test::jtx::hook( + alice, + {{{hsov1(hook, 1, HSDROPS, overrideFlag)}, {}, {}, {hsov1(hook2, 1, HSDROPS, 0)}}}, + 0), + M("set state_set 2"), + HSFEE); + env.close(); + + // two hooks + two state objects = 4 + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 4); + + // this hook will be installed on bob, and it will verify the newly + // updated state is also available on his side. caution must be + // taken because bob's hooks will execute first if bob's is the + // otxn. therefore we will flip to a payment from alice to bob here + TestHook hook3 = { + 0x43U, 0x12U, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x12U, 0x73U, 0x66U, 0x41U, 0x63U, 0x63U, 0x6fU, 0x75U, 0x6eU, + 0x74U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x2aU, 0x77U, 0x61U, + 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, + 0x2dU, 0x32U, 0x38U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, + 0x73U, 0x02U, 0x78U, 0x08U, 0x6cU, 0x69U, 0x6eU, 0x65U, 0x0aU, + 0x74U, 0x72U, 0x61U, 0x63U, 0x65U, 0x10U, 0x72U, 0x6fU, 0x6cU, + 0x6cU, 0x62U, 0x61U, 0x63U, 0x6bU, 0x06U, 0x61U, 0x72U, 0x67U, + 0x0aU, 0x61U, 0x6cU, 0x69U, 0x63U, 0x65U, 0x06U, 0x6bU, 0x65U, + 0x79U, 0x08U, 0x64U, 0x61U, 0x74U, 0x61U, 0x12U, 0x64U, 0x61U, + 0x74U, 0x61U, 0x5fU, 0x72U, 0x65U, 0x61U, 0x64U, 0x02U, 0x69U, + 0x14U, 0x68U, 0x6fU, 0x6fU, 0x6bU, 0x5fU, 0x61U, 0x67U, 0x61U, + 0x69U, 0x6eU, 0x14U, 0x6fU, 0x74U, 0x78U, 0x6eU, 0x5fU, 0x66U, + 0x69U, 0x65U, 0x6cU, 0x64U, 0x1aU, 0x73U, 0x74U, 0x61U, 0x74U, + 0x65U, 0x5fU, 0x66U, 0x6fU, 0x72U, 0x65U, 0x69U, 0x67U, 0x6eU, + 0x0cU, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, + 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, 0x00U, + 0x02U, 0x48U, 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, + 0xe3U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe4U, 0x00U, 0x00U, + 0x00U, 0x00U, 0x3fU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, + 0xe3U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe4U, 0x00U, 0x00U, + 0x00U, 0x00U, 0x3eU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x00U, 0xc2U, + 0x00U, 0x4dU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x39U, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x01U, 0x01U, 0x00U, 0x08U, 0x00U, 0x39U, 0xe4U, + 0x00U, 0x00U, 0x00U, 0xc2U, 0x01U, 0x4dU, 0xe5U, 0x00U, 0x00U, + 0x00U, 0x39U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xc7U, 0x28U, 0xccU, + 0x03U, 0x01U, 0x08U, 0x5bU, 0x00U, 0x12U, 0x0eU, 0x3fU, 0x00U, + 0x0aU, 0x1eU, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x02U, 0x00U, + 0x02U, 0x04U, 0x00U, 0x00U, 0x24U, 0x02U, 0xceU, 0x03U, 0x00U, + 0x01U, 0x00U, 0xd0U, 0x03U, 0x00U, 0x01U, 0x00U, 0xd3U, 0x97U, + 0xecU, 0x20U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x04U, 0xe8U, + 0x00U, 0x00U, 0x00U, 0xd4U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xeaU, + 0x00U, 0x00U, 0x00U, 0xd3U, 0x42U, 0x38U, 0x00U, 0x00U, 0x00U, + 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, 0x0eU, 0x29U, 0xccU, 0x03U, + 0x02U, 0x04U, 0x03U, 0x17U, 0x49U, 0x59U, 0x0cU, 0x02U, 0x06U, + 0x00U, 0x00U, 0x01U, 0x05U, 0x01U, 0x20U, 0x00U, 0x00U, 0xd1U, + 0x01U, 0x06U, 0xd6U, 0x03U, 0x00U, 0x01U, 0x00U, 0xd8U, 0x03U, + 0x01U, 0x00U, 0x30U, 0xdaU, 0x03U, 0x01U, 0x01U, 0x30U, 0xdcU, + 0x03U, 0x01U, 0x02U, 0x30U, 0xdeU, 0x03U, 0x01U, 0x03U, 0x30U, + 0xe0U, 0x03U, 0x02U, 0x04U, 0x20U, 0x61U, 0x03U, 0x00U, 0x61U, + 0x02U, 0x00U, 0x61U, 0x01U, 0x00U, 0x61U, 0x00U, 0x00U, 0x38U, + 0xf1U, 0x00U, 0x00U, 0x00U, 0xf0U, 0x0eU, 0x38U, 0xf2U, 0x00U, + 0x00U, 0x00U, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0xf1U, 0xcbU, + 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x04U, 0xecU, 0x00U, 0x00U, + 0x00U, 0x62U, 0x00U, 0x00U, 0x0aU, 0xf3U, 0x0eU, 0x38U, 0xe3U, + 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0xebU, 0xbfU, 0x14U, + 0xacU, 0xbfU, 0x29U, 0xf2U, 0x0eU, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0x26U, 0x20U, 0x00U, 0xccU, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb9U, 0x26U, 0x10U, 0x00U, 0xcdU, 0x38U, 0xf3U, + 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0x62U, 0x01U, 0x00U, + 0x62U, 0x00U, 0x00U, 0xf3U, 0xceU, 0x38U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x62U, 0x03U, 0x00U, 0xebU, 0xbfU, 0x10U, 0xaaU, 0xbfU, + 0x2aU, 0xf2U, 0x0eU, 0x61U, 0x04U, 0x00U, 0xb7U, 0xc5U, 0x04U, + 0x62U, 0x04U, 0x00U, 0xbfU, 0x10U, 0xa4U, 0xecU, 0x24U, 0x38U, + 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x02U, 0x00U, 0x62U, 0x04U, + 0x00U, 0x47U, 0x62U, 0x03U, 0x00U, 0x62U, 0x04U, 0x00U, 0x47U, + 0xacU, 0xbfU, 0x2bU, 0xf2U, 0x0eU, 0x62U, 0x04U, 0x00U, 0x90U, + 0x11U, 0x63U, 0x04U, 0x00U, 0x0eU, 0xeeU, 0xd6U, 0x38U, 0xf4U, + 0x00U, 0x00U, 0x00U, 0xc3U, 0xb7U, 0xf2U, 0x29U, 0xccU, 0x03U, + 0x09U, 0x0eU, 0x3fU, 0x26U, 0x3fU, 0x53U, 0x53U, 0x08U, 0x80U, + 0x30U, 0x08U, 0x67U, 0x53U, 0x53U, 0xf8U, 0x2bU}; + // TestHook hook3 = jswasm[R"[test.hook]( + // var ASSERT = (x, line) => { + // if (!x) { + // trace('line', line, false) + // rollback(x.toString(), line) + // } + // } + // var sfAccount = 524289 + // var Hook = (arg) => { + // hook_again() + // const alice = otxn_field(sfAccount) + // trace('alice', alice, true) + // ASSERT(alice.length === 20, 41) + // const key = [ + // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 0, 0, 0, 0, 0, 0, 0, + // ] + // const data = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2] + // const data_read = state_foreign(key, key, alice) + // ASSERT(data_read.length == 16, 42) + // for (let i = 0; i < 16; ++i) ASSERT(data[i] === data_read[i], 43) + // accept('', 0) + // } + // )[test.hook]"]; + + // install the hook on bob + env(ripple::test::jtx::hook(bob, {{hsov1(hook3, 1, HSDROPS, overrideFlag)}}, 0), + M("set state_set 3"), + HSFEE); + env.close(); + + // invoke the hook with cho (rollback after alice's hooks have + // executed) + env(pay(alice, cho, XRP(1)), + M("test state_set 3 rollback"), + fee(XRP(1)), + ter(tecHOOK_REJECTED)); + + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 4); + + // invoke the hook + env(pay(alice, bob, XRP(1)), M("test state_set 3"), fee(XRP(1))); + env.close(); + } + + // check that the updates have been made + { + // two hooks + one state == 3 + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 3); + BEAST_EXPECT((*env.le("bob"))[sfOwnerCount] == 1); + + auto const nsdir = env.le(nsdirkl); + BEAST_REQUIRE(!!nsdir); + + BEAST_EXPECT(nsdir->getFieldV256(sfIndexes).size() == 1); + + auto const state1 = env.le( + ripple::keylet::hookState(aliceid, beast::zero, beast::zero)); + BEAST_REQUIRE(!!state1); + + BEAST_EXPECT(state1->getFieldH256(sfHookStateKey) == beast::zero); + + auto const ledata1 = state1->getFieldVL(sfHookStateData); + BEAST_EXPECT(ledata1.size() == 16); + uint8_t data1[16] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2}; + + for (uint32_t i = 0; i < sizeof(data1); ++i) + BEAST_EXPECT(data1[i] == ledata1[i]); + + uint8_t key2[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3}; + + auto const state2 = env.le(ripple::keylet::hookState( + aliceid, uint256::fromVoid(key2), beast::zero)); + + BEAST_REQUIRE(!state2); + } + + // create a hook state inside the weak side of an execution, while the + // strong side is rolled back + { + TestHook hook = { + 0x43U, 0x0dU, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x2aU, 0x77U, 0x61U, 0x73U, + 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, + 0x32U, 0x39U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, + 0x02U, 0x78U, 0x08U, 0x6cU, 0x69U, 0x6eU, 0x65U, 0x0aU, 0x74U, + 0x72U, 0x61U, 0x63U, 0x65U, 0x10U, 0x72U, 0x6fU, 0x6cU, 0x6cU, + 0x62U, 0x61U, 0x63U, 0x6bU, 0x06U, 0x61U, 0x72U, 0x67U, 0x06U, + 0x6bU, 0x65U, 0x79U, 0x08U, 0x64U, 0x61U, 0x74U, 0x61U, 0x14U, + 0x68U, 0x6fU, 0x6fU, 0x6bU, 0x5fU, 0x61U, 0x67U, 0x61U, 0x69U, + 0x6eU, 0x12U, 0x73U, 0x74U, 0x61U, 0x74U, 0x65U, 0x5fU, 0x73U, + 0x65U, 0x74U, 0x0cU, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, + 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, + 0x01U, 0x00U, 0x02U, 0x32U, 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, + 0x00U, 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe4U, + 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x00U, 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x00U, + 0x4dU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x39U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0xc2U, 0x01U, 0x4dU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x39U, + 0xe4U, 0x00U, 0x00U, 0x00U, 0xc7U, 0x28U, 0xcaU, 0x03U, 0x01U, + 0x07U, 0x3dU, 0x00U, 0x0cU, 0x0eU, 0x00U, 0x0cU, 0x0eU, 0x0cU, + 0x02U, 0x06U, 0x00U, 0x00U, 0x02U, 0x00U, 0x02U, 0x04U, 0x00U, + 0x00U, 0x24U, 0x02U, 0xccU, 0x03U, 0x00U, 0x01U, 0x00U, 0xceU, + 0x03U, 0x00U, 0x01U, 0x00U, 0xd3U, 0x97U, 0xecU, 0x20U, 0x38U, + 0xe8U, 0x00U, 0x00U, 0x00U, 0x04U, 0xe7U, 0x00U, 0x00U, 0x00U, + 0xd4U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, + 0xd3U, 0x42U, 0x38U, 0x00U, 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, + 0xd4U, 0xf2U, 0x0eU, 0x29U, 0xcaU, 0x03U, 0x02U, 0x04U, 0x03U, + 0x17U, 0x49U, 0x59U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x01U, + 0x02U, 0x01U, 0x10U, 0x00U, 0x00U, 0x4aU, 0x03U, 0xd4U, 0x03U, + 0x00U, 0x01U, 0x00U, 0xd6U, 0x03U, 0x01U, 0x00U, 0x30U, 0xd8U, + 0x03U, 0x01U, 0x01U, 0x30U, 0x61U, 0x01U, 0x00U, 0x61U, 0x00U, + 0x00U, 0x38U, 0xedU, 0x00U, 0x00U, 0x00U, 0xf0U, 0x0eU, 0xc0U, + 0xffU, 0x00U, 0x26U, 0x01U, 0x00U, 0xcbU, 0xc0U, 0xffU, 0x00U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, + 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb8U, 0xb9U, 0x26U, 0x10U, 0x00U, + 0xccU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xeeU, 0x00U, + 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0x62U, 0x00U, 0x00U, 0xf2U, + 0xbfU, 0x10U, 0xaaU, 0xb9U, 0xf2U, 0x0eU, 0x38U, 0xefU, 0x00U, + 0x00U, 0x00U, 0xc3U, 0xb7U, 0xf2U, 0x29U, 0xcaU, 0x03U, 0x08U, + 0x06U, 0x21U, 0x26U, 0x26U, 0x71U, 0x76U, 0x2bU}; + // TestHook hook = jswasm[R"[test.hook]( + // var ASSERT = (x, line) => { + // if (!x) { + // trace('line', line, false) + // rollback(x.toString(), line) + // } + // } + // var Hook = (arg) => { + // hook_again() + // const key = [255] + // const data = [255, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2] + // ASSERT(state_set(data, key) == 16, 2) + // accept('', 0) + // } + // )[test.hook]"]; + + // install the hook on alice, deleting the other hook + env(ripple::test::jtx::hook( + alice, + {{{hsov1(hook, 1, HSDROPS, overrideFlag)}, {}, {}, {hso_delete()}}}, + 0), + M("set state_set 4"), + HSFEE); + env.close(); + + // invoke from alice to cho, this will cause a rollback, however the + // hook state should still be updated because the hook specified + // hook_again, and in the second weak execution the hook is allowed + // to set state + env(pay(alice, cho, XRP(1)), + M("test state_set 4 rollback"), + fee(XRP(1)), + ter(tecHOOK_REJECTED)); + + uint8_t key[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFFU}; + + auto const state = env.le(ripple::keylet::hookState( + aliceid, uint256::fromVoid(key), beast::zero)); + + BEAST_EXPECT(state); + + // one hook + two state objects == 3 + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 3); + + // delete alice's hook + env(ripple::test::jtx::hook( + alice, {{{hso_delete()}, {}, {}, {}}}, 0), + M("set state_set 5 delete"), + HSFEE); + env.close(); + + // check the state is still present + { + auto const state = env.le(ripple::keylet::hookState( + aliceid, uint256::fromVoid(key), beast::zero)); + BEAST_EXPECT(state); + } + + // zero hooks + two state objects == 2 + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 2); + + // put on a different hook + + env(ripple::test::jtx::hook( + alice, {{hsov1(rollback_wasm, 1, HSDROPS, overrideFlag)}}, 0), + M("set state_set rollback2"), + HSFEE); + env.close(); + + // check the state is still present + { + auto const state = env.le(ripple::keylet::hookState( + aliceid, uint256::fromVoid(key), beast::zero)); + BEAST_EXPECT(state); + } + + // one hooks + two state objects == 3 + BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 3); + } + + // check reserve exhaustion + TestHook exhaustion_wasm = { + 0x43U, 0x13U, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, + 0x16U, 0x73U, 0x66U, 0x49U, 0x6eU, 0x76U, 0x6fU, 0x69U, 0x63U, + 0x65U, 0x49U, 0x44U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x2aU, + 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, + 0x73U, 0x74U, 0x2dU, 0x33U, 0x30U, 0x2dU, 0x67U, 0x65U, 0x6eU, + 0x2eU, 0x6aU, 0x73U, 0x02U, 0x78U, 0x08U, 0x6cU, 0x69U, 0x6eU, + 0x65U, 0x0aU, 0x74U, 0x72U, 0x61U, 0x63U, 0x65U, 0x10U, 0x72U, + 0x6fU, 0x6cU, 0x6cU, 0x62U, 0x61U, 0x63U, 0x6bU, 0x06U, 0x61U, + 0x72U, 0x67U, 0x06U, 0x74U, 0x78U, 0x6eU, 0x0eU, 0x67U, 0x72U, + 0x61U, 0x6eU, 0x74U, 0x6fU, 0x72U, 0x14U, 0x69U, 0x74U, 0x65U, + 0x72U, 0x61U, 0x74U, 0x69U, 0x6fU, 0x6eU, 0x73U, 0x02U, 0x70U, + 0x02U, 0x69U, 0x0eU, 0x6fU, 0x74U, 0x78U, 0x6eU, 0x5fU, 0x69U, + 0x64U, 0x14U, 0x6fU, 0x74U, 0x78U, 0x6eU, 0x5fU, 0x66U, 0x69U, + 0x65U, 0x6cU, 0x64U, 0x10U, 0x68U, 0x6fU, 0x6fU, 0x6bU, 0x5fU, + 0x70U, 0x6fU, 0x73U, 0x12U, 0x73U, 0x74U, 0x61U, 0x74U, 0x65U, + 0x5fU, 0x73U, 0x65U, 0x74U, 0x0cU, 0x61U, 0x63U, 0x63U, 0x65U, + 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, + 0x01U, 0x00U, 0x01U, 0x00U, 0x02U, 0x48U, 0x01U, 0xa4U, 0x01U, + 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3fU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe5U, 0x00U, + 0x00U, 0x00U, 0x00U, 0x3eU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x00U, + 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x00U, 0x3eU, 0xe5U, 0x00U, + 0x00U, 0x00U, 0x00U, 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x39U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x01U, 0x11U, 0x00U, + 0x05U, 0x00U, 0x39U, 0xe4U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x01U, + 0x4dU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x39U, 0xe5U, 0x00U, 0x00U, + 0x00U, 0xc7U, 0x28U, 0xccU, 0x03U, 0x01U, 0x08U, 0x5bU, 0x00U, + 0x12U, 0x0eU, 0x3fU, 0x00U, 0x0aU, 0x1eU, 0x0cU, 0x02U, 0x06U, + 0x00U, 0x00U, 0x02U, 0x00U, 0x02U, 0x04U, 0x00U, 0x00U, 0x24U, + 0x02U, 0xceU, 0x03U, 0x00U, 0x01U, 0x00U, 0xd0U, 0x03U, 0x00U, + 0x01U, 0x00U, 0xd3U, 0x97U, 0xecU, 0x20U, 0x38U, 0xe9U, 0x00U, + 0x00U, 0x00U, 0x04U, 0xe8U, 0x00U, 0x00U, 0x00U, 0xd4U, 0x09U, + 0xf3U, 0x0eU, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0xd3U, 0x42U, + 0x38U, 0x00U, 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, + 0x0eU, 0x29U, 0xccU, 0x03U, 0x02U, 0x04U, 0x03U, 0x17U, 0x49U, + 0x59U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x01U, 0x05U, 0x01U, + 0x04U, 0x00U, 0x00U, 0xb4U, 0x01U, 0x06U, 0xd6U, 0x03U, 0x00U, + 0x01U, 0x00U, 0xd8U, 0x03U, 0x01U, 0x00U, 0x30U, 0xdaU, 0x03U, + 0x01U, 0x01U, 0x30U, 0xdcU, 0x03U, 0x01U, 0x02U, 0x30U, 0xdeU, + 0x03U, 0x01U, 0x03U, 0x30U, 0xe0U, 0x03U, 0x02U, 0x04U, 0x20U, + 0x61U, 0x03U, 0x00U, 0x61U, 0x02U, 0x00U, 0x61U, 0x01U, 0x00U, + 0x61U, 0x00U, 0x00U, 0x38U, 0xf1U, 0x00U, 0x00U, 0x00U, 0xb7U, + 0xf1U, 0xcbU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, + 0x00U, 0xebU, 0xbfU, 0x20U, 0xacU, 0xb8U, 0xf2U, 0x0eU, 0x38U, + 0xf2U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, + 0xf1U, 0xccU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x62U, 0x01U, + 0x00U, 0xebU, 0xbfU, 0x20U, 0xacU, 0xb9U, 0xf2U, 0x0eU, 0x62U, + 0x01U, 0x00U, 0xb7U, 0x47U, 0xbfU, 0x08U, 0xa1U, 0x62U, 0x01U, + 0x00U, 0xb8U, 0x47U, 0x9eU, 0xcdU, 0x38U, 0xf3U, 0x00U, 0x00U, + 0x00U, 0xf0U, 0xceU, 0x61U, 0x04U, 0x00U, 0xb7U, 0xc5U, 0x04U, + 0x62U, 0x04U, 0x00U, 0x62U, 0x02U, 0x00U, 0xa4U, 0xecU, 0x49U, + 0x62U, 0x00U, 0x00U, 0xb7U, 0x73U, 0x62U, 0x04U, 0x00U, 0xc0U, + 0xffU, 0x00U, 0xaeU, 0x49U, 0x62U, 0x00U, 0x00U, 0xb8U, 0x73U, + 0x62U, 0x04U, 0x00U, 0xbfU, 0x08U, 0xa2U, 0xc0U, 0xffU, 0x00U, + 0xaeU, 0x49U, 0x62U, 0x00U, 0x00U, 0xb9U, 0x73U, 0x62U, 0x03U, + 0x00U, 0x49U, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf4U, + 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, + 0xf2U, 0xbfU, 0x20U, 0xacU, 0xbaU, 0xf2U, 0x0eU, 0x62U, 0x04U, + 0x00U, 0x90U, 0x11U, 0x63U, 0x04U, 0x00U, 0x0eU, 0xeeU, 0xb0U, + 0x38U, 0xf5U, 0x00U, 0x00U, 0x00U, 0xc3U, 0xb7U, 0xf2U, 0x29U, + 0xccU, 0x03U, 0x09U, 0x0eU, 0x3fU, 0x2bU, 0x4eU, 0x3fU, 0x4eU, + 0x4eU, 0x26U, 0x4eU, 0x44U, 0x53U, 0x30U, 0x76U, 0x3aU, 0x2bU}; + // TestHook exhaustion_wasm = jswasm[R"[test.hook]( + // var ASSERT = (x, line) => { + // if (!x) { + // trace('line', line, false) + // rollback(x.toString(), line) + // } + // } + // var sfInvoiceID = 327697 + // var Hook = (arg) => { + // const txn = otxn_id(0) + // ASSERT(txn.length === 32, 1) + // const grantor = otxn_field(sfInvoiceID) + // ASSERT(grantor.length === 32, 2) + // const iterations = (grantor[0] << 8) + grantor[1] + // const p = hook_pos() + // for (let i = 0; i < iterations; ++i) { + // txn[0] = i & 255 + // txn[1] = (i >> 8) & 255 + // txn[2] = p + // ASSERT(state_set(txn, txn) === 32, 3) + // } + // accept('', 0) + // } + // )[test.hook]"]; + + HASH_WASM(exhaustion); + + // install the exhaustion hook on eve + { + Json::Value json = ripple::test::jtx::hook( + eve, {{hsov1(exhaustion_wasm, 1, HSDROPS, overrideFlag)}}, 0); + + env(json, M("set state_set 6"), HSFEE); + env.close(); + } + + // now invoke repeatedly until exhaustion is reached + { + Json::Value json = pay(david, eve, XRP(1)); + json[jss::InvoiceID] = "0001" + std::string(60, '0'); + + // 2500 xrp less 1 account reserve (200) divided by 50xrp per object + // reserve = 46 objects of these we already have: 1 hook, so 45 + // objects can be allocated + env(json, fee(XRP(1)), M("test state_set 7"), ter(tesSUCCESS)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 2); + + // now we have allocated 1 state object, so 44 more can be allocated + + // try to set 45 state entries, this will fail + json[jss::InvoiceID] = "002D" + std::string(60, '0'); + env(json, + fee(XRP(1)), + M("test state_set 8"), + ter(tecHOOK_REJECTED)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 2); + + // try to set 44 state objects, this will succeed + json[jss::InvoiceID] = "002C" + std::string(60, '0'); + env(json, fee(XRP(1)), M("test state_set 9"), ter(tesSUCCESS)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 46); + + // try to set one state object, this will fail + env(json, + fee(XRP(1)), + M("test state_set 10"), + ter(tecHOOK_REJECTED)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 46); + } + + // test maximum state modification + { + // install the hook into every position on frank + env(ripple::test::jtx::hook( + frank, + {{hsov1(exhaustion_wasm, 1, HSDROPS), + hsov1(exhaustion_wasm, 1, HSDROPS), + hsov1(exhaustion_wasm, 1, HSDROPS), + hsov1(exhaustion_wasm, 1, HSDROPS)}}, + 0), + M("set state_set 11"), + HSFEE, + ter(tesSUCCESS)); + + Json::Value json = pay(david, frank, XRP(1)); + + // we can modify 256 entries at a time with the hook, but first we + // want to test too many modifications so we will do 65 which times + // 4 executions is 260 + json[jss::InvoiceID] = "0041" + std::string(60, '0'); + env(json, + fee(XRP(1)), + M("test state_set 12"), + ter(tecHOOK_REJECTED)); + env.close(); + BEAST_EXPECT((*env.le("frank"))[sfOwnerCount] == 4); + + // now we will do 64 which is exactly 256, which should be accepted + json[jss::InvoiceID] = "0040" + std::string(60, '0'); + env(json, fee(XRP(1)), M("test state_set 13"), ter(tesSUCCESS)); + env.close(); + BEAST_EXPECT((*env.le("frank"))[sfOwnerCount] == 260); + } + + // RH TODO: + // check state can be set on emit callback + // check namespacing provides for non-collision of same key + } + void test_trace(FeatureBitset features) { @@ -3466,7 +6298,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set trace"), HSFEE); env.close(); @@ -4926,7 +7758,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set util_accid"), HSFEE); env.close(); @@ -4942,672 +7774,613 @@ public: using namespace jtx; Env env{*this, features}; + // Env env{*this, envconfig(), features, nullptr, + // beast::severities::kTrace + // }; auto const alice = Account{"alice"}; auto const bob = Account{"bob"}; env.fund(XRP(10000), alice); env.fund(XRP(10000), bob); - TestHook hook = { - 0x43U, 0x31U, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, - 0x18U, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, 0x5fU, 0x4bU, - 0x4cU, 0x5fU, 0x45U, 0x51U, 0x04U, 0x6eU, 0x73U, 0x0aU, 0x6bU, - 0x6cU, 0x6bU, 0x65U, 0x79U, 0x06U, 0x6bU, 0x65U, 0x79U, 0x06U, - 0x63U, 0x75U, 0x72U, 0x02U, 0x61U, 0x02U, 0x62U, 0x16U, 0x4bU, - 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x48U, 0x4fU, 0x4fU, - 0x4bU, 0x22U, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, - 0x48U, 0x4fU, 0x4fU, 0x4bU, 0x5fU, 0x53U, 0x54U, 0x41U, 0x54U, - 0x45U, 0x1cU, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, - 0x41U, 0x43U, 0x43U, 0x4fU, 0x55U, 0x4eU, 0x54U, 0x22U, 0x4bU, - 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x41U, 0x4dU, 0x45U, - 0x4eU, 0x44U, 0x4dU, 0x45U, 0x4eU, 0x54U, 0x53U, 0x18U, 0x4bU, - 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x43U, 0x48U, 0x49U, - 0x4cU, 0x44U, 0x16U, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, - 0x5fU, 0x53U, 0x4bU, 0x49U, 0x50U, 0x16U, 0x4bU, 0x45U, 0x59U, - 0x4cU, 0x45U, 0x54U, 0x5fU, 0x46U, 0x45U, 0x45U, 0x53U, 0x26U, - 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x4eU, 0x45U, - 0x47U, 0x41U, 0x54U, 0x49U, 0x56U, 0x45U, 0x5fU, 0x55U, 0x4eU, - 0x4cU, 0x16U, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, - 0x4cU, 0x49U, 0x4eU, 0x45U, 0x18U, 0x4bU, 0x45U, 0x59U, 0x4cU, - 0x45U, 0x54U, 0x5fU, 0x4fU, 0x46U, 0x46U, 0x45U, 0x52U, 0x1cU, - 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x51U, 0x55U, - 0x41U, 0x4cU, 0x49U, 0x54U, 0x59U, 0x24U, 0x4bU, 0x45U, 0x59U, - 0x4cU, 0x45U, 0x54U, 0x5fU, 0x45U, 0x4dU, 0x49U, 0x54U, 0x54U, - 0x45U, 0x44U, 0x5fU, 0x44U, 0x49U, 0x52U, 0x1aU, 0x4bU, 0x45U, - 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x54U, 0x49U, 0x43U, 0x4bU, - 0x45U, 0x54U, 0x1cU, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, - 0x5fU, 0x53U, 0x49U, 0x47U, 0x4eU, 0x45U, 0x52U, 0x53U, 0x18U, - 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x43U, 0x48U, - 0x45U, 0x43U, 0x4bU, 0x2cU, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, - 0x54U, 0x5fU, 0x44U, 0x45U, 0x50U, 0x4fU, 0x53U, 0x49U, 0x54U, - 0x5fU, 0x50U, 0x52U, 0x45U, 0x41U, 0x55U, 0x54U, 0x48U, 0x20U, - 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x55U, 0x4eU, - 0x43U, 0x48U, 0x45U, 0x43U, 0x4bU, 0x45U, 0x44U, 0x20U, 0x4bU, - 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x4fU, 0x57U, 0x4eU, - 0x45U, 0x52U, 0x5fU, 0x44U, 0x49U, 0x52U, 0x16U, 0x4bU, 0x45U, - 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x50U, 0x41U, 0x47U, 0x45U, - 0x1aU, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x45U, - 0x53U, 0x43U, 0x52U, 0x4fU, 0x57U, 0x1cU, 0x4bU, 0x45U, 0x59U, - 0x4cU, 0x45U, 0x54U, 0x5fU, 0x50U, 0x41U, 0x59U, 0x43U, 0x48U, - 0x41U, 0x4eU, 0x1cU, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, - 0x5fU, 0x45U, 0x4dU, 0x49U, 0x54U, 0x54U, 0x45U, 0x44U, 0x20U, - 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x4eU, 0x46U, - 0x54U, 0x5fU, 0x4fU, 0x46U, 0x46U, 0x45U, 0x52U, 0x2cU, 0x4bU, - 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x48U, 0x4fU, 0x4fU, - 0x4bU, 0x5fU, 0x44U, 0x45U, 0x46U, 0x49U, 0x4eU, 0x49U, 0x54U, - 0x49U, 0x4fU, 0x4eU, 0x2aU, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, - 0x54U, 0x5fU, 0x48U, 0x4fU, 0x4fU, 0x4bU, 0x5fU, 0x53U, 0x54U, - 0x41U, 0x54U, 0x45U, 0x5fU, 0x44U, 0x49U, 0x52U, 0x1eU, 0x4bU, - 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x55U, 0x52U, 0x49U, - 0x54U, 0x4fU, 0x4bU, 0x45U, 0x4eU, 0x20U, 0x49U, 0x4eU, 0x56U, - 0x41U, 0x4cU, 0x49U, 0x44U, 0x5fU, 0x41U, 0x52U, 0x47U, 0x55U, - 0x4dU, 0x45U, 0x4eU, 0x54U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, - 0x2aU, 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, - 0x65U, 0x73U, 0x74U, 0x2dU, 0x31U, 0x36U, 0x2dU, 0x67U, 0x65U, - 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x02U, 0x78U, 0x08U, 0x63U, 0x6fU, - 0x64U, 0x65U, 0x0aU, 0x74U, 0x72U, 0x61U, 0x63U, 0x65U, 0x0aU, - 0x65U, 0x72U, 0x72U, 0x6fU, 0x72U, 0x10U, 0x72U, 0x6fU, 0x6cU, - 0x6cU, 0x62U, 0x61U, 0x63U, 0x6bU, 0x02U, 0x6dU, 0x02U, 0x6eU, - 0x06U, 0x61U, 0x72U, 0x67U, 0x02U, 0x65U, 0x06U, 0x61U, 0x6eU, - 0x73U, 0x16U, 0x75U, 0x74U, 0x69U, 0x6cU, 0x5fU, 0x6bU, 0x65U, - 0x79U, 0x6cU, 0x65U, 0x74U, 0x0cU, 0x61U, 0x63U, 0x63U, 0x65U, - 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, - 0x01U, 0x00U, 0x20U, 0x00U, 0x03U, 0xa3U, 0x08U, 0x01U, 0xa4U, - 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xe5U, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xe6U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0xe7U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xe8U, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xe9U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0xeaU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xebU, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xecU, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0xedU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xeeU, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xefU, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0xf0U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf1U, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf2U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0xf3U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf4U, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf5U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0xf6U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf7U, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf8U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0xf9U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xfaU, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xfbU, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0xfcU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xfdU, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xfeU, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0xffU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0x00U, - 0x01U, 0x00U, 0x00U, 0x80U, 0x3fU, 0x01U, 0x01U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0x02U, 0x01U, 0x00U, 0x00U, 0x80U, 0x3fU, 0x03U, - 0x01U, 0x00U, 0x00U, 0x80U, 0x3fU, 0x04U, 0x01U, 0x00U, 0x00U, - 0x80U, 0x3fU, 0x05U, 0x01U, 0x00U, 0x00U, 0x80U, 0x3fU, 0x06U, - 0x01U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe3U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe5U, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe6U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0xe7U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe8U, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe9U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0xeaU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xebU, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xecU, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0xedU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xeeU, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xefU, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0xf0U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf1U, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf2U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0xf3U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf4U, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf5U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0xf6U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf7U, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf8U, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0xf9U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xfaU, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xfbU, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0xfcU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xfdU, - 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xfeU, 0x00U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0xffU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0x00U, - 0x01U, 0x00U, 0x00U, 0x80U, 0x3eU, 0x01U, 0x01U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0x02U, 0x01U, 0x00U, 0x00U, 0x80U, 0x3eU, 0x03U, - 0x01U, 0x00U, 0x00U, 0x80U, 0x3eU, 0x04U, 0x01U, 0x00U, 0x00U, - 0x80U, 0x3eU, 0x05U, 0x01U, 0x00U, 0x00U, 0x80U, 0x3eU, 0x06U, - 0x01U, 0x00U, 0x00U, 0x80U, 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, - 0x00U, 0x00U, 0x3aU, 0xe3U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x01U, - 0x4dU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x3aU, 0xe4U, 0x00U, 0x00U, - 0x00U, 0xc0U, 0xc5U, 0x00U, 0xc0U, 0xd0U, 0x00U, 0xc0U, 0xf3U, - 0x00U, 0xbfU, 0x4bU, 0xbfU, 0x0aU, 0xbfU, 0x19U, 0xbcU, 0xc0U, - 0xbcU, 0x00U, 0xbfU, 0x3bU, 0xbfU, 0x29U, 0xc0U, 0xaaU, 0x00U, - 0xbfU, 0x1bU, 0xc0U, 0xe1U, 0x00U, 0xbfU, 0x39U, 0xc0U, 0xfeU, - 0x00U, 0xbbU, 0xc0U, 0xd6U, 0x00U, 0xbfU, 0x0cU, 0xc0U, 0x86U, - 0x00U, 0xc0U, 0x94U, 0x00U, 0xc0U, 0xd3U, 0x00U, 0xc0U, 0x95U, - 0x00U, 0xbfU, 0x0aU, 0xc0U, 0x8dU, 0x00U, 0xc0U, 0x80U, 0x00U, - 0xbfU, 0x25U, 0xbfU, 0x1dU, 0xbfU, 0x10U, 0xc0U, 0xb5U, 0x00U, - 0xbfU, 0x63U, 0xc0U, 0xa8U, 0x00U, 0xbfU, 0x22U, 0x26U, 0x20U, - 0x00U, 0x3aU, 0xe5U, 0x00U, 0x00U, 0x00U, 0xb7U, 0xb7U, 0xbfU, - 0x2dU, 0xbfU, 0x0cU, 0xc0U, 0xb3U, 0x00U, 0xc0U, 0xcdU, 0x00U, - 0xbfU, 0x60U, 0xc0U, 0xdaU, 0x00U, 0xbfU, 0x33U, 0xc0U, 0xb5U, - 0x00U, 0xc0U, 0xaaU, 0x00U, 0xbfU, 0x7fU, 0xc0U, 0xeaU, 0x00U, - 0xbfU, 0x32U, 0xbfU, 0x1fU, 0xbfU, 0x11U, 0xbfU, 0x16U, 0xbfU, - 0x63U, 0xc0U, 0xeaU, 0x00U, 0xc0U, 0xedU, 0x00U, 0xbfU, 0x32U, - 0xbfU, 0x48U, 0xbfU, 0x1cU, 0xbfU, 0x6bU, 0xbfU, 0x70U, 0xbfU, - 0x0eU, 0xbfU, 0x48U, 0xbfU, 0x45U, 0xbfU, 0x50U, 0xc0U, 0xf4U, - 0x00U, 0xbfU, 0x5aU, 0xc0U, 0xd9U, 0x00U, 0x26U, 0x20U, 0x00U, - 0xbfU, 0x62U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x23U, - 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x3aU, 0xe6U, 0x00U, 0x00U, - 0x00U, 0xbfU, 0x2dU, 0xbfU, 0x0cU, 0xc0U, 0xb3U, 0x00U, 0xc0U, - 0xcdU, 0x00U, 0xbfU, 0x60U, 0xc0U, 0xdaU, 0x00U, 0xbfU, 0x33U, - 0xc0U, 0xb5U, 0x00U, 0xc0U, 0xaaU, 0x00U, 0xbfU, 0x7fU, 0xc0U, - 0xeaU, 0x00U, 0xbfU, 0x32U, 0xbfU, 0x1fU, 0xbfU, 0x11U, 0xbfU, - 0x16U, 0xbfU, 0x63U, 0xc0U, 0xeaU, 0x00U, 0xc0U, 0xedU, 0x00U, - 0xbfU, 0x32U, 0xbfU, 0x48U, 0xbfU, 0x1cU, 0xbfU, 0x6bU, 0xbfU, - 0x70U, 0xbfU, 0x0eU, 0xbfU, 0x48U, 0xbfU, 0x45U, 0xbfU, 0x50U, - 0xc0U, 0xf4U, 0x00U, 0xbfU, 0x5aU, 0xc0U, 0xd9U, 0x00U, 0xbfU, - 0x62U, 0xbfU, 0x23U, 0x26U, 0x20U, 0x00U, 0x3aU, 0xe7U, 0x00U, - 0x00U, 0x00U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, - 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xbfU, 0x55U, 0xbfU, 0x53U, - 0xbfU, 0x44U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0x26U, 0x14U, - 0x00U, 0x3aU, 0xe8U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x75U, 0xbfU, - 0x6eU, 0xc0U, 0xdeU, 0x00U, 0xc0U, 0x88U, 0x00U, 0xc0U, 0xa9U, - 0x00U, 0xbeU, 0xc0U, 0xd4U, 0x00U, 0xc0U, 0xccU, 0x00U, 0xc0U, - 0xf3U, 0x00U, 0xc0U, 0x8dU, 0x00U, 0xbfU, 0x6aU, 0xc0U, 0xdbU, - 0x00U, 0xc0U, 0x9fU, 0x00U, 0xc0U, 0xc7U, 0x00U, 0xc0U, 0x94U, - 0x00U, 0xbfU, 0x64U, 0xbfU, 0x19U, 0xc0U, 0xf0U, 0x00U, 0xc0U, - 0xc4U, 0x00U, 0xbfU, 0x1dU, 0x26U, 0x14U, 0x00U, 0x3aU, 0xe9U, - 0x00U, 0x00U, 0x00U, 0xbfU, 0x3aU, 0xbfU, 0x51U, 0xc0U, 0x8aU, - 0x00U, 0xbfU, 0x22U, 0xbfU, 0x53U, 0xc0U, 0x81U, 0x00U, 0xbfU, - 0x60U, 0xc0U, 0x84U, 0x00U, 0xbfU, 0x1cU, 0xbfU, 0x14U, 0xbfU, - 0x32U, 0xc0U, 0xfeU, 0x00U, 0xbfU, 0x6fU, 0xbfU, 0x3eU, 0xbfU, - 0x6dU, 0xbfU, 0x6eU, 0xbfU, 0x76U, 0xbfU, 0x29U, 0xc0U, 0xfbU, - 0x00U, 0xc0U, 0xbaU, 0x00U, 0x26U, 0x14U, 0x00U, 0x3aU, 0xeaU, - 0x00U, 0x00U, 0x00U, 0xb8U, 0x3aU, 0xebU, 0x00U, 0x00U, 0x00U, - 0xb9U, 0x3aU, 0xecU, 0x00U, 0x00U, 0x00U, 0xbaU, 0x3aU, 0xedU, - 0x00U, 0x00U, 0x00U, 0xbbU, 0x3aU, 0xeeU, 0x00U, 0x00U, 0x00U, - 0xbcU, 0x3aU, 0xefU, 0x00U, 0x00U, 0x00U, 0xbdU, 0x3aU, 0xf0U, - 0x00U, 0x00U, 0x00U, 0xbeU, 0x3aU, 0xf1U, 0x00U, 0x00U, 0x00U, - 0xbfU, 0x08U, 0x3aU, 0xf2U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x09U, - 0x3aU, 0xf3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x0aU, 0x3aU, 0xf4U, - 0x00U, 0x00U, 0x00U, 0xbfU, 0x0bU, 0x3aU, 0xf5U, 0x00U, 0x00U, - 0x00U, 0xbfU, 0x0cU, 0x3aU, 0xf6U, 0x00U, 0x00U, 0x00U, 0xbfU, - 0x0dU, 0x3aU, 0xf7U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x0eU, 0x3aU, - 0xf8U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x0fU, 0x3aU, 0xf9U, 0x00U, - 0x00U, 0x00U, 0xbfU, 0x10U, 0x3aU, 0xfaU, 0x00U, 0x00U, 0x00U, - 0xbfU, 0x11U, 0x3aU, 0xfbU, 0x00U, 0x00U, 0x00U, 0xbfU, 0x12U, - 0x3aU, 0xfcU, 0x00U, 0x00U, 0x00U, 0xbfU, 0x13U, 0x3aU, 0xfdU, - 0x00U, 0x00U, 0x00U, 0xbfU, 0x14U, 0x3aU, 0xfeU, 0x00U, 0x00U, - 0x00U, 0xbfU, 0x15U, 0x3aU, 0xffU, 0x00U, 0x00U, 0x00U, 0xbfU, - 0x16U, 0x3aU, 0x00U, 0x01U, 0x00U, 0x00U, 0xbfU, 0x17U, 0x3aU, - 0x01U, 0x01U, 0x00U, 0x00U, 0xbfU, 0x18U, 0x3aU, 0x02U, 0x01U, - 0x00U, 0x00U, 0xbfU, 0x19U, 0x3aU, 0x03U, 0x01U, 0x00U, 0x00U, - 0xbfU, 0x1aU, 0x3aU, 0x04U, 0x01U, 0x00U, 0x00U, 0xbfU, 0xf9U, - 0x3aU, 0x05U, 0x01U, 0x00U, 0x00U, 0xc2U, 0x02U, 0x4dU, 0x06U, - 0x01U, 0x00U, 0x00U, 0x3aU, 0x06U, 0x01U, 0x00U, 0x00U, 0xc7U, - 0x28U, 0x8eU, 0x04U, 0x01U, 0x45U, 0x00U, 0xd8U, 0x01U, 0x01U, - 0x00U, 0xd8U, 0x01U, 0x0eU, 0x00U, 0x0cU, 0x08U, 0x41U, 0x12U, - 0x99U, 0xa8U, 0x4eU, 0x1eU, 0x08U, 0x9eU, 0x8fU, 0x94U, 0x1dU, - 0x0dU, 0xa3U, 0x8fU, 0x4eU, 0x1dU, 0x08U, 0x4eU, 0x35U, 0x1eU, - 0x0dU, 0xb2U, 0x5dU, 0x1dU, 0x0dU, 0x99U, 0x58U, 0x1dU, 0x21U, - 0x21U, 0x21U, 0x21U, 0x21U, 0x21U, 0x21U, 0x26U, 0x26U, 0x26U, - 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, - 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x27U, 0x00U, 0x07U, - 0xa8U, 0x04U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x02U, 0x00U, - 0x02U, 0x04U, 0x00U, 0x00U, 0x24U, 0x02U, 0x90U, 0x04U, 0x00U, - 0x01U, 0x00U, 0x92U, 0x04U, 0x00U, 0x01U, 0x00U, 0xd3U, 0x97U, - 0xecU, 0x20U, 0x38U, 0x0aU, 0x01U, 0x00U, 0x00U, 0x04U, 0x0bU, - 0x01U, 0x00U, 0x00U, 0xb7U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0x0cU, - 0x01U, 0x00U, 0x00U, 0xd3U, 0x42U, 0x38U, 0x00U, 0x00U, 0x00U, - 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, 0x0eU, 0x29U, 0x8eU, 0x04U, - 0x02U, 0x04U, 0x03U, 0x17U, 0x49U, 0x59U, 0x0cU, 0x02U, 0x06U, - 0x00U, 0x00U, 0x02U, 0x00U, 0x02U, 0x04U, 0x00U, 0x00U, 0x2fU, - 0x02U, 0x9aU, 0x04U, 0x00U, 0x01U, 0x00U, 0x9cU, 0x04U, 0x00U, - 0x01U, 0x00U, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xd4U, 0xb7U, - 0x47U, 0xd3U, 0xb7U, 0x47U, 0xacU, 0x11U, 0xecU, 0x1fU, 0x0eU, - 0xd4U, 0xb8U, 0x47U, 0xd3U, 0xb8U, 0x47U, 0xacU, 0x11U, 0xecU, - 0x14U, 0x0eU, 0xd4U, 0xb9U, 0x47U, 0xd3U, 0xb9U, 0x47U, 0xacU, - 0x11U, 0xecU, 0x09U, 0x0eU, 0xd4U, 0xbaU, 0x47U, 0xd3U, 0xbaU, - 0x47U, 0xacU, 0xf1U, 0x29U, 0x8eU, 0x04U, 0x09U, 0x02U, 0x03U, - 0xe9U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x01U, 0x02U, 0x01U, - 0x20U, 0x00U, 0x00U, 0xefU, 0x1dU, 0x03U, 0x9eU, 0x04U, 0x00U, - 0x01U, 0x00U, 0xa0U, 0x04U, 0x01U, 0x00U, 0x20U, 0xa2U, 0x04U, - 0x01U, 0x01U, 0x20U, 0x61U, 0x01U, 0x00U, 0x61U, 0x00U, 0x00U, - 0x06U, 0xcbU, 0x06U, 0xccU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, - 0x38U, 0xebU, 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, - 0x00U, 0xf2U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, - 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, - 0xacU, 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x48U, 0xbfU, 0x6cU, 0xbfU, - 0x4bU, 0xbfU, 0x29U, 0xc0U, 0xc6U, 0x00U, 0xbfU, 0x0fU, 0xbfU, - 0x40U, 0xbfU, 0x5dU, 0xc0U, 0xb7U, 0x00U, 0xbfU, 0x6eU, 0xc0U, - 0x87U, 0x00U, 0xbfU, 0x65U, 0xbfU, 0x4aU, 0xbfU, 0x2fU, 0xbfU, - 0x15U, 0xbfU, 0x4bU, 0xc0U, 0xabU, 0x00U, 0xc0U, 0x99U, 0x00U, - 0xc0U, 0xc7U, 0x00U, 0xbfU, 0x62U, 0xbfU, 0x29U, 0xc0U, 0x80U, - 0x00U, 0xbfU, 0x10U, 0xc0U, 0xa1U, 0x00U, 0xc0U, 0x89U, 0x00U, - 0xbfU, 0x78U, 0xbfU, 0x52U, 0xc0U, 0x90U, 0x00U, 0xc0U, 0x80U, - 0x00U, 0xbfU, 0x2fU, 0xbfU, 0x78U, 0x26U, 0x20U, 0x00U, 0xc0U, - 0xbdU, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xccU, - 0x00U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, - 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, - 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, - 0x00U, 0x00U, 0x38U, 0xecU, 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, - 0x00U, 0x00U, 0x00U, 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, 0x38U, - 0xe5U, 0x00U, 0x00U, 0x00U, 0x22U, 0x04U, 0x00U, 0x11U, 0x63U, - 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, - 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0xb7U, - 0xbfU, 0x76U, 0xbfU, 0x28U, 0xc0U, 0xafU, 0x00U, 0xc0U, 0xccU, - 0x00U, 0xbfU, 0x25U, 0xbfU, 0x0aU, 0xbfU, 0x64U, 0xbfU, 0x41U, - 0xc0U, 0x8eU, 0x00U, 0xc0U, 0xb7U, 0x00U, 0xc0U, 0x83U, 0x00U, - 0xbfU, 0x68U, 0xc0U, 0xebU, 0x00U, 0xbfU, 0x4eU, 0xc0U, 0xc5U, - 0x00U, 0xbfU, 0x52U, 0xbfU, 0x4aU, 0xc0U, 0xebU, 0x00U, 0xc0U, - 0x97U, 0x00U, 0xbfU, 0x54U, 0xc0U, 0xabU, 0x00U, 0xc0U, 0xc1U, - 0x00U, 0xbfU, 0x0bU, 0xbfU, 0x13U, 0xbdU, 0xbfU, 0x7fU, 0xc0U, - 0xfbU, 0x00U, 0xc0U, 0x9fU, 0x00U, 0xbfU, 0x4bU, 0xc0U, 0xd8U, - 0x00U, 0xbfU, 0x38U, 0x26U, 0x20U, 0x00U, 0xbfU, 0x62U, 0x4cU, - 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xf2U, 0x00U, 0x4cU, 0x21U, - 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, - 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, - 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, - 0xedU, 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, - 0xf2U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, - 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, - 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x61U, 0xc0U, 0xc6U, 0x00U, 0xbfU, - 0x55U, 0xc0U, 0xddU, 0x00U, 0xc0U, 0x8dU, 0x00U, 0xc0U, 0x8eU, - 0x00U, 0xc0U, 0xd3U, 0x00U, 0xc0U, 0xbaU, 0x00U, 0xc0U, 0xb4U, - 0x00U, 0xc0U, 0xa0U, 0x00U, 0xc0U, 0xf1U, 0x00U, 0xc0U, 0xecU, - 0x00U, 0xbfU, 0x2dU, 0xc0U, 0xa9U, 0x00U, 0xc0U, 0x99U, 0x00U, - 0xc0U, 0xf4U, 0x00U, 0xbfU, 0x1bU, 0xc0U, 0xa6U, 0x00U, 0xc0U, - 0x82U, 0x00U, 0xc0U, 0xc6U, 0x00U, 0xc0U, 0x84U, 0x00U, 0xc0U, - 0xf9U, 0x00U, 0xc0U, 0x99U, 0x00U, 0xbfU, 0x66U, 0xc0U, 0xb9U, - 0x00U, 0xbfU, 0x3cU, 0xc0U, 0x9aU, 0x00U, 0xc0U, 0xc3U, 0x00U, - 0xc0U, 0xe3U, 0x00U, 0xbfU, 0x5cU, 0xc0U, 0x9aU, 0x00U, 0x26U, - 0x20U, 0x00U, 0xc0U, 0x81U, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, - 0x80U, 0xbfU, 0x6dU, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, - 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, - 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, - 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xeeU, 0x00U, 0x00U, 0x00U, - 0xf1U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, - 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, - 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x66U, 0xbfU, 0x7dU, 0xc0U, 0xb0U, - 0x00U, 0xbfU, 0x78U, 0xc0U, 0x8cU, 0x00U, 0xb9U, 0xbfU, 0x0fU, - 0xb9U, 0xbfU, 0x78U, 0xbfU, 0x0aU, 0xbfU, 0x67U, 0xbfU, 0x3dU, - 0xc0U, 0xc7U, 0x00U, 0xbfU, 0x47U, 0xbfU, 0x57U, 0xc0U, 0xf2U, - 0x00U, 0xbfU, 0x38U, 0xbfU, 0x23U, 0xc0U, 0xfaU, 0x00U, 0xbfU, - 0x30U, 0xbfU, 0x14U, 0xc0U, 0xc1U, 0x00U, 0xc0U, 0x86U, 0x00U, - 0xbfU, 0x6eU, 0xbfU, 0x72U, 0xc0U, 0xccU, 0x00U, 0xbfU, 0x4cU, - 0xc0U, 0xd8U, 0x00U, 0xc0U, 0xb2U, 0x00U, 0xbfU, 0x26U, 0xc0U, - 0xcdU, 0x00U, 0x26U, 0x20U, 0x00U, 0xbfU, 0x6eU, 0x4cU, 0x20U, - 0x00U, 0x00U, 0x80U, 0xc0U, 0xf4U, 0x00U, 0x4cU, 0x21U, 0x00U, - 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, - 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, - 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xefU, - 0x00U, 0x00U, 0x00U, 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, 0xf2U, - 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, - 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, - 0x0eU, 0xbfU, 0x1cU, 0xc0U, 0xd2U, 0x00U, 0xbfU, 0x2dU, 0xbfU, - 0x0cU, 0xc0U, 0xb3U, 0x00U, 0xc0U, 0xcdU, 0x00U, 0xbfU, 0x60U, - 0xc0U, 0xdaU, 0x00U, 0xbfU, 0x33U, 0xc0U, 0xb5U, 0x00U, 0xc0U, - 0xaaU, 0x00U, 0xbfU, 0x7fU, 0xc0U, 0xeaU, 0x00U, 0xbfU, 0x32U, - 0xbfU, 0x1fU, 0xbfU, 0x11U, 0xbfU, 0x16U, 0xbfU, 0x63U, 0xc0U, - 0xeaU, 0x00U, 0xc0U, 0xedU, 0x00U, 0xbfU, 0x32U, 0xbfU, 0x48U, - 0xbfU, 0x1cU, 0xbfU, 0x6bU, 0xbfU, 0x70U, 0xbfU, 0x0eU, 0xbfU, - 0x48U, 0xbfU, 0x45U, 0xbfU, 0x50U, 0xc0U, 0xf4U, 0x00U, 0xbfU, - 0x5aU, 0xc0U, 0xd9U, 0x00U, 0x26U, 0x20U, 0x00U, 0xbfU, 0x62U, - 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x23U, 0x4cU, 0x21U, - 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, - 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, - 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, - 0xf0U, 0x00U, 0x00U, 0x00U, 0xf1U, 0x11U, 0x63U, 0x00U, 0x00U, - 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, - 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x68U, - 0xc0U, 0xb4U, 0x00U, 0xc0U, 0x97U, 0x00U, 0xc0U, 0x9aU, 0x00U, - 0xbfU, 0x36U, 0xc0U, 0xcdU, 0x00U, 0xc0U, 0xc7U, 0x00U, 0xc0U, - 0xf3U, 0x00U, 0xc0U, 0xd3U, 0x00U, 0xc0U, 0xd5U, 0x00U, 0xc0U, - 0xc3U, 0x00U, 0xbfU, 0x1aU, 0xbfU, 0x4eU, 0xc0U, 0xaeU, 0x00U, - 0xbfU, 0x2aU, 0xc0U, 0xc7U, 0x00U, 0xc0U, 0xd7U, 0x00U, 0xbfU, - 0x20U, 0xc0U, 0x9dU, 0x00U, 0xc0U, 0xdaU, 0x00U, 0xc0U, 0x87U, - 0x00U, 0xbfU, 0x75U, 0xc0U, 0x88U, 0x00U, 0xc0U, 0xb9U, 0x00U, - 0xc0U, 0xafU, 0x00U, 0xc0U, 0xc6U, 0x00U, 0xbfU, 0x67U, 0xc0U, - 0x99U, 0x00U, 0xbfU, 0x69U, 0xbfU, 0x2aU, 0xc0U, 0xb0U, 0x00U, - 0x26U, 0x20U, 0x00U, 0xc0U, 0xd6U, 0x00U, 0x4cU, 0x20U, 0x00U, - 0x00U, 0x80U, 0xbfU, 0x6bU, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, - 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, - 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, - 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf1U, 0x00U, 0x00U, - 0x00U, 0xf1U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, - 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, - 0xacU, 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x73U, 0xbfU, 0x4bU, 0xc0U, - 0xc5U, 0x00U, 0xbfU, 0x0cU, 0xc0U, 0x9bU, 0x00U, 0xbfU, 0x0dU, - 0xc0U, 0x85U, 0x00U, 0xbfU, 0x15U, 0xc0U, 0xd3U, 0x00U, 0xc0U, - 0xeaU, 0x00U, 0xc0U, 0xaeU, 0x00U, 0xbfU, 0x1eU, 0xbfU, 0x74U, - 0xc0U, 0xb2U, 0x00U, 0xc0U, 0x9aU, 0x00U, 0xc0U, 0x95U, 0x00U, - 0xc0U, 0x80U, 0x00U, 0xbfU, 0x43U, 0xbfU, 0x46U, 0xc0U, 0xc4U, - 0x00U, 0xc0U, 0x91U, 0x00U, 0xc0U, 0xeeU, 0x00U, 0xbfU, 0x1aU, - 0xc0U, 0x95U, 0x00U, 0xc0U, 0xbfU, 0x00U, 0xbfU, 0x25U, 0xc0U, - 0xe4U, 0x00U, 0xc0U, 0xaaU, 0x00U, 0xc0U, 0xb8U, 0x00U, 0xbfU, - 0x54U, 0xc0U, 0xa6U, 0x00U, 0x26U, 0x20U, 0x00U, 0xc0U, 0xa6U, - 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x51U, 0x4cU, - 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, - 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, - 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, - 0x38U, 0xf2U, 0x00U, 0x00U, 0x00U, 0xf1U, 0x11U, 0x63U, 0x00U, - 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, - 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0xb7U, 0xbfU, - 0x4eU, 0xbfU, 0x2eU, 0xc0U, 0x8aU, 0x00U, 0xbfU, 0x59U, 0xc0U, - 0xaaU, 0x00U, 0xc0U, 0x9dU, 0x00U, 0xbfU, 0x3bU, 0xbfU, 0x5bU, - 0xbfU, 0x18U, 0xbfU, 0x6bU, 0xbfU, 0x0bU, 0xc0U, 0x9eU, 0x00U, - 0xbfU, 0x0fU, 0xbfU, 0x62U, 0xc0U, 0xe6U, 0x00U, 0xc0U, 0xc0U, - 0x00U, 0xbfU, 0x25U, 0xc0U, 0x87U, 0x00U, 0xc0U, 0xcaU, 0x00U, - 0xbfU, 0x74U, 0xc0U, 0xa4U, 0x00U, 0xc0U, 0xd7U, 0x00U, 0xbfU, - 0x78U, 0xc0U, 0x93U, 0x00U, 0xc0U, 0x8eU, 0x00U, 0xc0U, 0x95U, - 0x00U, 0xbfU, 0x7bU, 0xbfU, 0x63U, 0xbfU, 0x57U, 0xc0U, 0xd3U, - 0x00U, 0xbfU, 0x64U, 0x26U, 0x20U, 0x00U, 0xc0U, 0xb2U, 0x00U, - 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x44U, 0x4cU, 0x21U, - 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, - 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, - 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, - 0xf3U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, - 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0x38U, 0xe8U, 0x00U, 0x00U, - 0x00U, 0x22U, 0x04U, 0x00U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, - 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, - 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x72U, 0xbfU, - 0x0eU, 0xc0U, 0xb8U, 0x00U, 0xbfU, 0x2aU, 0xc0U, 0xddU, 0x00U, - 0xbfU, 0x5eU, 0xbfU, 0x15U, 0xbfU, 0x59U, 0xbfU, 0x1bU, 0xc0U, - 0xf6U, 0x00U, 0xc0U, 0xe3U, 0x00U, 0xbfU, 0x6dU, 0xc0U, 0xbcU, - 0x00U, 0xbfU, 0x3cU, 0xbfU, 0x12U, 0xc0U, 0xd3U, 0x00U, 0xbeU, - 0xbfU, 0x6dU, 0xbfU, 0x43U, 0xc0U, 0xa8U, 0x00U, 0xbfU, 0x53U, - 0xc0U, 0xf8U, 0x00U, 0xc0U, 0xf9U, 0x00U, 0xc0U, 0xe8U, 0x00U, - 0xc0U, 0xa7U, 0x00U, 0xc0U, 0xd8U, 0x00U, 0xbfU, 0x4fU, 0xc0U, - 0xe1U, 0x00U, 0xc0U, 0xe9U, 0x00U, 0xbfU, 0x7aU, 0xbfU, 0x2aU, - 0x26U, 0x20U, 0x00U, 0xc0U, 0xc7U, 0x00U, 0x4cU, 0x20U, 0x00U, - 0x00U, 0x80U, 0xbfU, 0x3dU, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, - 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, - 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, - 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf4U, 0x00U, 0x00U, - 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0xb8U, 0xf3U, 0x11U, - 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, - 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, - 0xb7U, 0xbfU, 0x6fU, 0xbfU, 0x60U, 0xbfU, 0x14U, 0xbfU, 0x48U, - 0xc0U, 0x80U, 0x00U, 0xc0U, 0x97U, 0x00U, 0xbfU, 0x5fU, 0xbfU, - 0x76U, 0xbfU, 0x6aU, 0xc0U, 0xb2U, 0x00U, 0xbfU, 0x2cU, 0xbfU, - 0x32U, 0xbfU, 0x2fU, 0xbfU, 0x10U, 0xc0U, 0x8eU, 0x00U, 0xbaU, - 0xbfU, 0x43U, 0xbfU, 0x51U, 0xc0U, 0xdeU, 0x00U, 0xc0U, 0x89U, - 0x00U, 0xbfU, 0x6cU, 0xc0U, 0xf4U, 0x00U, 0xc0U, 0x9fU, 0x00U, - 0xbfU, 0x6bU, 0xbfU, 0x4aU, 0xc0U, 0xc7U, 0x00U, 0xbfU, 0x2cU, - 0xbfU, 0x54U, 0xc0U, 0xf7U, 0x00U, 0xbfU, 0x27U, 0xbfU, 0x29U, - 0x26U, 0x20U, 0x00U, 0xc0U, 0x9bU, 0x00U, 0x4cU, 0x20U, 0x00U, - 0x00U, 0x80U, 0xc0U, 0xe8U, 0x00U, 0x4cU, 0x21U, 0x00U, 0x00U, - 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, - 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, - 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf4U, 0x00U, - 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe5U, - 0x00U, 0x00U, 0x00U, 0xf3U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, - 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, - 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x6fU, 0xbfU, - 0x23U, 0xbfU, 0x61U, 0xbfU, 0x7fU, 0xbfU, 0x44U, 0xc0U, 0x91U, - 0x00U, 0xbfU, 0x1cU, 0xc0U, 0xbaU, 0x00U, 0xbfU, 0x3bU, 0xbfU, - 0x5cU, 0xc0U, 0xbeU, 0x00U, 0xc0U, 0xe9U, 0x00U, 0xbfU, 0x42U, - 0xbfU, 0x22U, 0xc0U, 0xacU, 0x00U, 0xc0U, 0xa4U, 0x00U, 0xbfU, - 0x29U, 0xc0U, 0xf4U, 0x00U, 0xc0U, 0xd6U, 0x00U, 0xbfU, 0x60U, - 0xb8U, 0xc0U, 0xa8U, 0x00U, 0xc0U, 0xabU, 0x00U, 0xc0U, 0x9bU, - 0x00U, 0xc0U, 0x98U, 0x00U, 0xbfU, 0x5eU, 0xc0U, 0xb8U, 0x00U, - 0xc0U, 0xb8U, 0x00U, 0xbfU, 0x42U, 0xc0U, 0x9fU, 0x00U, 0xbfU, - 0x1eU, 0x26U, 0x20U, 0x00U, 0xc0U, 0x91U, 0x00U, 0x4cU, 0x20U, - 0x00U, 0x00U, 0x80U, 0xbfU, 0x4bU, 0x4cU, 0x21U, 0x00U, 0x00U, - 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, - 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, - 0x0eU, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xb7U, 0xb7U, 0x49U, - 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xb8U, 0xbfU, 0x65U, 0x49U, - 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf5U, 0x00U, 0x00U, - 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xb7U, 0xb8U, 0x22U, - 0x04U, 0x00U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, - 0x00U, 0x00U, 0x00U, 0x38U, 0x05U, 0x01U, 0x00U, 0x00U, 0x62U, - 0x00U, 0x00U, 0xacU, 0xf1U, 0x0eU, 0x38U, 0xe6U, 0x00U, 0x00U, - 0x00U, 0xb8U, 0xbfU, 0x64U, 0x49U, 0x38U, 0x12U, 0x01U, 0x00U, - 0x00U, 0x38U, 0xf5U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, - 0x00U, 0x00U, 0xb7U, 0xb8U, 0x22U, 0x04U, 0x00U, 0x11U, 0x63U, - 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, - 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0xb7U, - 0xbfU, 0x64U, 0xbfU, 0x2dU, 0xbfU, 0x0cU, 0xc0U, 0xb3U, 0x00U, - 0xc0U, 0xcdU, 0x00U, 0xbfU, 0x60U, 0xc0U, 0xdaU, 0x00U, 0xbfU, - 0x33U, 0xc0U, 0xb5U, 0x00U, 0xc0U, 0xaaU, 0x00U, 0xbfU, 0x7fU, - 0xc0U, 0xeaU, 0x00U, 0xbfU, 0x32U, 0xbfU, 0x1fU, 0xbfU, 0x11U, - 0xbfU, 0x16U, 0xbfU, 0x63U, 0xc0U, 0xeaU, 0x00U, 0xc0U, 0xedU, - 0x00U, 0xbfU, 0x32U, 0xbfU, 0x48U, 0xbfU, 0x1cU, 0xbfU, 0x6bU, - 0xbfU, 0x70U, 0xbfU, 0x0eU, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, - 0xb7U, 0x26U, 0x20U, 0x00U, 0xb7U, 0x4cU, 0x20U, 0x00U, 0x00U, - 0x80U, 0xb8U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, - 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, - 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, - 0x01U, 0x00U, 0x00U, 0x38U, 0xf6U, 0x00U, 0x00U, 0x00U, 0xf1U, - 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, - 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, - 0x0eU, 0xb7U, 0xbfU, 0x64U, 0xc0U, 0xb4U, 0x00U, 0xc0U, 0xdeU, - 0x00U, 0xc0U, 0x82U, 0x00U, 0xbfU, 0x30U, 0xbfU, 0x55U, 0xc0U, - 0xd0U, 0x00U, 0xbfU, 0x0bU, 0xc0U, 0xc1U, 0x00U, 0xbfU, 0x2cU, - 0xc0U, 0xd7U, 0x00U, 0xc0U, 0x8fU, 0x00U, 0xc0U, 0xe1U, 0x00U, - 0xc0U, 0xaaU, 0x00U, 0xc0U, 0xf7U, 0x00U, 0xbfU, 0x4eU, 0xc0U, - 0xe6U, 0x00U, 0xbdU, 0xbfU, 0x21U, 0xc0U, 0x95U, 0x00U, 0xc0U, - 0xb2U, 0x00U, 0xbfU, 0x62U, 0xc0U, 0x9fU, 0x00U, 0xbfU, 0x49U, - 0xc0U, 0xa2U, 0x00U, 0xbfU, 0x59U, 0xbfU, 0x15U, 0xc0U, 0xa3U, - 0x00U, 0xc0U, 0x9cU, 0x00U, 0xbfU, 0x64U, 0xc0U, 0xbeU, 0x00U, - 0x26U, 0x20U, 0x00U, 0xbfU, 0x19U, 0x4cU, 0x20U, 0x00U, 0x00U, - 0x80U, 0xb7U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, - 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, - 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, - 0x01U, 0x00U, 0x00U, 0x38U, 0xf8U, 0x00U, 0x00U, 0x00U, 0x38U, - 0xe9U, 0x00U, 0x00U, 0x00U, 0xf2U, 0x11U, 0x63U, 0x00U, 0x00U, - 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, - 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x53U, - 0xc0U, 0xdfU, 0x00U, 0xc0U, 0x8fU, 0x00U, 0xc0U, 0xf0U, 0x00U, - 0xc0U, 0xceU, 0x00U, 0xbfU, 0x41U, 0xbfU, 0x1aU, 0xbfU, 0x3bU, - 0xc0U, 0x8fU, 0x00U, 0xbfU, 0x1bU, 0xc0U, 0xb5U, 0x00U, 0xc0U, - 0xbbU, 0x00U, 0xbfU, 0x32U, 0xbfU, 0x78U, 0xbfU, 0x17U, 0xbfU, - 0x15U, 0xc0U, 0xd6U, 0x00U, 0xbfU, 0x77U, 0xbfU, 0x42U, 0xc0U, - 0xf5U, 0x00U, 0xc0U, 0xb5U, 0x00U, 0xbfU, 0x63U, 0xc0U, 0xb8U, - 0x00U, 0xbfU, 0x77U, 0xc0U, 0xb3U, 0x00U, 0xbfU, 0x3bU, 0xbeU, - 0xbfU, 0x76U, 0xc0U, 0xf6U, 0x00U, 0xc0U, 0xf7U, 0x00U, 0xc0U, - 0xbcU, 0x00U, 0x26U, 0x20U, 0x00U, 0xc0U, 0xdaU, 0x00U, 0x4cU, - 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x1dU, 0x4cU, 0x21U, 0x00U, - 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, - 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, - 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf9U, - 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0xb8U, - 0xf3U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, - 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, - 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x43U, 0xbfU, 0x08U, 0xbfU, 0x1fU, - 0xbfU, 0x26U, 0xc0U, 0xffU, 0x00U, 0xbfU, 0x79U, 0xbfU, 0x1aU, - 0xc0U, 0xf7U, 0x00U, 0xbfU, 0x54U, 0xbfU, 0x26U, 0xc0U, 0xedU, - 0x00U, 0xc0U, 0xf9U, 0x00U, 0xc0U, 0xebU, 0x00U, 0xbfU, 0x08U, - 0xbfU, 0x44U, 0xc0U, 0x85U, 0x00U, 0xbfU, 0x28U, 0xbfU, 0x58U, - 0xbfU, 0x2cU, 0xc0U, 0xb1U, 0x00U, 0xc0U, 0xa4U, 0x00U, 0xc0U, - 0xefU, 0x00U, 0xbfU, 0x4fU, 0xc0U, 0xd0U, 0x00U, 0xc0U, 0xb4U, - 0x00U, 0xbfU, 0x49U, 0xc0U, 0x9bU, 0x00U, 0xbfU, 0x76U, 0xc0U, - 0x82U, 0x00U, 0xc0U, 0xe7U, 0x00U, 0xbfU, 0x69U, 0x26U, 0x20U, - 0x00U, 0xc0U, 0xa6U, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, - 0xc0U, 0xb5U, 0x00U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, - 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, - 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, - 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf9U, 0x00U, 0x00U, 0x00U, - 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, - 0x00U, 0xf3U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, - 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, - 0xacU, 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x43U, 0xc0U, 0x94U, 0x00U, - 0xc0U, 0xe3U, 0x00U, 0xbfU, 0x6fU, 0xbfU, 0x0dU, 0xc0U, 0xd3U, - 0x00U, 0xc0U, 0xedU, 0x00U, 0xc0U, 0xc0U, 0x00U, 0xbfU, 0x2cU, - 0xbfU, 0x49U, 0xc0U, 0xa5U, 0x00U, 0xc0U, 0xaaU, 0x00U, 0xbfU, - 0x0eU, 0xc0U, 0xccU, 0x00U, 0xbfU, 0x49U, 0xbfU, 0x18U, 0xbfU, - 0x39U, 0xc0U, 0x92U, 0x00U, 0xc0U, 0xabU, 0x00U, 0xbfU, 0x57U, - 0xc0U, 0xc3U, 0x00U, 0xbfU, 0x2dU, 0xc0U, 0x9eU, 0x00U, 0xbfU, - 0x45U, 0xbfU, 0x51U, 0xbbU, 0xbfU, 0x78U, 0xbfU, 0x49U, 0xbfU, - 0x49U, 0xc0U, 0xd1U, 0x00U, 0xc0U, 0xe6U, 0x00U, 0x26U, 0x20U, - 0x00U, 0xc0U, 0xd2U, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, - 0xb8U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, - 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, - 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, - 0x00U, 0x00U, 0x38U, 0xfaU, 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, - 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0xf3U, - 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, - 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, - 0x0eU, 0xb7U, 0xbfU, 0x70U, 0xc0U, 0x88U, 0x00U, 0xc0U, 0x90U, - 0x00U, 0xbfU, 0x0fU, 0xbfU, 0x27U, 0xbfU, 0x66U, 0xbfU, 0x57U, - 0xc0U, 0xbcU, 0x00U, 0xc0U, 0xc0U, 0x00U, 0xbfU, 0x5dU, 0xc0U, - 0xa1U, 0x00U, 0xbfU, 0x67U, 0xbfU, 0x40U, 0xc0U, 0xabU, 0x00U, - 0xc0U, 0x9dU, 0x00U, 0xbfU, 0x33U, 0xb8U, 0xc0U, 0x8eU, 0x00U, - 0xbfU, 0x45U, 0xbfU, 0x71U, 0xbfU, 0x7bU, 0xbfU, 0x0eU, 0xc0U, - 0xc4U, 0x00U, 0xbfU, 0x2eU, 0xbfU, 0x4dU, 0xbfU, 0x11U, 0xc0U, - 0xbdU, 0x00U, 0xbfU, 0x6dU, 0xc0U, 0xbdU, 0x00U, 0xc0U, 0x94U, - 0x00U, 0xbaU, 0x26U, 0x20U, 0x00U, 0xbfU, 0x48U, 0x4cU, 0x20U, - 0x00U, 0x00U, 0x80U, 0xc0U, 0xe0U, 0x00U, 0x4cU, 0x21U, 0x00U, - 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, - 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, - 0xf2U, 0x0eU, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xb7U, 0xb7U, - 0x49U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xb8U, 0xb7U, 0x49U, - 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xfbU, 0x00U, 0x00U, - 0x00U, 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, 0xf2U, 0x11U, 0x63U, - 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, - 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0x38U, - 0xe6U, 0x00U, 0x00U, 0x00U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, - 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, - 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, - 0x38U, 0xfcU, 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, - 0x00U, 0xf2U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, - 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, - 0xacU, 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x64U, 0xc0U, 0xc8U, 0x00U, - 0xbfU, 0x5eU, 0xb8U, 0xbfU, 0x29U, 0xbdU, 0xbfU, 0x7bU, 0xbfU, - 0x75U, 0xc0U, 0xadU, 0x00U, 0xbfU, 0x30U, 0xc0U, 0xb0U, 0x00U, - 0xc0U, 0xaaU, 0x00U, 0xbfU, 0x1cU, 0xc0U, 0xc2U, 0x00U, 0xbfU, - 0x5bU, 0xbfU, 0x0aU, 0xc0U, 0x82U, 0x00U, 0xc0U, 0xc7U, 0x00U, - 0xc0U, 0xf9U, 0x00U, 0xc0U, 0xaaU, 0x00U, 0xc0U, 0xbdU, 0x00U, - 0xc0U, 0xeeU, 0x00U, 0xbcU, 0xc0U, 0xffU, 0x00U, 0xb8U, 0xbfU, - 0x66U, 0xbfU, 0x69U, 0xc0U, 0xefU, 0x00U, 0xc0U, 0x9dU, 0x00U, - 0xc0U, 0x82U, 0x00U, 0xc0U, 0xdcU, 0x00U, 0x26U, 0x20U, 0x00U, - 0xc0U, 0xecU, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, - 0x30U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, - 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, - 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, - 0x00U, 0x00U, 0x38U, 0xfdU, 0x00U, 0x00U, 0x00U, 0x38U, 0xe5U, - 0x00U, 0x00U, 0x00U, 0xb7U, 0xb8U, 0x22U, 0x04U, 0x00U, 0x11U, - 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, - 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, - 0xb7U, 0xbfU, 0x64U, 0xbfU, 0x61U, 0xc0U, 0xe6U, 0x00U, 0xbcU, - 0xbfU, 0x1aU, 0xc0U, 0xb0U, 0x00U, 0xbfU, 0x49U, 0xc0U, 0x89U, - 0x00U, 0xbfU, 0x2eU, 0xbfU, 0x75U, 0xc0U, 0xc9U, 0x00U, 0xbfU, - 0x3dU, 0xbfU, 0x67U, 0xc0U, 0xfbU, 0x00U, 0xbfU, 0x7aU, 0xbfU, - 0x63U, 0xc0U, 0xf1U, 0x00U, 0xc0U, 0xefU, 0x00U, 0xbfU, 0x56U, - 0xc0U, 0xddU, 0x00U, 0xc0U, 0xafU, 0x00U, 0xbfU, 0x3eU, 0xbfU, - 0x6bU, 0xbfU, 0x43U, 0xbfU, 0x6fU, 0xbfU, 0x57U, 0xbfU, 0x6eU, - 0xc0U, 0x8cU, 0x00U, 0xb8U, 0xc0U, 0x81U, 0x00U, 0xc0U, 0x98U, - 0x00U, 0x26U, 0x20U, 0x00U, 0xbfU, 0x2eU, 0x4cU, 0x20U, 0x00U, - 0x00U, 0x80U, 0xbfU, 0x48U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, - 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, - 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, - 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xfeU, 0x00U, 0x00U, - 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0xb8U, 0xf3U, 0x11U, - 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, - 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, - 0xb7U, 0xbfU, 0x75U, 0xbfU, 0x13U, 0xc0U, 0xefU, 0x00U, 0xbbU, - 0xc0U, 0xcdU, 0x00U, 0xbfU, 0x33U, 0xbfU, 0x6aU, 0xc0U, 0xadU, - 0x00U, 0xc0U, 0xf6U, 0x00U, 0xbfU, 0x3dU, 0xbfU, 0x0cU, 0xbfU, - 0x7eU, 0xbcU, 0xbfU, 0x6cU, 0xc0U, 0x84U, 0x00U, 0xc0U, 0x9aU, - 0x00U, 0xbfU, 0x7cU, 0xc0U, 0xf6U, 0x00U, 0xbfU, 0x72U, 0xbfU, - 0x5eU, 0xc0U, 0x99U, 0x00U, 0xc0U, 0xbcU, 0x00U, 0xc0U, 0x93U, - 0x00U, 0xc0U, 0x80U, 0x00U, 0xbfU, 0x1eU, 0xc0U, 0xf5U, 0x00U, - 0xbfU, 0x78U, 0xc0U, 0xa0U, 0x00U, 0xbfU, 0x32U, 0xbfU, 0x72U, - 0xbfU, 0x5bU, 0x26U, 0x20U, 0x00U, 0xc0U, 0x84U, 0x00U, 0x4cU, - 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xfeU, 0x00U, 0x4cU, 0x21U, - 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, - 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, - 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, - 0xfeU, 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, - 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xf3U, 0x11U, 0x63U, 0x00U, - 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, - 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0xb7U, 0xbfU, - 0x75U, 0xc0U, 0xc1U, 0x00U, 0xc0U, 0xc6U, 0x00U, 0xc0U, 0xc5U, - 0x00U, 0xbfU, 0x23U, 0xbfU, 0x74U, 0xc0U, 0x87U, 0x00U, 0xbfU, - 0x12U, 0xbfU, 0x56U, 0xc0U, 0xaaU, 0x00U, 0xbfU, 0x7aU, 0xbfU, - 0x1fU, 0xc0U, 0xb3U, 0x00U, 0xbfU, 0x29U, 0xbfU, 0x7aU, 0xbfU, - 0x0aU, 0xbfU, 0x55U, 0xc0U, 0x88U, 0x00U, 0xbfU, 0x7dU, 0xbfU, - 0x16U, 0xbfU, 0x6aU, 0xc0U, 0xcfU, 0x00U, 0xc0U, 0x85U, 0x00U, - 0xbfU, 0x28U, 0xbfU, 0x59U, 0xc0U, 0x88U, 0x00U, 0xc0U, 0xc2U, - 0x00U, 0xc0U, 0xdaU, 0x00U, 0xc0U, 0x81U, 0x00U, 0xbfU, 0x7fU, - 0xbaU, 0x26U, 0x20U, 0x00U, 0xc0U, 0x90U, 0x00U, 0x4cU, 0x20U, - 0x00U, 0x00U, 0x80U, 0xbfU, 0x43U, 0x4cU, 0x21U, 0x00U, 0x00U, - 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, - 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, - 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xffU, 0x00U, - 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, - 0x00U, 0x00U, 0x00U, 0xb8U, 0xb7U, 0x22U, 0x05U, 0x00U, 0x11U, - 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, - 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, - 0xb7U, 0xbfU, 0x78U, 0xc0U, 0xedU, 0x00U, 0xbbU, 0xc0U, 0xceU, - 0x00U, 0xbfU, 0x27U, 0xbfU, 0x20U, 0xbfU, 0x21U, 0xbfU, 0x55U, - 0xbfU, 0x2bU, 0xc0U, 0xbfU, 0x00U, 0xc0U, 0xa1U, 0x00U, 0xc0U, - 0xe5U, 0x00U, 0xc0U, 0xffU, 0x00U, 0xc0U, 0xbbU, 0x00U, 0xbfU, - 0x53U, 0xc0U, 0xb6U, 0x00U, 0xbfU, 0x45U, 0xc0U, 0xa2U, 0x00U, - 0xc0U, 0xffU, 0x00U, 0xc0U, 0x8aU, 0x00U, 0xbfU, 0x44U, 0xbfU, - 0x66U, 0xc0U, 0xd5U, 0x00U, 0xbfU, 0x76U, 0xbfU, 0x24U, 0xc0U, - 0xb5U, 0x00U, 0xbfU, 0x71U, 0xc0U, 0xe6U, 0x00U, 0xbfU, 0x44U, - 0xc0U, 0x9eU, 0x00U, 0xc0U, 0xebU, 0x00U, 0x26U, 0x20U, 0x00U, - 0xc0U, 0xfcU, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, - 0x5aU, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, - 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, - 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, - 0x00U, 0x00U, 0x38U, 0xffU, 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, - 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0x38U, - 0xe5U, 0x00U, 0x00U, 0x00U, 0x22U, 0x04U, 0x00U, 0x11U, 0x63U, - 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, - 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0xb7U, - 0xbfU, 0x78U, 0xbfU, 0x7dU, 0xc0U, 0xe1U, 0x00U, 0xb8U, 0xc0U, - 0xf6U, 0x00U, 0xbfU, 0x2bU, 0xc0U, 0xb0U, 0x00U, 0xbfU, 0x55U, - 0xc0U, 0x80U, 0x00U, 0xc0U, 0xb9U, 0x00U, 0xc0U, 0xd6U, 0x00U, - 0xc0U, 0xb0U, 0x00U, 0xbfU, 0x3fU, 0xbfU, 0x3bU, 0xc0U, 0xb0U, - 0x00U, 0xb8U, 0xc0U, 0xbdU, 0x00U, 0xc0U, 0xe6U, 0x00U, 0xc0U, - 0x9bU, 0x00U, 0xc0U, 0x89U, 0x00U, 0xbfU, 0x0fU, 0xc0U, 0x8aU, - 0x00U, 0xc0U, 0xcdU, 0x00U, 0xc0U, 0xbeU, 0x00U, 0xbfU, 0x71U, - 0xbfU, 0x73U, 0xbfU, 0x5eU, 0xc0U, 0xc3U, 0x00U, 0xbfU, 0x63U, - 0xc0U, 0xf8U, 0x00U, 0xc0U, 0xc5U, 0x00U, 0x26U, 0x20U, 0x00U, - 0xbfU, 0x4bU, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0x9bU, - 0x00U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, - 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, - 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, - 0x00U, 0x00U, 0x38U, 0x00U, 0x01U, 0x00U, 0x00U, 0x38U, 0xe5U, - 0x00U, 0x00U, 0x00U, 0xf2U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, - 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, - 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0xb7U, 0xbfU, 0x45U, 0xc0U, - 0xf3U, 0x00U, 0xbfU, 0x51U, 0xbfU, 0x2dU, 0xbfU, 0x1cU, 0xc0U, - 0x80U, 0x00U, 0xc0U, 0xa3U, 0x00U, 0xc0U, 0xc0U, 0x00U, 0xc0U, - 0xb1U, 0x00U, 0xbfU, 0x46U, 0xbbU, 0xc0U, 0xe1U, 0x00U, 0xc0U, - 0xadU, 0x00U, 0xc0U, 0xdbU, 0x00U, 0xc0U, 0x90U, 0x00U, 0xbfU, - 0x1cU, 0xbfU, 0x66U, 0xbfU, 0x32U, 0xbfU, 0x10U, 0xbfU, 0x08U, - 0xc0U, 0xccU, 0x00U, 0xc0U, 0xd0U, 0x00U, 0xc0U, 0xabU, 0x00U, - 0xc0U, 0xd2U, 0x00U, 0xc0U, 0xdbU, 0x00U, 0xc0U, 0xbeU, 0x00U, - 0xc0U, 0xc4U, 0x00U, 0xbfU, 0x08U, 0xc0U, 0xa6U, 0x00U, 0xbfU, - 0x0fU, 0xbfU, 0x6aU, 0x26U, 0x20U, 0x00U, 0xbfU, 0x62U, 0x4cU, - 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xe9U, 0x00U, 0x4cU, 0x21U, - 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, - 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, - 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, - 0x01U, 0x01U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, - 0xb8U, 0xb7U, 0x22U, 0x04U, 0x00U, 0x11U, 0x63U, 0x00U, 0x00U, - 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, - 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, 0x0eU, 0x38U, 0x12U, 0x01U, - 0x00U, 0x00U, 0x38U, 0x01U, 0x01U, 0x00U, 0x00U, 0x38U, 0xe9U, - 0x00U, 0x00U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xf3U, - 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, - 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xf1U, - 0x0eU, 0x38U, 0x13U, 0x01U, 0x00U, 0x00U, 0xc3U, 0xb7U, 0xf2U, - 0x29U, 0x8eU, 0x04U, 0x4eU, 0xd4U, 0x01U, 0x22U, 0x19U, 0x6cU, - 0x49U, 0x08U, 0x8aU, 0x94U, 0xb7U, 0x1cU, 0x46U, 0xa8U, 0x49U, - 0x08U, 0x94U, 0x99U, 0xadU, 0x1cU, 0x46U, 0x6cU, 0x49U, 0x08U, - 0xadU, 0xa8U, 0xbcU, 0x1cU, 0x46U, 0x53U, 0x49U, 0x08U, 0x7bU, - 0x94U, 0xb7U, 0x1cU, 0x46U, 0x6cU, 0x49U, 0x0dU, 0x9eU, 0x85U, - 0xa8U, 0x1cU, 0x46U, 0x53U, 0x49U, 0x08U, 0xa8U, 0xa3U, 0xb7U, - 0x1cU, 0x46U, 0x53U, 0x49U, 0x08U, 0x99U, 0xa3U, 0xbcU, 0x1cU, - 0x46U, 0x53U, 0x49U, 0x08U, 0x8fU, 0x9eU, 0xb2U, 0x1cU, 0x46U, - 0xa8U, 0x49U, 0x08U, 0x8fU, 0x94U, 0xb7U, 0x1cU, 0x46U, 0x71U, - 0x49U, 0x08U, 0x8aU, 0x8fU, 0xb2U, 0x1cU, 0x46U, 0x85U, 0x49U, - 0x08U, 0x8fU, 0x99U, 0xb7U, 0x1cU, 0x46U, 0x2bU, 0x30U, 0x80U, - 0x00U, 0x10U, 0x12U, 0x30U, 0x80U, 0x49U, 0x08U, 0x99U, 0x85U, - 0x76U, 0x1cU, 0x46U, 0x53U, 0x49U, 0x08U, 0x9eU, 0x99U, 0xadU, - 0x1cU, 0x46U, 0x6cU, 0x49U, 0x08U, 0x9eU, 0x8fU, 0xb2U, 0x1cU, - 0x46U, 0x71U, 0x49U, 0x08U, 0x8fU, 0x99U, 0xbcU, 0x1cU, 0x46U, - 0x85U, 0x49U, 0x08U, 0x9eU, 0x94U, 0xa3U, 0x1cU, 0x46U, 0x85U, - 0x49U, 0x08U, 0x94U, 0x8aU, 0xadU, 0x1cU, 0x46U, 0x2bU, 0x2bU, - 0x6cU, 0x49U, 0x35U, 0x46U, 0x6cU, 0x49U, 0x08U, 0x85U, 0x9eU, - 0xb2U, 0x1cU, 0x46U, 0x80U, 0x49U, 0x08U, 0x8aU, 0x94U, 0xa8U, - 0x1cU, 0x46U, 0x71U, 0x49U, 0x08U, 0x8aU, 0x99U, 0xb2U, 0x1cU, - 0x46U, 0x85U, 0x49U, 0x08U, 0x94U, 0x8fU, 0xb2U, 0x1cU, 0x46U, - 0x99U, 0x49U, 0x08U, 0x8fU, 0x9eU, 0xb7U, 0x1cU, 0x46U, 0xa8U, - 0x49U, 0x08U, 0x99U, 0x9eU, 0xb2U, 0x1cU, 0x46U, 0x6cU, 0x49U, - 0x08U, 0x94U, 0x9eU, 0xb7U, 0x1cU, 0x46U, 0x80U, 0x4bU, 0x85U, - 0x4aU, 0x2bU}; + TestHook hook = {0x43U, 0x31U, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, + 0x54U, 0x18U, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, 0x5fU, 0x4bU, + 0x4cU, 0x5fU, 0x45U, 0x51U, 0x04U, 0x6eU, 0x73U, 0x0aU, 0x6bU, 0x6cU, + 0x6bU, 0x65U, 0x79U, 0x06U, 0x6bU, 0x65U, 0x79U, 0x06U, 0x63U, 0x75U, + 0x72U, 0x02U, 0x61U, 0x02U, 0x62U, 0x16U, 0x4bU, 0x45U, 0x59U, 0x4cU, + 0x45U, 0x54U, 0x5fU, 0x48U, 0x4fU, 0x4fU, 0x4bU, 0x22U, 0x4bU, 0x45U, + 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x48U, 0x4fU, 0x4fU, 0x4bU, 0x5fU, + 0x53U, 0x54U, 0x41U, 0x54U, 0x45U, 0x1cU, 0x4bU, 0x45U, 0x59U, 0x4cU, + 0x45U, 0x54U, 0x5fU, 0x41U, 0x43U, 0x43U, 0x4fU, 0x55U, 0x4eU, 0x54U, + 0x22U, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x41U, 0x4dU, + 0x45U, 0x4eU, 0x44U, 0x4dU, 0x45U, 0x4eU, 0x54U, 0x53U, 0x18U, 0x4bU, + 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x43U, 0x48U, 0x49U, 0x4cU, + 0x44U, 0x16U, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x53U, + 0x4bU, 0x49U, 0x50U, 0x16U, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, + 0x5fU, 0x46U, 0x45U, 0x45U, 0x53U, 0x26U, 0x4bU, 0x45U, 0x59U, 0x4cU, + 0x45U, 0x54U, 0x5fU, 0x4eU, 0x45U, 0x47U, 0x41U, 0x54U, 0x49U, 0x56U, + 0x45U, 0x5fU, 0x55U, 0x4eU, 0x4cU, 0x16U, 0x4bU, 0x45U, 0x59U, 0x4cU, + 0x45U, 0x54U, 0x5fU, 0x4cU, 0x49U, 0x4eU, 0x45U, 0x18U, 0x4bU, 0x45U, + 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x4fU, 0x46U, 0x46U, 0x45U, 0x52U, + 0x1cU, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x51U, 0x55U, + 0x41U, 0x4cU, 0x49U, 0x54U, 0x59U, 0x24U, 0x4bU, 0x45U, 0x59U, 0x4cU, + 0x45U, 0x54U, 0x5fU, 0x45U, 0x4dU, 0x49U, 0x54U, 0x54U, 0x45U, 0x44U, + 0x5fU, 0x44U, 0x49U, 0x52U, 0x1aU, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, + 0x54U, 0x5fU, 0x54U, 0x49U, 0x43U, 0x4bU, 0x45U, 0x54U, 0x1cU, 0x4bU, + 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x53U, 0x49U, 0x47U, 0x4eU, + 0x45U, 0x52U, 0x53U, 0x18U, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, + 0x5fU, 0x43U, 0x48U, 0x45U, 0x43U, 0x4bU, 0x2cU, 0x4bU, 0x45U, 0x59U, + 0x4cU, 0x45U, 0x54U, 0x5fU, 0x44U, 0x45U, 0x50U, 0x4fU, 0x53U, 0x49U, + 0x54U, 0x5fU, 0x50U, 0x52U, 0x45U, 0x41U, 0x55U, 0x54U, 0x48U, 0x20U, + 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x55U, 0x4eU, 0x43U, + 0x48U, 0x45U, 0x43U, 0x4bU, 0x45U, 0x44U, 0x20U, 0x4bU, 0x45U, 0x59U, + 0x4cU, 0x45U, 0x54U, 0x5fU, 0x4fU, 0x57U, 0x4eU, 0x45U, 0x52U, 0x5fU, + 0x44U, 0x49U, 0x52U, 0x16U, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, + 0x5fU, 0x50U, 0x41U, 0x47U, 0x45U, 0x1aU, 0x4bU, 0x45U, 0x59U, 0x4cU, + 0x45U, 0x54U, 0x5fU, 0x45U, 0x53U, 0x43U, 0x52U, 0x4fU, 0x57U, 0x1cU, + 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x50U, 0x41U, 0x59U, + 0x43U, 0x48U, 0x41U, 0x4eU, 0x1cU, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, + 0x54U, 0x5fU, 0x45U, 0x4dU, 0x49U, 0x54U, 0x54U, 0x45U, 0x44U, 0x20U, + 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x4eU, 0x46U, 0x54U, + 0x5fU, 0x4fU, 0x46U, 0x46U, 0x45U, 0x52U, 0x2cU, 0x4bU, 0x45U, 0x59U, + 0x4cU, 0x45U, 0x54U, 0x5fU, 0x48U, 0x4fU, 0x4fU, 0x4bU, 0x5fU, 0x44U, + 0x45U, 0x46U, 0x49U, 0x4eU, 0x49U, 0x54U, 0x49U, 0x4fU, 0x4eU, 0x2aU, + 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x48U, 0x4fU, 0x4fU, + 0x4bU, 0x5fU, 0x53U, 0x54U, 0x41U, 0x54U, 0x45U, 0x5fU, 0x44U, 0x49U, + 0x52U, 0x1eU, 0x4bU, 0x45U, 0x59U, 0x4cU, 0x45U, 0x54U, 0x5fU, 0x55U, + 0x52U, 0x49U, 0x54U, 0x4fU, 0x4bU, 0x45U, 0x4eU, 0x20U, 0x49U, 0x4eU, + 0x56U, 0x41U, 0x4cU, 0x49U, 0x44U, 0x5fU, 0x41U, 0x52U, 0x47U, 0x55U, + 0x4dU, 0x45U, 0x4eU, 0x54U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x2aU, + 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, + 0x74U, 0x2dU, 0x32U, 0x30U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, + 0x73U, 0x02U, 0x78U, 0x08U, 0x63U, 0x6fU, 0x64U, 0x65U, 0x0aU, 0x74U, + 0x72U, 0x61U, 0x63U, 0x65U, 0x0aU, 0x65U, 0x72U, 0x72U, 0x6fU, 0x72U, + 0x10U, 0x72U, 0x6fU, 0x6cU, 0x6cU, 0x62U, 0x61U, 0x63U, 0x6bU, 0x02U, + 0x6dU, 0x02U, 0x6eU, 0x06U, 0x61U, 0x72U, 0x67U, 0x02U, 0x65U, 0x06U, + 0x61U, 0x6eU, 0x73U, 0x16U, 0x75U, 0x74U, 0x69U, 0x6cU, 0x5fU, 0x6bU, + 0x65U, 0x79U, 0x6cU, 0x65U, 0x74U, 0x0cU, 0x61U, 0x63U, 0x63U, 0x65U, + 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, 0x01U, + 0x00U, 0x20U, 0x00U, 0x03U, 0xa3U, 0x08U, 0x01U, 0xa4U, 0x01U, 0x00U, + 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xe4U, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3fU, 0xe6U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xe7U, 0x00U, 0x00U, + 0x00U, 0x80U, 0x3fU, 0xe8U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xe9U, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xeaU, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3fU, 0xebU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xecU, 0x00U, 0x00U, + 0x00U, 0x80U, 0x3fU, 0xedU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xeeU, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xefU, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3fU, 0xf0U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf1U, 0x00U, 0x00U, + 0x00U, 0x80U, 0x3fU, 0xf2U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf3U, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf4U, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3fU, 0xf5U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf6U, 0x00U, 0x00U, + 0x00U, 0x80U, 0x3fU, 0xf7U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf8U, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xf9U, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3fU, 0xfaU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xfbU, 0x00U, 0x00U, + 0x00U, 0x80U, 0x3fU, 0xfcU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xfdU, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xfeU, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3fU, 0xffU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0x00U, 0x01U, 0x00U, + 0x00U, 0x80U, 0x3fU, 0x01U, 0x01U, 0x00U, 0x00U, 0x80U, 0x3fU, 0x02U, + 0x01U, 0x00U, 0x00U, 0x80U, 0x3fU, 0x03U, 0x01U, 0x00U, 0x00U, 0x80U, + 0x3fU, 0x04U, 0x01U, 0x00U, 0x00U, 0x80U, 0x3fU, 0x05U, 0x01U, 0x00U, + 0x00U, 0x80U, 0x3fU, 0x06U, 0x01U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe3U, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3eU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe6U, 0x00U, 0x00U, + 0x00U, 0x80U, 0x3eU, 0xe7U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe8U, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe9U, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3eU, 0xeaU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xebU, 0x00U, 0x00U, + 0x00U, 0x80U, 0x3eU, 0xecU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xedU, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xeeU, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3eU, 0xefU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf0U, 0x00U, 0x00U, + 0x00U, 0x80U, 0x3eU, 0xf1U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf2U, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf3U, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3eU, 0xf4U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf5U, 0x00U, 0x00U, + 0x00U, 0x80U, 0x3eU, 0xf6U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf7U, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xf8U, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3eU, 0xf9U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xfaU, 0x00U, 0x00U, + 0x00U, 0x80U, 0x3eU, 0xfbU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xfcU, + 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xfdU, 0x00U, 0x00U, 0x00U, 0x80U, + 0x3eU, 0xfeU, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xffU, 0x00U, 0x00U, + 0x00U, 0x80U, 0x3eU, 0x00U, 0x01U, 0x00U, 0x00U, 0x80U, 0x3eU, 0x01U, + 0x01U, 0x00U, 0x00U, 0x80U, 0x3eU, 0x02U, 0x01U, 0x00U, 0x00U, 0x80U, + 0x3eU, 0x03U, 0x01U, 0x00U, 0x00U, 0x80U, 0x3eU, 0x04U, 0x01U, 0x00U, + 0x00U, 0x80U, 0x3eU, 0x05U, 0x01U, 0x00U, 0x00U, 0x80U, 0x3eU, 0x06U, + 0x01U, 0x00U, 0x00U, 0x80U, 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, 0x00U, + 0x00U, 0x3aU, 0xe3U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x01U, 0x4dU, 0xe4U, + 0x00U, 0x00U, 0x00U, 0x3aU, 0xe4U, 0x00U, 0x00U, 0x00U, 0xc0U, 0xc5U, + 0x00U, 0xc0U, 0xd0U, 0x00U, 0xc0U, 0xf3U, 0x00U, 0xbfU, 0x4bU, 0xbfU, + 0x0aU, 0xbfU, 0x19U, 0xbcU, 0xc0U, 0xbcU, 0x00U, 0xbfU, 0x3bU, 0xbfU, + 0x29U, 0xc0U, 0xaaU, 0x00U, 0xbfU, 0x1bU, 0xc0U, 0xe1U, 0x00U, 0xbfU, + 0x39U, 0xc0U, 0xfeU, 0x00U, 0xbbU, 0xc0U, 0xd6U, 0x00U, 0xbfU, 0x0cU, + 0xc0U, 0x86U, 0x00U, 0xc0U, 0x94U, 0x00U, 0xc0U, 0xd3U, 0x00U, 0xc0U, + 0x95U, 0x00U, 0xbfU, 0x0aU, 0xc0U, 0x8dU, 0x00U, 0xc0U, 0x80U, 0x00U, + 0xbfU, 0x25U, 0xbfU, 0x1dU, 0xbfU, 0x10U, 0xc0U, 0xb5U, 0x00U, 0xbfU, + 0x63U, 0xc0U, 0xa8U, 0x00U, 0xbfU, 0x22U, 0x26U, 0x20U, 0x00U, 0x3aU, + 0xe5U, 0x00U, 0x00U, 0x00U, 0xb7U, 0xb7U, 0xbfU, 0x2dU, 0xbfU, 0x0cU, + 0xc0U, 0xb3U, 0x00U, 0xc0U, 0xcdU, 0x00U, 0xbfU, 0x60U, 0xc0U, 0xdaU, + 0x00U, 0xbfU, 0x33U, 0xc0U, 0xb5U, 0x00U, 0xc0U, 0xaaU, 0x00U, 0xbfU, + 0x7fU, 0xc0U, 0xeaU, 0x00U, 0xbfU, 0x32U, 0xbfU, 0x1fU, 0xbfU, 0x11U, + 0xbfU, 0x16U, 0xbfU, 0x63U, 0xc0U, 0xeaU, 0x00U, 0xc0U, 0xedU, 0x00U, + 0xbfU, 0x32U, 0xbfU, 0x48U, 0xbfU, 0x1cU, 0xbfU, 0x6bU, 0xbfU, 0x70U, + 0xbfU, 0x0eU, 0xbfU, 0x48U, 0xbfU, 0x45U, 0xbfU, 0x50U, 0xc0U, 0xf4U, + 0x00U, 0xbfU, 0x5aU, 0xc0U, 0xd9U, 0x00U, 0x26U, 0x20U, 0x00U, 0xbfU, + 0x62U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x23U, 0x4cU, 0x21U, + 0x00U, 0x00U, 0x80U, 0x3aU, 0xe6U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x2dU, + 0xbfU, 0x0cU, 0xc0U, 0xb3U, 0x00U, 0xc0U, 0xcdU, 0x00U, 0xbfU, 0x60U, + 0xc0U, 0xdaU, 0x00U, 0xbfU, 0x33U, 0xc0U, 0xb5U, 0x00U, 0xc0U, 0xaaU, + 0x00U, 0xbfU, 0x7fU, 0xc0U, 0xeaU, 0x00U, 0xbfU, 0x32U, 0xbfU, 0x1fU, + 0xbfU, 0x11U, 0xbfU, 0x16U, 0xbfU, 0x63U, 0xc0U, 0xeaU, 0x00U, 0xc0U, + 0xedU, 0x00U, 0xbfU, 0x32U, 0xbfU, 0x48U, 0xbfU, 0x1cU, 0xbfU, 0x6bU, + 0xbfU, 0x70U, 0xbfU, 0x0eU, 0xbfU, 0x48U, 0xbfU, 0x45U, 0xbfU, 0x50U, + 0xc0U, 0xf4U, 0x00U, 0xbfU, 0x5aU, 0xc0U, 0xd9U, 0x00U, 0xbfU, 0x62U, + 0xbfU, 0x23U, 0x26U, 0x20U, 0x00U, 0x3aU, 0xe7U, 0x00U, 0x00U, 0x00U, + 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xbfU, 0x55U, 0xbfU, 0x53U, 0xbfU, 0x44U, 0xb7U, 0xb7U, + 0xb7U, 0xb7U, 0xb7U, 0x26U, 0x14U, 0x00U, 0x3aU, 0xe8U, 0x00U, 0x00U, + 0x00U, 0xbfU, 0x75U, 0xbfU, 0x6eU, 0xc0U, 0xdeU, 0x00U, 0xc0U, 0x88U, + 0x00U, 0xc0U, 0xa9U, 0x00U, 0xbeU, 0xc0U, 0xd4U, 0x00U, 0xc0U, 0xccU, + 0x00U, 0xc0U, 0xf3U, 0x00U, 0xc0U, 0x8dU, 0x00U, 0xbfU, 0x6aU, 0xc0U, + 0xdbU, 0x00U, 0xc0U, 0x9fU, 0x00U, 0xc0U, 0xc7U, 0x00U, 0xc0U, 0x94U, + 0x00U, 0xbfU, 0x64U, 0xbfU, 0x19U, 0xc0U, 0xf0U, 0x00U, 0xc0U, 0xc4U, + 0x00U, 0xbfU, 0x1dU, 0x26U, 0x14U, 0x00U, 0x3aU, 0xe9U, 0x00U, 0x00U, + 0x00U, 0xbfU, 0x3aU, 0xbfU, 0x51U, 0xc0U, 0x8aU, 0x00U, 0xbfU, 0x22U, + 0xbfU, 0x53U, 0xc0U, 0x81U, 0x00U, 0xbfU, 0x60U, 0xc0U, 0x84U, 0x00U, + 0xbfU, 0x1cU, 0xbfU, 0x14U, 0xbfU, 0x32U, 0xc0U, 0xfeU, 0x00U, 0xbfU, + 0x6fU, 0xbfU, 0x3eU, 0xbfU, 0x6dU, 0xbfU, 0x6eU, 0xbfU, 0x76U, 0xbfU, + 0x29U, 0xc0U, 0xfbU, 0x00U, 0xc0U, 0xbaU, 0x00U, 0x26U, 0x14U, 0x00U, + 0x3aU, 0xeaU, 0x00U, 0x00U, 0x00U, 0xb8U, 0x3aU, 0xebU, 0x00U, 0x00U, + 0x00U, 0xb9U, 0x3aU, 0xecU, 0x00U, 0x00U, 0x00U, 0xbaU, 0x3aU, 0xedU, + 0x00U, 0x00U, 0x00U, 0xbbU, 0x3aU, 0xeeU, 0x00U, 0x00U, 0x00U, 0xbcU, + 0x3aU, 0xefU, 0x00U, 0x00U, 0x00U, 0xbdU, 0x3aU, 0xf0U, 0x00U, 0x00U, + 0x00U, 0xbeU, 0x3aU, 0xf1U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x08U, 0x3aU, + 0xf2U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x09U, 0x3aU, 0xf3U, 0x00U, 0x00U, + 0x00U, 0xbfU, 0x0aU, 0x3aU, 0xf4U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x0bU, + 0x3aU, 0xf5U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x0cU, 0x3aU, 0xf6U, 0x00U, + 0x00U, 0x00U, 0xbfU, 0x0dU, 0x3aU, 0xf7U, 0x00U, 0x00U, 0x00U, 0xbfU, + 0x0eU, 0x3aU, 0xf8U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x0fU, 0x3aU, 0xf9U, + 0x00U, 0x00U, 0x00U, 0xbfU, 0x10U, 0x3aU, 0xfaU, 0x00U, 0x00U, 0x00U, + 0xbfU, 0x11U, 0x3aU, 0xfbU, 0x00U, 0x00U, 0x00U, 0xbfU, 0x12U, 0x3aU, + 0xfcU, 0x00U, 0x00U, 0x00U, 0xbfU, 0x13U, 0x3aU, 0xfdU, 0x00U, 0x00U, + 0x00U, 0xbfU, 0x14U, 0x3aU, 0xfeU, 0x00U, 0x00U, 0x00U, 0xbfU, 0x15U, + 0x3aU, 0xffU, 0x00U, 0x00U, 0x00U, 0xbfU, 0x16U, 0x3aU, 0x00U, 0x01U, + 0x00U, 0x00U, 0xbfU, 0x17U, 0x3aU, 0x01U, 0x01U, 0x00U, 0x00U, 0xbfU, + 0x18U, 0x3aU, 0x02U, 0x01U, 0x00U, 0x00U, 0xbfU, 0x19U, 0x3aU, 0x03U, + 0x01U, 0x00U, 0x00U, 0xbfU, 0x1aU, 0x3aU, 0x04U, 0x01U, 0x00U, 0x00U, + 0xbfU, 0xf9U, 0x3aU, 0x05U, 0x01U, 0x00U, 0x00U, 0xc2U, 0x02U, 0x4dU, + 0x06U, 0x01U, 0x00U, 0x00U, 0x3aU, 0x06U, 0x01U, 0x00U, 0x00U, 0xc7U, + 0x28U, 0x8eU, 0x04U, 0x01U, 0x45U, 0x00U, 0xd8U, 0x01U, 0x01U, 0x00U, + 0xd8U, 0x01U, 0x0eU, 0x00U, 0x0cU, 0x08U, 0x41U, 0x12U, 0x99U, 0xa8U, + 0x4eU, 0x1eU, 0x08U, 0x9eU, 0x8fU, 0x94U, 0x1dU, 0x0dU, 0xa3U, 0x8fU, + 0x4eU, 0x1dU, 0x08U, 0x4eU, 0x35U, 0x1eU, 0x0dU, 0xb2U, 0x5dU, 0x1dU, + 0x0dU, 0x99U, 0x58U, 0x1dU, 0x21U, 0x21U, 0x21U, 0x21U, 0x21U, 0x21U, + 0x21U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, + 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x26U, 0x27U, + 0x00U, 0x07U, 0xa8U, 0x04U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x02U, + 0x00U, 0x02U, 0x04U, 0x00U, 0x00U, 0x24U, 0x02U, 0x90U, 0x04U, 0x00U, + 0x01U, 0x00U, 0x92U, 0x04U, 0x00U, 0x01U, 0x00U, 0xd3U, 0x97U, 0xecU, + 0x20U, 0x38U, 0x0aU, 0x01U, 0x00U, 0x00U, 0x04U, 0x0bU, 0x01U, 0x00U, + 0x00U, 0xb7U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0x0cU, 0x01U, 0x00U, 0x00U, + 0xd3U, 0x42U, 0x38U, 0x00U, 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, 0xd4U, + 0xf2U, 0x0eU, 0x29U, 0x8eU, 0x04U, 0x02U, 0x04U, 0x03U, 0x17U, 0x49U, + 0x59U, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x02U, 0x00U, 0x02U, 0x04U, + 0x00U, 0x00U, 0x30U, 0x02U, 0x9aU, 0x04U, 0x00U, 0x01U, 0x00U, 0x9cU, + 0x04U, 0x00U, 0x01U, 0x00U, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xd4U, + 0xb7U, 0x47U, 0xd3U, 0xb7U, 0x47U, 0xacU, 0x11U, 0xecU, 0x1fU, 0x0eU, + 0xd4U, 0xb8U, 0x47U, 0xd3U, 0xb8U, 0x47U, 0xacU, 0x11U, 0xecU, 0x14U, + 0x0eU, 0xd4U, 0xb9U, 0x47U, 0xd3U, 0xb9U, 0x47U, 0xacU, 0x11U, 0xecU, + 0x09U, 0x0eU, 0xd4U, 0xbaU, 0x47U, 0xd3U, 0xbaU, 0x47U, 0xacU, 0xb7U, + 0xf2U, 0x29U, 0x8eU, 0x04U, 0x09U, 0x02U, 0x03U, 0xeeU, 0x0cU, 0x02U, + 0x06U, 0x00U, 0x00U, 0x01U, 0x02U, 0x01U, 0x20U, 0x00U, 0x00U, 0x9cU, + 0x1eU, 0x03U, 0x9eU, 0x04U, 0x00U, 0x01U, 0x00U, 0xa0U, 0x04U, 0x01U, + 0x00U, 0x20U, 0xa2U, 0x04U, 0x01U, 0x01U, 0x20U, 0x61U, 0x01U, 0x00U, + 0x61U, 0x00U, 0x00U, 0x06U, 0xcbU, 0x06U, 0xccU, 0x38U, 0x12U, 0x01U, + 0x00U, 0x00U, 0x38U, 0xebU, 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, + 0x00U, 0x00U, 0xf2U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, + 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, + 0xb8U, 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x48U, 0xbfU, 0x6cU, 0xbfU, 0x4bU, + 0xbfU, 0x29U, 0xc0U, 0xc6U, 0x00U, 0xbfU, 0x0fU, 0xbfU, 0x40U, 0xbfU, + 0x5dU, 0xc0U, 0xb7U, 0x00U, 0xbfU, 0x6eU, 0xc0U, 0x87U, 0x00U, 0xbfU, + 0x65U, 0xbfU, 0x4aU, 0xbfU, 0x2fU, 0xbfU, 0x15U, 0xbfU, 0x4bU, 0xc0U, + 0xabU, 0x00U, 0xc0U, 0x99U, 0x00U, 0xc0U, 0xc7U, 0x00U, 0xbfU, 0x62U, + 0xbfU, 0x29U, 0xc0U, 0x80U, 0x00U, 0xbfU, 0x10U, 0xc0U, 0xa1U, 0x00U, + 0xc0U, 0x89U, 0x00U, 0xbfU, 0x78U, 0xbfU, 0x52U, 0xc0U, 0x90U, 0x00U, + 0xc0U, 0x80U, 0x00U, 0xbfU, 0x2fU, 0xbfU, 0x78U, 0x26U, 0x20U, 0x00U, + 0xc0U, 0xbdU, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xccU, + 0x00U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, + 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, + 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, + 0xecU, 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0x38U, + 0xe7U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0x22U, + 0x04U, 0x00U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, + 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xb9U, + 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x76U, 0xbfU, 0x28U, 0xc0U, 0xafU, 0x00U, + 0xc0U, 0xccU, 0x00U, 0xbfU, 0x25U, 0xbfU, 0x0aU, 0xbfU, 0x64U, 0xbfU, + 0x41U, 0xc0U, 0x8eU, 0x00U, 0xc0U, 0xb7U, 0x00U, 0xc0U, 0x83U, 0x00U, + 0xbfU, 0x68U, 0xc0U, 0xebU, 0x00U, 0xbfU, 0x4eU, 0xc0U, 0xc5U, 0x00U, + 0xbfU, 0x52U, 0xbfU, 0x4aU, 0xc0U, 0xebU, 0x00U, 0xc0U, 0x97U, 0x00U, + 0xbfU, 0x54U, 0xc0U, 0xabU, 0x00U, 0xc0U, 0xc1U, 0x00U, 0xbfU, 0x0bU, + 0xbfU, 0x13U, 0xbdU, 0xbfU, 0x7fU, 0xc0U, 0xfbU, 0x00U, 0xc0U, 0x9fU, + 0x00U, 0xbfU, 0x4bU, 0xc0U, 0xd8U, 0x00U, 0xbfU, 0x38U, 0x26U, 0x20U, + 0x00U, 0xbfU, 0x62U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xf2U, + 0x00U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, + 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, + 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, + 0xedU, 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0xf2U, + 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, + 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbaU, 0xf2U, 0x0eU, + 0xb7U, 0xbfU, 0x61U, 0xc0U, 0xc6U, 0x00U, 0xbfU, 0x55U, 0xc0U, 0xddU, + 0x00U, 0xc0U, 0x8dU, 0x00U, 0xc0U, 0x8eU, 0x00U, 0xc0U, 0xd3U, 0x00U, + 0xc0U, 0xbaU, 0x00U, 0xc0U, 0xb4U, 0x00U, 0xc0U, 0xa0U, 0x00U, 0xc0U, + 0xf1U, 0x00U, 0xc0U, 0xecU, 0x00U, 0xbfU, 0x2dU, 0xc0U, 0xa9U, 0x00U, + 0xc0U, 0x99U, 0x00U, 0xc0U, 0xf4U, 0x00U, 0xbfU, 0x1bU, 0xc0U, 0xa6U, + 0x00U, 0xc0U, 0x82U, 0x00U, 0xc0U, 0xc6U, 0x00U, 0xc0U, 0x84U, 0x00U, + 0xc0U, 0xf9U, 0x00U, 0xc0U, 0x99U, 0x00U, 0xbfU, 0x66U, 0xc0U, 0xb9U, + 0x00U, 0xbfU, 0x3cU, 0xc0U, 0x9aU, 0x00U, 0xc0U, 0xc3U, 0x00U, 0xc0U, + 0xe3U, 0x00U, 0xbfU, 0x5cU, 0xc0U, 0x9aU, 0x00U, 0x26U, 0x20U, 0x00U, + 0xc0U, 0x81U, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x6dU, + 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, + 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, + 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xeeU, + 0x00U, 0x00U, 0x00U, 0xf1U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, + 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, + 0xacU, 0xbbU, 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x66U, 0xbfU, 0x7dU, 0xc0U, + 0xb0U, 0x00U, 0xbfU, 0x78U, 0xc0U, 0x8cU, 0x00U, 0xb9U, 0xbfU, 0x0fU, + 0xb9U, 0xbfU, 0x78U, 0xbfU, 0x0aU, 0xbfU, 0x67U, 0xbfU, 0x3dU, 0xc0U, + 0xc7U, 0x00U, 0xbfU, 0x47U, 0xbfU, 0x57U, 0xc0U, 0xf2U, 0x00U, 0xbfU, + 0x38U, 0xbfU, 0x23U, 0xc0U, 0xfaU, 0x00U, 0xbfU, 0x30U, 0xbfU, 0x14U, + 0xc0U, 0xc1U, 0x00U, 0xc0U, 0x86U, 0x00U, 0xbfU, 0x6eU, 0xbfU, 0x72U, + 0xc0U, 0xccU, 0x00U, 0xbfU, 0x4cU, 0xc0U, 0xd8U, 0x00U, 0xc0U, 0xb2U, + 0x00U, 0xbfU, 0x26U, 0xc0U, 0xcdU, 0x00U, 0x26U, 0x20U, 0x00U, 0xbfU, + 0x6eU, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xf4U, 0x00U, 0x4cU, + 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, + 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, + 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xefU, 0x00U, + 0x00U, 0x00U, 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, 0xf2U, 0x11U, 0x63U, + 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, + 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbcU, 0xf2U, 0x0eU, 0xbfU, 0x1cU, + 0xc0U, 0xd2U, 0x00U, 0xbfU, 0x2dU, 0xbfU, 0x0cU, 0xc0U, 0xb3U, 0x00U, + 0xc0U, 0xcdU, 0x00U, 0xbfU, 0x60U, 0xc0U, 0xdaU, 0x00U, 0xbfU, 0x33U, + 0xc0U, 0xb5U, 0x00U, 0xc0U, 0xaaU, 0x00U, 0xbfU, 0x7fU, 0xc0U, 0xeaU, + 0x00U, 0xbfU, 0x32U, 0xbfU, 0x1fU, 0xbfU, 0x11U, 0xbfU, 0x16U, 0xbfU, + 0x63U, 0xc0U, 0xeaU, 0x00U, 0xc0U, 0xedU, 0x00U, 0xbfU, 0x32U, 0xbfU, + 0x48U, 0xbfU, 0x1cU, 0xbfU, 0x6bU, 0xbfU, 0x70U, 0xbfU, 0x0eU, 0xbfU, + 0x48U, 0xbfU, 0x45U, 0xbfU, 0x50U, 0xc0U, 0xf4U, 0x00U, 0xbfU, 0x5aU, + 0xc0U, 0xd9U, 0x00U, 0x26U, 0x20U, 0x00U, 0xbfU, 0x62U, 0x4cU, 0x20U, + 0x00U, 0x00U, 0x80U, 0xbfU, 0x23U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, + 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, + 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, + 0x01U, 0x00U, 0x00U, 0x38U, 0xf0U, 0x00U, 0x00U, 0x00U, 0xf1U, 0x11U, + 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, + 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbdU, 0xf2U, 0x0eU, 0xb7U, + 0xbfU, 0x68U, 0xc0U, 0xb4U, 0x00U, 0xc0U, 0x97U, 0x00U, 0xc0U, 0x9aU, + 0x00U, 0xbfU, 0x36U, 0xc0U, 0xcdU, 0x00U, 0xc0U, 0xc7U, 0x00U, 0xc0U, + 0xf3U, 0x00U, 0xc0U, 0xd3U, 0x00U, 0xc0U, 0xd5U, 0x00U, 0xc0U, 0xc3U, + 0x00U, 0xbfU, 0x1aU, 0xbfU, 0x4eU, 0xc0U, 0xaeU, 0x00U, 0xbfU, 0x2aU, + 0xc0U, 0xc7U, 0x00U, 0xc0U, 0xd7U, 0x00U, 0xbfU, 0x20U, 0xc0U, 0x9dU, + 0x00U, 0xc0U, 0xdaU, 0x00U, 0xc0U, 0x87U, 0x00U, 0xbfU, 0x75U, 0xc0U, + 0x88U, 0x00U, 0xc0U, 0xb9U, 0x00U, 0xc0U, 0xafU, 0x00U, 0xc0U, 0xc6U, + 0x00U, 0xbfU, 0x67U, 0xc0U, 0x99U, 0x00U, 0xbfU, 0x69U, 0xbfU, 0x2aU, + 0xc0U, 0xb0U, 0x00U, 0x26U, 0x20U, 0x00U, 0xc0U, 0xd6U, 0x00U, 0x4cU, + 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x6bU, 0x4cU, 0x21U, 0x00U, 0x00U, + 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, + 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, + 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf1U, 0x00U, 0x00U, 0x00U, 0xf1U, + 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, + 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbeU, 0xf2U, 0x0eU, + 0xb7U, 0xbfU, 0x73U, 0xbfU, 0x4bU, 0xc0U, 0xc5U, 0x00U, 0xbfU, 0x0cU, + 0xc0U, 0x9bU, 0x00U, 0xbfU, 0x0dU, 0xc0U, 0x85U, 0x00U, 0xbfU, 0x15U, + 0xc0U, 0xd3U, 0x00U, 0xc0U, 0xeaU, 0x00U, 0xc0U, 0xaeU, 0x00U, 0xbfU, + 0x1eU, 0xbfU, 0x74U, 0xc0U, 0xb2U, 0x00U, 0xc0U, 0x9aU, 0x00U, 0xc0U, + 0x95U, 0x00U, 0xc0U, 0x80U, 0x00U, 0xbfU, 0x43U, 0xbfU, 0x46U, 0xc0U, + 0xc4U, 0x00U, 0xc0U, 0x91U, 0x00U, 0xc0U, 0xeeU, 0x00U, 0xbfU, 0x1aU, + 0xc0U, 0x95U, 0x00U, 0xc0U, 0xbfU, 0x00U, 0xbfU, 0x25U, 0xc0U, 0xe4U, + 0x00U, 0xc0U, 0xaaU, 0x00U, 0xc0U, 0xb8U, 0x00U, 0xbfU, 0x54U, 0xc0U, + 0xa6U, 0x00U, 0x26U, 0x20U, 0x00U, 0xc0U, 0xa6U, 0x00U, 0x4cU, 0x20U, + 0x00U, 0x00U, 0x80U, 0xbfU, 0x51U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, + 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, + 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, + 0x01U, 0x00U, 0x00U, 0x38U, 0xf2U, 0x00U, 0x00U, 0x00U, 0xf1U, 0x11U, + 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, + 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbfU, 0x08U, 0xf2U, 0x0eU, + 0xb7U, 0xbfU, 0x4eU, 0xbfU, 0x2eU, 0xc0U, 0x8aU, 0x00U, 0xbfU, 0x59U, + 0xc0U, 0xaaU, 0x00U, 0xc0U, 0x9dU, 0x00U, 0xbfU, 0x3bU, 0xbfU, 0x5bU, + 0xbfU, 0x18U, 0xbfU, 0x6bU, 0xbfU, 0x0bU, 0xc0U, 0x9eU, 0x00U, 0xbfU, + 0x0fU, 0xbfU, 0x62U, 0xc0U, 0xe6U, 0x00U, 0xc0U, 0xc0U, 0x00U, 0xbfU, + 0x25U, 0xc0U, 0x87U, 0x00U, 0xc0U, 0xcaU, 0x00U, 0xbfU, 0x74U, 0xc0U, + 0xa4U, 0x00U, 0xc0U, 0xd7U, 0x00U, 0xbfU, 0x78U, 0xc0U, 0x93U, 0x00U, + 0xc0U, 0x8eU, 0x00U, 0xc0U, 0x95U, 0x00U, 0xbfU, 0x7bU, 0xbfU, 0x63U, + 0xbfU, 0x57U, 0xc0U, 0xd3U, 0x00U, 0xbfU, 0x64U, 0x26U, 0x20U, 0x00U, + 0xc0U, 0xb2U, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x44U, + 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, + 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, + 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf3U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe8U, 0x00U, 0x00U, 0x00U, 0x22U, 0x04U, + 0x00U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbfU, 0x09U, + 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x72U, 0xbfU, 0x0eU, 0xc0U, 0xb8U, 0x00U, + 0xbfU, 0x2aU, 0xc0U, 0xddU, 0x00U, 0xbfU, 0x5eU, 0xbfU, 0x15U, 0xbfU, + 0x59U, 0xbfU, 0x1bU, 0xc0U, 0xf6U, 0x00U, 0xc0U, 0xe3U, 0x00U, 0xbfU, + 0x6dU, 0xc0U, 0xbcU, 0x00U, 0xbfU, 0x3cU, 0xbfU, 0x12U, 0xc0U, 0xd3U, + 0x00U, 0xbeU, 0xbfU, 0x6dU, 0xbfU, 0x43U, 0xc0U, 0xa8U, 0x00U, 0xbfU, + 0x53U, 0xc0U, 0xf8U, 0x00U, 0xc0U, 0xf9U, 0x00U, 0xc0U, 0xe8U, 0x00U, + 0xc0U, 0xa7U, 0x00U, 0xc0U, 0xd8U, 0x00U, 0xbfU, 0x4fU, 0xc0U, 0xe1U, + 0x00U, 0xc0U, 0xe9U, 0x00U, 0xbfU, 0x7aU, 0xbfU, 0x2aU, 0x26U, 0x20U, + 0x00U, 0xc0U, 0xc7U, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, + 0x3dU, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, + 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, + 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, + 0xf4U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0xb8U, + 0xf3U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, + 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbfU, 0x0aU, + 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x6fU, 0xbfU, 0x60U, 0xbfU, 0x14U, 0xbfU, + 0x48U, 0xc0U, 0x80U, 0x00U, 0xc0U, 0x97U, 0x00U, 0xbfU, 0x5fU, 0xbfU, + 0x76U, 0xbfU, 0x6aU, 0xc0U, 0xb2U, 0x00U, 0xbfU, 0x2cU, 0xbfU, 0x32U, + 0xbfU, 0x2fU, 0xbfU, 0x10U, 0xc0U, 0x8eU, 0x00U, 0xbaU, 0xbfU, 0x43U, + 0xbfU, 0x51U, 0xc0U, 0xdeU, 0x00U, 0xc0U, 0x89U, 0x00U, 0xbfU, 0x6cU, + 0xc0U, 0xf4U, 0x00U, 0xc0U, 0x9fU, 0x00U, 0xbfU, 0x6bU, 0xbfU, 0x4aU, + 0xc0U, 0xc7U, 0x00U, 0xbfU, 0x2cU, 0xbfU, 0x54U, 0xc0U, 0xf7U, 0x00U, + 0xbfU, 0x27U, 0xbfU, 0x29U, 0x26U, 0x20U, 0x00U, 0xc0U, 0x9bU, 0x00U, + 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xe8U, 0x00U, 0x4cU, 0x21U, + 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, + 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, + 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf4U, 0x00U, 0x00U, + 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, + 0x00U, 0xf3U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, + 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbfU, + 0x0bU, 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x6fU, 0xbfU, 0x23U, 0xbfU, 0x61U, + 0xbfU, 0x7fU, 0xbfU, 0x44U, 0xc0U, 0x91U, 0x00U, 0xbfU, 0x1cU, 0xc0U, + 0xbaU, 0x00U, 0xbfU, 0x3bU, 0xbfU, 0x5cU, 0xc0U, 0xbeU, 0x00U, 0xc0U, + 0xe9U, 0x00U, 0xbfU, 0x42U, 0xbfU, 0x22U, 0xc0U, 0xacU, 0x00U, 0xc0U, + 0xa4U, 0x00U, 0xbfU, 0x29U, 0xc0U, 0xf4U, 0x00U, 0xc0U, 0xd6U, 0x00U, + 0xbfU, 0x60U, 0xb8U, 0xc0U, 0xa8U, 0x00U, 0xc0U, 0xabU, 0x00U, 0xc0U, + 0x9bU, 0x00U, 0xc0U, 0x98U, 0x00U, 0xbfU, 0x5eU, 0xc0U, 0xb8U, 0x00U, + 0xc0U, 0xb8U, 0x00U, 0xbfU, 0x42U, 0xc0U, 0x9fU, 0x00U, 0xbfU, 0x1eU, + 0x26U, 0x20U, 0x00U, 0xc0U, 0x91U, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, + 0x80U, 0xbfU, 0x4bU, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, + 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, + 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0xe6U, 0x00U, 0x00U, + 0x00U, 0xb7U, 0xb7U, 0x49U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xb8U, + 0xbfU, 0x65U, 0x49U, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf5U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xb7U, 0xb8U, + 0x22U, 0x04U, 0x00U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, + 0x00U, 0x00U, 0x00U, 0x38U, 0x05U, 0x01U, 0x00U, 0x00U, 0x62U, 0x00U, + 0x00U, 0xacU, 0xbfU, 0x0cU, 0xf2U, 0x0eU, 0x38U, 0xe6U, 0x00U, 0x00U, + 0x00U, 0xb8U, 0xbfU, 0x64U, 0x49U, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, + 0x38U, 0xf5U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, + 0xb7U, 0xb8U, 0x22U, 0x04U, 0x00U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, + 0xebU, 0xacU, 0xbfU, 0x0dU, 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x64U, 0xbfU, + 0x2dU, 0xbfU, 0x0cU, 0xc0U, 0xb3U, 0x00U, 0xc0U, 0xcdU, 0x00U, 0xbfU, + 0x60U, 0xc0U, 0xdaU, 0x00U, 0xbfU, 0x33U, 0xc0U, 0xb5U, 0x00U, 0xc0U, + 0xaaU, 0x00U, 0xbfU, 0x7fU, 0xc0U, 0xeaU, 0x00U, 0xbfU, 0x32U, 0xbfU, + 0x1fU, 0xbfU, 0x11U, 0xbfU, 0x16U, 0xbfU, 0x63U, 0xc0U, 0xeaU, 0x00U, + 0xc0U, 0xedU, 0x00U, 0xbfU, 0x32U, 0xbfU, 0x48U, 0xbfU, 0x1cU, 0xbfU, + 0x6bU, 0xbfU, 0x70U, 0xbfU, 0x0eU, 0xb7U, 0xb7U, 0xb7U, 0xb7U, 0xb7U, + 0xb7U, 0x26U, 0x20U, 0x00U, 0xb7U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, + 0xb8U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, + 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, + 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, + 0xf6U, 0x00U, 0x00U, 0x00U, 0xf1U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, + 0xebU, 0xacU, 0xbfU, 0x0eU, 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x64U, 0xc0U, + 0xb4U, 0x00U, 0xc0U, 0xdeU, 0x00U, 0xc0U, 0x82U, 0x00U, 0xbfU, 0x30U, + 0xbfU, 0x55U, 0xc0U, 0xd0U, 0x00U, 0xbfU, 0x0bU, 0xc0U, 0xc1U, 0x00U, + 0xbfU, 0x2cU, 0xc0U, 0xd7U, 0x00U, 0xc0U, 0x8fU, 0x00U, 0xc0U, 0xe1U, + 0x00U, 0xc0U, 0xaaU, 0x00U, 0xc0U, 0xf7U, 0x00U, 0xbfU, 0x4eU, 0xc0U, + 0xe6U, 0x00U, 0xbdU, 0xbfU, 0x21U, 0xc0U, 0x95U, 0x00U, 0xc0U, 0xb2U, + 0x00U, 0xbfU, 0x62U, 0xc0U, 0x9fU, 0x00U, 0xbfU, 0x49U, 0xc0U, 0xa2U, + 0x00U, 0xbfU, 0x59U, 0xbfU, 0x15U, 0xc0U, 0xa3U, 0x00U, 0xc0U, 0x9cU, + 0x00U, 0xbfU, 0x64U, 0xc0U, 0xbeU, 0x00U, 0x26U, 0x20U, 0x00U, 0xbfU, + 0x19U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xb7U, 0x4cU, 0x21U, 0x00U, + 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, + 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf8U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0xf2U, 0x11U, 0x63U, 0x00U, 0x00U, + 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, + 0x00U, 0xebU, 0xacU, 0xbfU, 0x0fU, 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x53U, + 0xc0U, 0xdfU, 0x00U, 0xc0U, 0x8fU, 0x00U, 0xc0U, 0xf0U, 0x00U, 0xc0U, + 0xceU, 0x00U, 0xbfU, 0x41U, 0xbfU, 0x1aU, 0xbfU, 0x3bU, 0xc0U, 0x8fU, + 0x00U, 0xbfU, 0x1bU, 0xc0U, 0xb5U, 0x00U, 0xc0U, 0xbbU, 0x00U, 0xbfU, + 0x32U, 0xbfU, 0x78U, 0xbfU, 0x17U, 0xbfU, 0x15U, 0xc0U, 0xd6U, 0x00U, + 0xbfU, 0x77U, 0xbfU, 0x42U, 0xc0U, 0xf5U, 0x00U, 0xc0U, 0xb5U, 0x00U, + 0xbfU, 0x63U, 0xc0U, 0xb8U, 0x00U, 0xbfU, 0x77U, 0xc0U, 0xb3U, 0x00U, + 0xbfU, 0x3bU, 0xbeU, 0xbfU, 0x76U, 0xc0U, 0xf6U, 0x00U, 0xc0U, 0xf7U, + 0x00U, 0xc0U, 0xbcU, 0x00U, 0x26U, 0x20U, 0x00U, 0xc0U, 0xdaU, 0x00U, + 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x1dU, 0x4cU, 0x21U, 0x00U, + 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, + 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf9U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0xb8U, 0xf3U, 0x11U, 0x63U, 0x00U, + 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, + 0x00U, 0x00U, 0xebU, 0xacU, 0xbfU, 0x10U, 0xf2U, 0x0eU, 0xb7U, 0xbfU, + 0x43U, 0xbfU, 0x08U, 0xbfU, 0x1fU, 0xbfU, 0x26U, 0xc0U, 0xffU, 0x00U, + 0xbfU, 0x79U, 0xbfU, 0x1aU, 0xc0U, 0xf7U, 0x00U, 0xbfU, 0x54U, 0xbfU, + 0x26U, 0xc0U, 0xedU, 0x00U, 0xc0U, 0xf9U, 0x00U, 0xc0U, 0xebU, 0x00U, + 0xbfU, 0x08U, 0xbfU, 0x44U, 0xc0U, 0x85U, 0x00U, 0xbfU, 0x28U, 0xbfU, + 0x58U, 0xbfU, 0x2cU, 0xc0U, 0xb1U, 0x00U, 0xc0U, 0xa4U, 0x00U, 0xc0U, + 0xefU, 0x00U, 0xbfU, 0x4fU, 0xc0U, 0xd0U, 0x00U, 0xc0U, 0xb4U, 0x00U, + 0xbfU, 0x49U, 0xc0U, 0x9bU, 0x00U, 0xbfU, 0x76U, 0xc0U, 0x82U, 0x00U, + 0xc0U, 0xe7U, 0x00U, 0xbfU, 0x69U, 0x26U, 0x20U, 0x00U, 0xc0U, 0xa6U, + 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0xb5U, 0x00U, 0x4cU, + 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, + 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, + 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xf9U, 0x00U, + 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x38U, 0xe5U, 0x00U, + 0x00U, 0x00U, 0xf3U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, + 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, + 0xbfU, 0x11U, 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x43U, 0xc0U, 0x94U, 0x00U, + 0xc0U, 0xe3U, 0x00U, 0xbfU, 0x6fU, 0xbfU, 0x0dU, 0xc0U, 0xd3U, 0x00U, + 0xc0U, 0xedU, 0x00U, 0xc0U, 0xc0U, 0x00U, 0xbfU, 0x2cU, 0xbfU, 0x49U, + 0xc0U, 0xa5U, 0x00U, 0xc0U, 0xaaU, 0x00U, 0xbfU, 0x0eU, 0xc0U, 0xccU, + 0x00U, 0xbfU, 0x49U, 0xbfU, 0x18U, 0xbfU, 0x39U, 0xc0U, 0x92U, 0x00U, + 0xc0U, 0xabU, 0x00U, 0xbfU, 0x57U, 0xc0U, 0xc3U, 0x00U, 0xbfU, 0x2dU, + 0xc0U, 0x9eU, 0x00U, 0xbfU, 0x45U, 0xbfU, 0x51U, 0xbbU, 0xbfU, 0x78U, + 0xbfU, 0x49U, 0xbfU, 0x49U, 0xc0U, 0xd1U, 0x00U, 0xc0U, 0xe6U, 0x00U, + 0x26U, 0x20U, 0x00U, 0xc0U, 0xd2U, 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, + 0x80U, 0xb8U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, + 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, + 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, + 0x38U, 0xfaU, 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, + 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0xf3U, 0x11U, 0x63U, 0x00U, 0x00U, + 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, + 0x00U, 0xebU, 0xacU, 0xbfU, 0x12U, 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x70U, + 0xc0U, 0x88U, 0x00U, 0xc0U, 0x90U, 0x00U, 0xbfU, 0x0fU, 0xbfU, 0x27U, + 0xbfU, 0x66U, 0xbfU, 0x57U, 0xc0U, 0xbcU, 0x00U, 0xc0U, 0xc0U, 0x00U, + 0xbfU, 0x5dU, 0xc0U, 0xa1U, 0x00U, 0xbfU, 0x67U, 0xbfU, 0x40U, 0xc0U, + 0xabU, 0x00U, 0xc0U, 0x9dU, 0x00U, 0xbfU, 0x33U, 0xb8U, 0xc0U, 0x8eU, + 0x00U, 0xbfU, 0x45U, 0xbfU, 0x71U, 0xbfU, 0x7bU, 0xbfU, 0x0eU, 0xc0U, + 0xc4U, 0x00U, 0xbfU, 0x2eU, 0xbfU, 0x4dU, 0xbfU, 0x11U, 0xc0U, 0xbdU, + 0x00U, 0xbfU, 0x6dU, 0xc0U, 0xbdU, 0x00U, 0xc0U, 0x94U, 0x00U, 0xbaU, + 0x26U, 0x20U, 0x00U, 0xbfU, 0x48U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, + 0xc0U, 0xe0U, 0x00U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, + 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, + 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0xe6U, 0x00U, 0x00U, + 0x00U, 0xb7U, 0xb7U, 0x49U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xb8U, + 0xb7U, 0x49U, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xfbU, 0x00U, + 0x00U, 0x00U, 0x38U, 0xe7U, 0x00U, 0x00U, 0x00U, 0xf2U, 0x11U, 0x63U, + 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, + 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbfU, 0x13U, 0xf2U, 0x0eU, 0x38U, + 0xe6U, 0x00U, 0x00U, 0x00U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, + 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, + 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xfcU, 0x00U, + 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0xf2U, 0x11U, 0x63U, + 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, + 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbfU, 0x14U, 0xf2U, 0x0eU, 0xb7U, + 0xbfU, 0x64U, 0xc0U, 0xc8U, 0x00U, 0xbfU, 0x5eU, 0xb8U, 0xbfU, 0x29U, + 0xbdU, 0xbfU, 0x7bU, 0xbfU, 0x75U, 0xc0U, 0xadU, 0x00U, 0xbfU, 0x30U, + 0xc0U, 0xb0U, 0x00U, 0xc0U, 0xaaU, 0x00U, 0xbfU, 0x1cU, 0xc0U, 0xc2U, + 0x00U, 0xbfU, 0x5bU, 0xbfU, 0x0aU, 0xc0U, 0x82U, 0x00U, 0xc0U, 0xc7U, + 0x00U, 0xc0U, 0xf9U, 0x00U, 0xc0U, 0xaaU, 0x00U, 0xc0U, 0xbdU, 0x00U, + 0xc0U, 0xeeU, 0x00U, 0xbcU, 0xc0U, 0xffU, 0x00U, 0xb8U, 0xbfU, 0x66U, + 0xbfU, 0x69U, 0xc0U, 0xefU, 0x00U, 0xc0U, 0x9dU, 0x00U, 0xc0U, 0x82U, + 0x00U, 0xc0U, 0xdcU, 0x00U, 0x26U, 0x20U, 0x00U, 0xc0U, 0xecU, 0x00U, + 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x30U, 0x4cU, 0x21U, 0x00U, + 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, + 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xfdU, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xb7U, 0xb8U, 0x22U, 0x04U, 0x00U, + 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, + 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbfU, 0x15U, 0xf2U, + 0x0eU, 0xb7U, 0xbfU, 0x64U, 0xbfU, 0x61U, 0xc0U, 0xe6U, 0x00U, 0xbcU, + 0xbfU, 0x1aU, 0xc0U, 0xb0U, 0x00U, 0xbfU, 0x49U, 0xc0U, 0x89U, 0x00U, + 0xbfU, 0x2eU, 0xbfU, 0x75U, 0xc0U, 0xc9U, 0x00U, 0xbfU, 0x3dU, 0xbfU, + 0x67U, 0xc0U, 0xfbU, 0x00U, 0xbfU, 0x7aU, 0xbfU, 0x63U, 0xc0U, 0xf1U, + 0x00U, 0xc0U, 0xefU, 0x00U, 0xbfU, 0x56U, 0xc0U, 0xddU, 0x00U, 0xc0U, + 0xafU, 0x00U, 0xbfU, 0x3eU, 0xbfU, 0x6bU, 0xbfU, 0x43U, 0xbfU, 0x6fU, + 0xbfU, 0x57U, 0xbfU, 0x6eU, 0xc0U, 0x8cU, 0x00U, 0xb8U, 0xc0U, 0x81U, + 0x00U, 0xc0U, 0x98U, 0x00U, 0x26U, 0x20U, 0x00U, 0xbfU, 0x2eU, 0x4cU, + 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x48U, 0x4cU, 0x21U, 0x00U, 0x00U, + 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, + 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, + 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xfeU, 0x00U, 0x00U, 0x00U, 0x38U, + 0xe9U, 0x00U, 0x00U, 0x00U, 0xb8U, 0xf3U, 0x11U, 0x63U, 0x00U, 0x00U, + 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, + 0x00U, 0xebU, 0xacU, 0xbfU, 0x16U, 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x75U, + 0xbfU, 0x13U, 0xc0U, 0xefU, 0x00U, 0xbbU, 0xc0U, 0xcdU, 0x00U, 0xbfU, + 0x33U, 0xbfU, 0x6aU, 0xc0U, 0xadU, 0x00U, 0xc0U, 0xf6U, 0x00U, 0xbfU, + 0x3dU, 0xbfU, 0x0cU, 0xbfU, 0x7eU, 0xbcU, 0xbfU, 0x6cU, 0xc0U, 0x84U, + 0x00U, 0xc0U, 0x9aU, 0x00U, 0xbfU, 0x7cU, 0xc0U, 0xf6U, 0x00U, 0xbfU, + 0x72U, 0xbfU, 0x5eU, 0xc0U, 0x99U, 0x00U, 0xc0U, 0xbcU, 0x00U, 0xc0U, + 0x93U, 0x00U, 0xc0U, 0x80U, 0x00U, 0xbfU, 0x1eU, 0xc0U, 0xf5U, 0x00U, + 0xbfU, 0x78U, 0xc0U, 0xa0U, 0x00U, 0xbfU, 0x32U, 0xbfU, 0x72U, 0xbfU, + 0x5bU, 0x26U, 0x20U, 0x00U, 0xc0U, 0x84U, 0x00U, 0x4cU, 0x20U, 0x00U, + 0x00U, 0x80U, 0xc0U, 0xfeU, 0x00U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, + 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, + 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, + 0x01U, 0x00U, 0x00U, 0x38U, 0xfeU, 0x00U, 0x00U, 0x00U, 0x38U, 0xe9U, + 0x00U, 0x00U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xf3U, 0x11U, + 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, + 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbfU, 0x17U, 0xf2U, 0x0eU, + 0xb7U, 0xbfU, 0x75U, 0xc0U, 0xc1U, 0x00U, 0xc0U, 0xc6U, 0x00U, 0xc0U, + 0xc5U, 0x00U, 0xbfU, 0x23U, 0xbfU, 0x74U, 0xc0U, 0x87U, 0x00U, 0xbfU, + 0x12U, 0xbfU, 0x56U, 0xc0U, 0xaaU, 0x00U, 0xbfU, 0x7aU, 0xbfU, 0x1fU, + 0xc0U, 0xb3U, 0x00U, 0xbfU, 0x29U, 0xbfU, 0x7aU, 0xbfU, 0x0aU, 0xbfU, + 0x55U, 0xc0U, 0x88U, 0x00U, 0xbfU, 0x7dU, 0xbfU, 0x16U, 0xbfU, 0x6aU, + 0xc0U, 0xcfU, 0x00U, 0xc0U, 0x85U, 0x00U, 0xbfU, 0x28U, 0xbfU, 0x59U, + 0xc0U, 0x88U, 0x00U, 0xc0U, 0xc2U, 0x00U, 0xc0U, 0xdaU, 0x00U, 0xc0U, + 0x81U, 0x00U, 0xbfU, 0x7fU, 0xbaU, 0x26U, 0x20U, 0x00U, 0xc0U, 0x90U, + 0x00U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x43U, 0x4cU, 0x21U, + 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, + 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, + 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xffU, 0x00U, 0x00U, + 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, 0x00U, 0x00U, + 0x00U, 0xb8U, 0x22U, 0x04U, 0x00U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, + 0xebU, 0xacU, 0xbfU, 0x18U, 0xf2U, 0x0eU, 0xb7U, 0xbfU, 0x78U, 0xc0U, + 0xedU, 0x00U, 0xbbU, 0xc0U, 0xceU, 0x00U, 0xbfU, 0x27U, 0xbfU, 0x20U, + 0xbfU, 0x21U, 0xbfU, 0x55U, 0xbfU, 0x2bU, 0xc0U, 0xbfU, 0x00U, 0xc0U, + 0xa1U, 0x00U, 0xc0U, 0xe5U, 0x00U, 0xc0U, 0xffU, 0x00U, 0xc0U, 0xbbU, + 0x00U, 0xbfU, 0x53U, 0xc0U, 0xb6U, 0x00U, 0xbfU, 0x45U, 0xc0U, 0xa2U, + 0x00U, 0xc0U, 0xffU, 0x00U, 0xc0U, 0x8aU, 0x00U, 0xbfU, 0x44U, 0xbfU, + 0x66U, 0xc0U, 0xd5U, 0x00U, 0xbfU, 0x76U, 0xbfU, 0x24U, 0xc0U, 0xb5U, + 0x00U, 0xbfU, 0x71U, 0xc0U, 0xe6U, 0x00U, 0xbfU, 0x44U, 0xc0U, 0x9eU, + 0x00U, 0xc0U, 0xebU, 0x00U, 0x26U, 0x20U, 0x00U, 0xc0U, 0xfcU, 0x00U, + 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xbfU, 0x5aU, 0x4cU, 0x21U, 0x00U, + 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, + 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, 0xffU, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0x22U, 0x04U, 0x00U, 0x11U, 0x63U, + 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, + 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbfU, 0x19U, 0xf2U, 0x0eU, 0xb7U, + 0xbfU, 0x78U, 0xbfU, 0x7dU, 0xc0U, 0xe1U, 0x00U, 0xb8U, 0xc0U, 0xf6U, + 0x00U, 0xbfU, 0x2bU, 0xc0U, 0xb0U, 0x00U, 0xbfU, 0x55U, 0xc0U, 0x80U, + 0x00U, 0xc0U, 0xb9U, 0x00U, 0xc0U, 0xd6U, 0x00U, 0xc0U, 0xb0U, 0x00U, + 0xbfU, 0x3fU, 0xbfU, 0x3bU, 0xc0U, 0xb0U, 0x00U, 0xb8U, 0xc0U, 0xbdU, + 0x00U, 0xc0U, 0xe6U, 0x00U, 0xc0U, 0x9bU, 0x00U, 0xc0U, 0x89U, 0x00U, + 0xbfU, 0x0fU, 0xc0U, 0x8aU, 0x00U, 0xc0U, 0xcdU, 0x00U, 0xc0U, 0xbeU, + 0x00U, 0xbfU, 0x71U, 0xbfU, 0x73U, 0xbfU, 0x5eU, 0xc0U, 0xc3U, 0x00U, + 0xbfU, 0x63U, 0xc0U, 0xf8U, 0x00U, 0xc0U, 0xc5U, 0x00U, 0x26U, 0x20U, + 0x00U, 0xbfU, 0x4bU, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, 0xc0U, 0x9bU, + 0x00U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, 0x01U, 0x00U, + 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0x62U, + 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, + 0x00U, 0x01U, 0x00U, 0x00U, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0xf2U, + 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, + 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, 0xbfU, 0x1aU, 0xf2U, + 0x0eU, 0xb7U, 0xbfU, 0x45U, 0xc0U, 0xf3U, 0x00U, 0xbfU, 0x51U, 0xbfU, + 0x2dU, 0xbfU, 0x1cU, 0xc0U, 0x80U, 0x00U, 0xc0U, 0xa3U, 0x00U, 0xc0U, + 0xc0U, 0x00U, 0xc0U, 0xb1U, 0x00U, 0xbfU, 0x46U, 0xbbU, 0xc0U, 0xe1U, + 0x00U, 0xc0U, 0xadU, 0x00U, 0xc0U, 0xdbU, 0x00U, 0xc0U, 0x90U, 0x00U, + 0xbfU, 0x1cU, 0xbfU, 0x66U, 0xbfU, 0x32U, 0xbfU, 0x10U, 0xbfU, 0x08U, + 0xc0U, 0xccU, 0x00U, 0xc0U, 0xd0U, 0x00U, 0xc0U, 0xabU, 0x00U, 0xc0U, + 0xd2U, 0x00U, 0xc0U, 0xdbU, 0x00U, 0xc0U, 0xbeU, 0x00U, 0xc0U, 0xc4U, + 0x00U, 0xbfU, 0x08U, 0xc0U, 0xa6U, 0x00U, 0xbfU, 0x0fU, 0xbfU, 0x6aU, + 0x26U, 0x20U, 0x00U, 0xbfU, 0x62U, 0x4cU, 0x20U, 0x00U, 0x00U, 0x80U, + 0xc0U, 0xe9U, 0x00U, 0x4cU, 0x21U, 0x00U, 0x00U, 0x80U, 0x11U, 0x63U, + 0x01U, 0x00U, 0x0eU, 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, + 0x00U, 0x62U, 0x01U, 0x00U, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, + 0x00U, 0x38U, 0x01U, 0x01U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, + 0x00U, 0xb8U, 0xf3U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, 0x38U, 0xe3U, + 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, 0xebU, 0xacU, + 0xbfU, 0x1bU, 0xf2U, 0x0eU, 0x38U, 0x12U, 0x01U, 0x00U, 0x00U, 0x38U, + 0x01U, 0x01U, 0x00U, 0x00U, 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x38U, + 0xe5U, 0x00U, 0x00U, 0x00U, 0xf3U, 0x11U, 0x63U, 0x00U, 0x00U, 0x0eU, + 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xbfU, 0x22U, 0x62U, 0x00U, 0x00U, + 0xebU, 0xacU, 0xbfU, 0x1cU, 0xf2U, 0x0eU, 0x38U, 0x13U, 0x01U, 0x00U, + 0x00U, 0xc3U, 0xb7U, 0xf2U, 0x29U, 0x8eU, 0x04U, 0x4eU, 0xd4U, 0x01U, + 0x22U, 0x19U, 0x6cU, 0x4eU, 0x08U, 0x8aU, 0x94U, 0xb7U, 0x1cU, 0x46U, + 0xa8U, 0x4eU, 0x08U, 0x94U, 0x99U, 0xadU, 0x1cU, 0x46U, 0x6cU, 0x4eU, + 0x08U, 0xadU, 0xa8U, 0xbcU, 0x1cU, 0x46U, 0x53U, 0x4eU, 0x08U, 0x7bU, + 0x94U, 0xb7U, 0x1cU, 0x46U, 0x6cU, 0x4eU, 0x0dU, 0x9eU, 0x85U, 0xa8U, + 0x1cU, 0x46U, 0x53U, 0x4eU, 0x08U, 0xa8U, 0xa3U, 0xb7U, 0x1cU, 0x46U, + 0x53U, 0x4eU, 0x08U, 0x99U, 0xa3U, 0xbcU, 0x1cU, 0x46U, 0x53U, 0x53U, + 0x08U, 0x8fU, 0x9eU, 0xb2U, 0x1cU, 0x46U, 0xa8U, 0x53U, 0x08U, 0x8fU, + 0x94U, 0xb7U, 0x1cU, 0x46U, 0x71U, 0x53U, 0x08U, 0x8aU, 0x8fU, 0xb2U, + 0x1cU, 0x46U, 0x85U, 0x53U, 0x08U, 0x8fU, 0x99U, 0xb7U, 0x1cU, 0x46U, + 0x2bU, 0x30U, 0x80U, 0x00U, 0x12U, 0x12U, 0x30U, 0x80U, 0x53U, 0x08U, + 0x99U, 0x85U, 0x76U, 0x1cU, 0x46U, 0x53U, 0x53U, 0x08U, 0x9eU, 0x99U, + 0xadU, 0x1cU, 0x46U, 0x6cU, 0x53U, 0x08U, 0x9eU, 0x8fU, 0xb2U, 0x1cU, + 0x46U, 0x71U, 0x53U, 0x08U, 0x8fU, 0x99U, 0xbcU, 0x1cU, 0x46U, 0x85U, + 0x53U, 0x08U, 0x9eU, 0x94U, 0xa3U, 0x1cU, 0x46U, 0x85U, 0x53U, 0x08U, + 0x94U, 0x8aU, 0xadU, 0x1cU, 0x46U, 0x2bU, 0x2bU, 0x6cU, 0x53U, 0x35U, + 0x46U, 0x6cU, 0x53U, 0x08U, 0x85U, 0x9eU, 0xb2U, 0x1cU, 0x46U, 0x80U, + 0x53U, 0x08U, 0x8aU, 0x94U, 0xa8U, 0x1cU, 0x46U, 0x71U, 0x53U, 0x08U, + 0x8aU, 0x99U, 0xb2U, 0x1cU, 0x46U, 0x85U, 0x53U, 0x08U, 0x94U, 0x8fU, + 0xb2U, 0x1cU, 0x46U, 0x94U, 0x53U, 0x08U, 0x8fU, 0x9eU, 0xb7U, 0x1cU, + 0x46U, 0xa8U, 0x53U, 0x08U, 0x99U, 0x9eU, 0xb2U, 0x1cU, 0x46U, 0x6cU, + 0x53U, 0x08U, 0x94U, 0x9eU, 0xb7U, 0x1cU, 0x46U, 0x71U, 0x55U, 0x85U, + 0x54U, 0x2bU}; // TestHook hook = jswasm[R"[test.hook]( // const ASSERT = (x, code) => { // if (!x) { @@ -5617,7 +8390,7 @@ public: // } // const ASSERT_KL_EQ = (m, n) => { - // ASSERT(n[0] === m[0] && n[1] === m[1] && n[2] === m[2] && n[3] === m[3]) + // ASSERT(n[0] === m[0] && n[1] === m[1] && n[2] === m[2] && n[3] === m[3], 0) // } // //C5D0F34B0A1905BC3B29AA1BE139FE04D60C8694D3950A8D80251D10B563A822 @@ -5691,7 +8464,7 @@ public: // // KEYLET_HOOK // e = util_keylet(KEYLET_HOOK, a) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 1) // ans = [ // 0x00, 0x48, 0x6c, 0x4b, 0x29, 0xc6, 0x0f, 0x40, 0x5d, 0xb7, 0x6e, 0x87, // 0x65, 0x4a, 0x2f, 0x15, 0x4b, 0xab, 0x99, 0xc7, 0x62, 0x29, 0x80, 0x10, @@ -5701,7 +8474,7 @@ public: // // KEYLET_HOOK_STATE // e = util_keylet(KEYLET_HOOK_STATE, b, key, ns) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 2) // ans = [ // 0x00, 0x76, 0x28, 0xaf, 0xcc, 0x25, 0x0a, 0x64, 0x41, 0x8e, 0xb7, 0x83, // 0x68, 0xeb, 0x4e, 0xc5, 0x52, 0x4a, 0xeb, 0x97, 0x54, 0xab, 0xc1, 0x0b, @@ -5711,7 +8484,7 @@ public: // // KEYLET_ACCOUNT // e = util_keylet(KEYLET_ACCOUNT, b) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 3) // ans = [ // 0x00, 0x61, 0xc6, 0x55, 0xdd, 0x8d, 0x8e, 0xd3, 0xba, 0xb4, 0xa0, 0xf1, // 0xec, 0x2d, 0xa9, 0x99, 0xf4, 0x1b, 0xa6, 0x82, 0xc6, 0x84, 0xf9, 0x99, @@ -5721,7 +8494,7 @@ public: // // KEYLET_AMENDMENTS // e = util_keylet(KEYLET_AMENDMENTS) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 4) // ans = [ // 0x00, 0x66, 0x7d, 0xb0, 0x78, 0x8c, 0x02, 0x0f, 0x02, 0x78, 0x0a, 0x67, // 0x3d, 0xc7, 0x47, 0x57, 0xf2, 0x38, 0x23, 0xfa, 0x30, 0x14, 0xc1, 0x86, @@ -5731,7 +8504,7 @@ public: // // KEYLET_CHILD // e = util_keylet(KEYLET_CHILD, key) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 5) // ans = [ // 0x1c, 0xd2, 0x2d, 0x0c, 0xb3, 0xcd, 0x60, 0xda, 0x33, 0xb5, 0xaa, 0x7f, // 0xea, 0x32, 0x1f, 0x11, 0x16, 0x63, 0xea, 0xed, 0x32, 0x48, 0x1c, 0x6b, @@ -5741,7 +8514,7 @@ public: // // KEYLET_SKIP // e = util_keylet(KEYLET_SKIP) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 6) // ans = [ // 0x00, 0x68, 0xb4, 0x97, 0x9a, 0x36, 0xcd, 0xc7, 0xf3, 0xd3, 0xd5, 0xc3, // 0x1a, 0x4e, 0xae, 0x2a, 0xc7, 0xd7, 0x20, 0x9d, 0xda, 0x87, 0x75, 0x88, @@ -5751,7 +8524,7 @@ public: // // KEYLET_FEES // e = util_keylet(KEYLET_FEES) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 7) // ans = [ // 0x00, 0x73, 0x4b, 0xc5, 0x0c, 0x9b, 0x0d, 0x85, 0x15, 0xd3, 0xea, 0xae, // 0x1e, 0x74, 0xb2, 0x9a, 0x95, 0x80, 0x43, 0x46, 0xc4, 0x91, 0xee, 0x1a, @@ -5761,7 +8534,7 @@ public: // // KEYLET_NEGATIVE_UNL // e = util_keylet(KEYLET_NEGATIVE_UNL) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 8) // ans = [ // 0x00, 0x4e, 0x2e, 0x8a, 0x59, 0xaa, 0x9d, 0x3b, 0x5b, 0x18, 0x6b, 0x0b, // 0x9e, 0x0f, 0x62, 0xe6, 0xc0, 0x25, 0x87, 0xca, 0x74, 0xa4, 0xd7, 0x78, @@ -5771,7 +8544,7 @@ public: // // KEYLET_LINE // e = util_keylet(KEYLET_LINE, a, b, cur) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 9) // ans = [ // 0x00, 0x72, 0x0e, 0xb8, 0x2a, 0xdd, 0x5e, 0x15, 0x59, 0x1b, 0xf6, 0xe3, // 0x6d, 0xbc, 0x3c, 0x12, 0xd3, 0x07, 0x6d, 0x43, 0xa8, 0x53, 0xf8, 0xf9, @@ -5781,7 +8554,7 @@ public: // // KEYLET_OFFER // e = util_keylet(KEYLET_OFFER, a, 1) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 10) // ans = [ // 0x00, 0x6f, 0x60, 0x14, 0x48, 0x80, 0x97, 0x5f, 0x76, 0x6a, 0xb2, 0x2c, // 0x32, 0x2f, 0x10, 0x8e, 0x03, 0x43, 0x51, 0xde, 0x89, 0x6c, 0xf4, 0x9f, @@ -5791,7 +8564,7 @@ public: // // KEYLET_OFFER // e = util_keylet(KEYLET_OFFER, a, ns) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 11) // ans = [ // 0x00, 0x6f, 0x23, 0x61, 0x7f, 0x44, 0x91, 0x1c, 0xba, 0x3b, 0x5c, 0xbe, // 0xe9, 0x42, 0x22, 0xac, 0xa4, 0x29, 0xf4, 0xd6, 0x60, 0x01, 0xa8, 0xab, @@ -5803,7 +8576,7 @@ public: // klkey[0] = 0 // klkey[1] = 0x65 // e = util_keylet(KEYLET_QUALITY, klkey, 0, 1) - // ASSERT(INVALID_ARGUMENT === e) + // ASSERT(INVALID_ARGUMENT === e, 12) // // ans = [ // // 0x00, 0x6f, 0x23, 0x61, 0x7f, 0x44, 0x91, 0x1c, 0xba, 0x3b, 0x5c, 0xbe, // // 0xe9, 0x42, 0x22, 0xac, 0xa4, 0x29, 0xf4, 0xd6, 0x60, 0x01, 0xa8, 0xab, @@ -5814,7 +8587,7 @@ public: // // KEYLET_QUALITY // klkey[1] = 0x64 // e = util_keylet(KEYLET_QUALITY, klkey, 0, 1) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 13) // ans = [ // 0x00, 0x64, 0x2d, 0x0c, 0xb3, 0xcd, 0x60, 0xda, 0x33, 0xb5, 0xaa, 0x7f, // 0xea, 0x32, 0x1f, 0x11, 0x16, 0x63, 0xea, 0xed, 0x32, 0x48, 0x1c, 0x6b, @@ -5824,7 +8597,7 @@ public: // // KEYLET_EMITTED_DIR // e = util_keylet(KEYLET_EMITTED_DIR) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 14) // ans = [ // 0x00, 0x64, 0xb4, 0xde, 0x82, 0x30, 0x55, 0xd0, 0x0b, 0xc1, 0x2c, 0xd7, // 0x8f, 0xe1, 0xaa, 0xf7, 0x4e, 0xe6, 0x06, 0x21, 0x95, 0xb2, 0x62, 0x9f, @@ -5834,7 +8607,7 @@ public: // // KEYLET_SIGNERS // e = util_keylet(KEYLET_SIGNERS, a) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 15) // ans = [ // 0x00, 0x53, 0xdf, 0x8f, 0xf0, 0xce, 0x41, 0x1a, 0x3b, 0x8f, 0x1b, 0xb5, // 0xbb, 0x32, 0x78, 0x17, 0x15, 0xd6, 0x77, 0x42, 0xf5, 0xb5, 0x63, 0xb8, @@ -5844,7 +8617,7 @@ public: // // KEYLET_CHECK // e = util_keylet(KEYLET_CHECK, a, 1) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 16) // ans = [ // 0x00, 0x43, 0x08, 0x1f, 0x26, 0xff, 0x79, 0x1a, 0xf7, 0x54, 0x26, 0xed, // 0xf9, 0xeb, 0x08, 0x44, 0x85, 0x28, 0x58, 0x2c, 0xb1, 0xa4, 0xef, 0x4f, @@ -5854,7 +8627,7 @@ public: // // KEYLET_CHECK // e = util_keylet(KEYLET_CHECK, a, ns) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 17) // ans = [ // 0x00, 0x43, 0x94, 0xe3, 0x6f, 0x0d, 0xd3, 0xed, 0xc0, 0x2c, 0x49, 0xa5, // 0xaa, 0x0e, 0xcc, 0x49, 0x18, 0x39, 0x92, 0xab, 0x57, 0xc3, 0x2d, 0x9e, @@ -5864,7 +8637,7 @@ public: // // KEYLET_DEPOSIT_PREAUTH // e = util_keylet(KEYLET_DEPOSIT_PREAUTH, a, b) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 18) // ans = [ // 0x00, 0x70, 0x88, 0x90, 0x0f, 0x27, 0x66, 0x57, 0xbc, 0xc0, 0x5d, 0xa1, // 0x67, 0x40, 0xab, 0x9d, 0x33, 0x01, 0x8e, 0x45, 0x71, 0x7b, 0x0e, 0xc4, @@ -5876,13 +8649,13 @@ public: // klkey[0] = 0 // klkey[1] = 0 // e = util_keylet(KEYLET_UNCHECKED, key) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 19) // ans = klkey // ASSERT_KL_EQ(e, ans) // // KEYLET_OWNER_DIR // e = util_keylet(KEYLET_OWNER_DIR, a) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 20) // ans = [ // 0x00, 0x64, 0xc8, 0x5e, 0x01, 0x29, 0x06, 0x7b, 0x75, 0xad, 0x30, 0xb0, // 0xaa, 0x1c, 0xc2, 0x5b, 0x0a, 0x82, 0xc7, 0xf9, 0xaa, 0xbd, 0xee, 0x05, @@ -5892,7 +8665,7 @@ public: // // KEYLET_PAGE // e = util_keylet(KEYLET_PAGE, ns, 0, 1) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 21) // ans = [ // 0x00, 0x64, 0x61, 0xe6, 0x05, 0x1a, 0xb0, 0x49, 0x89, 0x2e, 0x75, 0xc9, // 0x3d, 0x67, 0xfb, 0x7a, 0x63, 0xf1, 0xef, 0x56, 0xdd, 0xaf, 0x3e, 0x6b, @@ -5902,7 +8675,7 @@ public: // // KEYLET_ESCROW // e = util_keylet(KEYLET_ESCROW, a, 1) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 22) // ans = [ // 0x00, 0x75, 0x13, 0xef, 0x04, 0xcd, 0x33, 0x6a, 0xad, 0xf6, 0x3d, 0x0c, // 0x7e, 0x05, 0x6c, 0x84, 0x9a, 0x7c, 0xf6, 0x72, 0x5e, 0x99, 0xbc, 0x93, @@ -5912,7 +8685,7 @@ public: // // KEYLET_ESCROW // e = util_keylet(KEYLET_ESCROW, a, ns) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 23) // ans = [ // 0x00, 0x75, 0xc1, 0xc6, 0xc5, 0x23, 0x74, 0x87, 0x12, 0x56, 0xaa, 0x7a, // 0x1f, 0xb3, 0x29, 0x7a, 0x0a, 0x55, 0x88, 0x7d, 0x16, 0x6a, 0xcf, 0x85, @@ -5921,8 +8694,8 @@ public: // ASSERT_KL_EQ(e, ans) // // KEYLET_PAYCHAN - // e = util_keylet(KEYLET_PAYCHAN, a, b, 1, 0) - // ASSERT(34 === e.length) + // e = util_keylet(KEYLET_PAYCHAN, a, b, 1) + // ASSERT(34 === e.length, 24) // ans = [ // 0x00, 0x78, 0xed, 0x04, 0xce, 0x27, 0x20, 0x21, 0x55, 0x2b, 0xbf, 0xa1, // 0xe5, 0xff, 0xbb, 0x53, 0xb6, 0x45, 0xa2, 0xff, 0x8a, 0x44, 0x66, 0xd5, @@ -5932,7 +8705,7 @@ public: // // KEYLET_PAYCHAN // e = util_keylet(KEYLET_PAYCHAN, a, b, ns) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 25) // ans = [ // 0x00, 0x78, 0x7d, 0xe1, 0x01, 0xf6, 0x2b, 0xb0, 0x55, 0x80, 0xb9, 0xd6, // 0xb0, 0x3f, 0x3b, 0xb0, 0x01, 0xbd, 0xe6, 0x9b, 0x89, 0x0f, 0x8a, 0xcd, @@ -5942,7 +8715,7 @@ public: // // KEYLET_EMITTED // e = util_keylet(KEYLET_EMITTED, ns) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 26) // ans = [ // 0x00, 0x45, 0xf3, 0x51, 0x2d, 0x1c, 0x80, 0xa3, 0xc0, 0xb1, 0x46, 0x04, // 0xe1, 0xad, 0xdb, 0x90, 0x1c, 0x66, 0x32, 0x10, 0x08, 0xcc, 0xd0, 0xab, @@ -5951,19 +8724,19 @@ public: // ASSERT_KL_EQ(e, ans) // // KEYLET_NFT_OFFER - // e = util_keylet(KEYLET_NFT_OFFER, a, 1, 0) - // ASSERT(34 === e.length) + // e = util_keylet(KEYLET_NFT_OFFER, a, 1) + // ASSERT(34 === e.length, 27) // // KEYLET_NFT_OFFER // e = util_keylet(KEYLET_NFT_OFFER, a, ns) - // ASSERT(34 === e.length) + // ASSERT(34 === e.length, 28) // accept('', 0) // } // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set util_keylet"), HSFEE); env.close(); @@ -8377,7 +11150,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set util_raddr"), HSFEE); env.close(); @@ -9915,7 +12688,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set util_sha512h"), HSFEE); env.close(); @@ -10157,7 +12930,7 @@ public: // )[test.hook]"]; // install the hook on alice - env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, overrideFlag)}}, 0), + env(ripple::test::jtx::hook(alice, {{hsov1(hook, 1, HSDROPS, overrideFlag)}}, 0), M("set util_verify"), HSFEE); env.close(); @@ -10191,6 +12964,7 @@ public: // testGuards(features); // Not Used in JSHooks // test_emit(features); // + // / test_prepare(features); // NEW // // test_etxn_burden(features); // tested above // // test_etxn_generation(features); // tested above // // test_otxn_burden(features); // tested above @@ -10236,11 +13010,13 @@ public: test_ledger_seq(features); // // test_meta_slot(features); // + // test_xpop_slot(features); // // test_otxn_id(features); // // test_otxn_slot(features); // // test_otxn_type(features); // // test_otxn_param(features); // + // test_otxn_json(features); // NEW // test_slot(features); // // test_slot_clear(features); // @@ -10251,22 +13027,25 @@ public: // test_slot_subarray(features); // // test_slot_subfield(features); // // test_slot_type(features); // + // test_slot_json(features); // NEW - // test_state(features); // - // test_state_foreign(features); // - // test_state_foreign_set(features); // - // test_state_foreign_set_max(features); // - // test_state_set(features); // + test_state(features); // + test_state_foreign(features); // + test_state_foreign_set(features); // + // test_state_foreign_set_max(features); // Not Version Specific + test_state_set(features); // // test_sto_emplace(features); // // test_sto_erase(features); // // test_sto_subarray(features); // // test_sto_subfield(features); // // test_sto_validate(features); // + // test_sto_to_json(features); // NEW + // test_sto_from_json(features); // NEW test_trace(features); // - // test_trace_float(features); // // Not Used in JSHooks - // test_trace_num(features); // // Not Used in JSHooks + // test_trace_float(features); // Not Used in JSHooks + // test_trace_num(features); // Not Used in JSHooks test_util_accid(features); // test_util_keylet(features); // diff --git a/src/test/app/SetJSHook_wasm.h b/src/test/app/SetJSHook_wasm.h index 5cd05f781..43df087db 100644 --- a/src/test/app/SetJSHook_wasm.h +++ b/src/test/app/SetJSHook_wasm.h @@ -10,6 +10,123 @@ namespace ripple { namespace test { std::map> jswasm = { /* ==== WASM: 0 ==== */ + {R"[test.hook]( + const INVALID_ARGUMENT = -7 + const sfAccount = 0x80001 + + const ASSERT = (x, code) => { + if (!x) { + rollback(x.toString(), code); + } + } + + const Hook = (arg) => { + ASSERT(otxn_field(sfAccount) == 20); + ASSERT(otxn_field(1) == INVALID_ARGUMENT); + + let acc2 = hook_account(); + ASSERT(acc2 == 20); + + for (var i = 0; i < 20; ++i) + ASSERT(acc[i] == acc2[i]); + + return accept("0", 0); + } + )[test.hook]", + {0x43U, 0x0fU, 0x20U, 0x49U, 0x4eU, 0x56U, 0x41U, 0x4cU, 0x49U, 0x44U, + 0x5fU, 0x41U, 0x52U, 0x47U, 0x55U, 0x4dU, 0x45U, 0x4eU, 0x54U, 0x12U, + 0x73U, 0x66U, 0x41U, 0x63U, 0x63U, 0x6fU, 0x75U, 0x6eU, 0x74U, 0x0cU, + 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, 0x08U, 0x48U, 0x6fU, 0x6fU, + 0x6bU, 0x28U, 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, + 0x65U, 0x73U, 0x74U, 0x2dU, 0x30U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, + 0x6aU, 0x73U, 0x02U, 0x78U, 0x08U, 0x63U, 0x6fU, 0x64U, 0x65U, 0x10U, + 0x72U, 0x6fU, 0x6cU, 0x6cU, 0x62U, 0x61U, 0x63U, 0x6bU, 0x06U, 0x61U, + 0x72U, 0x67U, 0x08U, 0x61U, 0x63U, 0x63U, 0x32U, 0x02U, 0x69U, 0x14U, + 0x6fU, 0x74U, 0x78U, 0x6eU, 0x5fU, 0x66U, 0x69U, 0x65U, 0x6cU, 0x64U, + 0x18U, 0x68U, 0x6fU, 0x6fU, 0x6bU, 0x5fU, 0x61U, 0x63U, 0x63U, 0x6fU, + 0x75U, 0x6eU, 0x74U, 0x06U, 0x61U, 0x63U, 0x63U, 0x0cU, 0x61U, 0x63U, + 0x63U, 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, + 0x00U, 0x01U, 0x00U, 0x01U, 0x00U, 0x02U, 0x5bU, 0x01U, 0xa4U, 0x01U, + 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, + 0xe4U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3fU, 0xe5U, 0x00U, 0x00U, 0x00U, + 0x80U, 0x3fU, 0xe6U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x80U, 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, + 0xe5U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe6U, 0x00U, 0x00U, 0x00U, + 0x80U, 0xbfU, 0xf9U, 0x3aU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x01U, 0x01U, + 0x00U, 0x08U, 0x00U, 0x3aU, 0xe4U, 0x00U, 0x00U, 0x00U, 0xc2U, 0x00U, + 0x4dU, 0xe5U, 0x00U, 0x00U, 0x00U, 0x3aU, 0xe5U, 0x00U, 0x00U, 0x00U, + 0xc2U, 0x01U, 0x4dU, 0xe6U, 0x00U, 0x00U, 0x00U, 0x3aU, 0xe6U, 0x00U, + 0x00U, 0x00U, 0xc7U, 0x28U, 0xceU, 0x03U, 0x01U, 0x09U, 0x79U, 0x7cU, + 0x26U, 0x00U, 0x0aU, 0x0cU, 0x00U, 0x0cU, 0x1aU, 0x0cU, 0x02U, 0x06U, + 0x00U, 0x00U, 0x02U, 0x00U, 0x02U, 0x03U, 0x00U, 0x00U, 0x16U, 0x02U, + 0xd0U, 0x03U, 0x00U, 0x01U, 0x00U, 0xd2U, 0x03U, 0x00U, 0x01U, 0x00U, + 0xd3U, 0x97U, 0xecU, 0x12U, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, 0xd3U, + 0x42U, 0x38U, 0x00U, 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, + 0x0eU, 0x29U, 0xceU, 0x03U, 0x05U, 0x03U, 0x03U, 0x17U, 0x59U, 0x0cU, + 0x02U, 0x06U, 0x00U, 0x00U, 0x01U, 0x02U, 0x01U, 0x04U, 0x00U, 0x01U, + 0x6bU, 0x03U, 0xd6U, 0x03U, 0x00U, 0x01U, 0x00U, 0xd8U, 0x03U, 0x01U, + 0x00U, 0x20U, 0xdaU, 0x03U, 0x00U, 0x00U, 0x00U, 0x61U, 0x00U, 0x00U, + 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0x38U, 0xeeU, 0x00U, 0x00U, 0x00U, + 0x38U, 0xe4U, 0x00U, 0x00U, 0x00U, 0xf1U, 0xbfU, 0x14U, 0xaaU, 0xf1U, + 0x0eU, 0x38U, 0xe5U, 0x00U, 0x00U, 0x00U, 0x38U, 0xeeU, 0x00U, 0x00U, + 0x00U, 0xb8U, 0xf1U, 0x38U, 0xe3U, 0x00U, 0x00U, 0x00U, 0xaaU, 0xf1U, + 0x0eU, 0x38U, 0xefU, 0x00U, 0x00U, 0x00U, 0xf0U, 0xcbU, 0x38U, 0xe5U, + 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0xbfU, 0x14U, 0xaaU, 0xf1U, + 0x0eU, 0xb7U, 0xccU, 0xc8U, 0xbfU, 0x14U, 0xa4U, 0xecU, 0x19U, 0x38U, + 0xe5U, 0x00U, 0x00U, 0x00U, 0x38U, 0xf0U, 0x00U, 0x00U, 0x00U, 0xc8U, + 0x47U, 0x62U, 0x00U, 0x00U, 0xc8U, 0x47U, 0xaaU, 0xf1U, 0x0eU, 0x94U, + 0x01U, 0xeeU, 0xe3U, 0x38U, 0xf1U, 0x00U, 0x00U, 0x00U, 0xc1U, 0x00U, + 0xb7U, 0x23U, 0x02U, 0x00U, 0xceU, 0x03U, 0x0bU, 0x07U, 0x12U, 0x6cU, + 0x68U, 0x26U, 0x45U, 0x2bU, 0x7cU, 0x07U, 0x02U, 0x30U}}, + + /* ==== WASM: 1 ==== */ + {R"[test.hook]( + const ASSERT = (x, code) => { + if (!x) { + rollback(x.toString(), code); + } + } + + const Hook = (arg) => { + let acc2 = hook_account(); + trace("acc2", acc2, false); + ASSERT(acc2.length == 20); + return accept(acc2, 0); + } + )[test.hook]", + {0x43U, 0x0bU, 0x0cU, 0x41U, 0x53U, 0x53U, 0x45U, 0x52U, 0x54U, 0x08U, + 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x28U, 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, + 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, 0x31U, 0x2dU, 0x67U, + 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x02U, 0x78U, 0x08U, 0x63U, 0x6fU, + 0x64U, 0x65U, 0x10U, 0x72U, 0x6fU, 0x6cU, 0x6cU, 0x62U, 0x61U, 0x63U, + 0x6bU, 0x06U, 0x61U, 0x72U, 0x67U, 0x08U, 0x61U, 0x63U, 0x63U, 0x32U, + 0x18U, 0x68U, 0x6fU, 0x6fU, 0x6bU, 0x5fU, 0x61U, 0x63U, 0x63U, 0x6fU, + 0x75U, 0x6eU, 0x74U, 0x0aU, 0x74U, 0x72U, 0x61U, 0x63U, 0x65U, 0x0cU, + 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, + 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, 0x00U, 0x02U, 0x32U, 0x01U, + 0xa4U, 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x80U, 0x3fU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x80U, 0x3eU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x80U, 0xc2U, + 0x00U, 0x4dU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x3aU, 0xe3U, 0x00U, 0x00U, + 0x00U, 0xc2U, 0x01U, 0x4dU, 0xe4U, 0x00U, 0x00U, 0x00U, 0x3aU, 0xe4U, + 0x00U, 0x00U, 0x00U, 0xc7U, 0x28U, 0xcaU, 0x03U, 0x01U, 0x07U, 0x3dU, + 0x00U, 0x0cU, 0x0cU, 0x00U, 0x0cU, 0x0eU, 0x0cU, 0x02U, 0x06U, 0x00U, + 0x00U, 0x02U, 0x00U, 0x02U, 0x03U, 0x00U, 0x00U, 0x16U, 0x02U, 0xccU, + 0x03U, 0x00U, 0x01U, 0x00U, 0xceU, 0x03U, 0x00U, 0x01U, 0x00U, 0xd3U, + 0x97U, 0xecU, 0x12U, 0x38U, 0xe8U, 0x00U, 0x00U, 0x00U, 0xd3U, 0x42U, + 0x38U, 0x00U, 0x00U, 0x00U, 0x24U, 0x00U, 0x00U, 0xd4U, 0xf2U, 0x0eU, + 0x29U, 0xcaU, 0x03U, 0x02U, 0x03U, 0x03U, 0x17U, 0x59U, 0x0cU, 0x02U, + 0x06U, 0x00U, 0x00U, 0x01U, 0x01U, 0x01U, 0x04U, 0x00U, 0x00U, 0x34U, + 0x02U, 0xd2U, 0x03U, 0x00U, 0x01U, 0x00U, 0xd4U, 0x03U, 0x01U, 0x00U, + 0x20U, 0x61U, 0x00U, 0x00U, 0x38U, 0xebU, 0x00U, 0x00U, 0x00U, 0xf0U, + 0xcbU, 0x38U, 0xecU, 0x00U, 0x00U, 0x00U, 0x04U, 0xeaU, 0x00U, 0x00U, + 0x00U, 0x62U, 0x00U, 0x00U, 0x09U, 0xf3U, 0x0eU, 0x38U, 0xe3U, 0x00U, + 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0xebU, 0xbfU, 0x14U, 0xaaU, 0xf1U, + 0x0eU, 0x38U, 0xedU, 0x00U, 0x00U, 0x00U, 0x62U, 0x00U, 0x00U, 0xb7U, + 0x23U, 0x02U, 0x00U, 0xcaU, 0x03U, 0x08U, 0x04U, 0x12U, 0x26U, 0x53U, + 0x49U}}, + + /* ==== WASM: 1 ==== */ {R"[test.hook]( const Hook = (arg) => { return accept("0", 0); @@ -17,7 +134,7 @@ std::map> jswasm = { )[test.hook]", {0x43U, 0x04U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x28U, 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, - 0x30U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x06U, 0x61U, + 0x31U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x06U, 0x61U, 0x72U, 0x67U, 0x0cU, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, 0x1aU, 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, @@ -29,7 +146,7 @@ std::map> jswasm = { 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0xc1U, 0x00U, 0xb7U, 0x23U, 0x02U, 0x00U, 0xc8U, 0x03U, 0x02U, 0x01U, 0x03U, 0x07U, 0x02U, 0x30U}}, - /* ==== WASM: 1 ==== */ + /* ==== WASM: 2 ==== */ {R"[test.hook]( const Hook = (arg) => { return rollback("0", 0); @@ -37,7 +154,7 @@ std::map> jswasm = { )[test.hook]", {0x43U, 0x04U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x28U, 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, - 0x31U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x06U, 0x61U, + 0x32U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x06U, 0x61U, 0x72U, 0x67U, 0x10U, 0x72U, 0x6fU, 0x6cU, 0x6cU, 0x62U, 0x61U, 0x63U, 0x6bU, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, 0x1aU, 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, 0x00U, @@ -50,7 +167,32 @@ std::map> jswasm = { 0x23U, 0x02U, 0x00U, 0xc8U, 0x03U, 0x02U, 0x01U, 0x03U, 0x07U, 0x02U, 0x30U}}, - /* ==== WASM: 2 ==== */ + /* ==== WASM: 3 ==== */ + {R"[test.hook]( + const Hook = (arg) => { + console.log("HERE"); + return accept(ret, 0); + } + )[test.hook]", + {0x43U, 0x08U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x28U, 0x77U, 0x61U, + 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, + 0x33U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x06U, 0x61U, + 0x72U, 0x67U, 0x0eU, 0x63U, 0x6fU, 0x6eU, 0x73U, 0x6fU, 0x6cU, 0x65U, + 0x06U, 0x6cU, 0x6fU, 0x67U, 0x08U, 0x48U, 0x45U, 0x52U, 0x45U, 0x0cU, + 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x06U, 0x72U, 0x65U, 0x74U, + 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, + 0x00U, 0x01U, 0x1aU, 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, + 0xe3U, 0x00U, 0x00U, 0x00U, 0x80U, 0x3eU, 0xe3U, 0x00U, 0x00U, 0x00U, + 0x80U, 0xc2U, 0x00U, 0x4dU, 0xe3U, 0x00U, 0x00U, 0x00U, 0x3aU, 0xe3U, + 0x00U, 0x00U, 0x00U, 0xc7U, 0x28U, 0xc8U, 0x03U, 0x01U, 0x04U, 0x1fU, + 0x00U, 0x06U, 0x0aU, 0x0cU, 0x02U, 0x06U, 0x00U, 0x00U, 0x01U, 0x00U, + 0x01U, 0x03U, 0x00U, 0x00U, 0x21U, 0x01U, 0xcaU, 0x03U, 0x00U, 0x01U, + 0x00U, 0x38U, 0xe6U, 0x00U, 0x00U, 0x00U, 0x42U, 0xe7U, 0x00U, 0x00U, + 0x00U, 0x04U, 0xe8U, 0x00U, 0x00U, 0x00U, 0x24U, 0x01U, 0x00U, 0x0eU, + 0x38U, 0xe9U, 0x00U, 0x00U, 0x00U, 0x38U, 0xeaU, 0x00U, 0x00U, 0x00U, + 0xb7U, 0x23U, 0x02U, 0x00U, 0xc8U, 0x03U, 0x02U, 0x02U, 0x03U, 0x62U}}, + + /* ==== WASM: 4 ==== */ {R"[test.hook]( const M_REPEAT_10 = (X) => X.repeat(10); const M_REPEAT_100 = (X) => M_REPEAT_10(X).repeat(10); @@ -65,7 +207,7 @@ std::map> jswasm = { 0x45U, 0x41U, 0x54U, 0x5fU, 0x31U, 0x30U, 0x30U, 0x1aU, 0x4dU, 0x5fU, 0x52U, 0x45U, 0x50U, 0x45U, 0x41U, 0x54U, 0x5fU, 0x31U, 0x30U, 0x30U, 0x30U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x28U, 0x77U, 0x61U, 0x73U, - 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, 0x32U, + 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, 0x34U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x02U, 0x58U, 0x0cU, 0x72U, 0x65U, 0x70U, 0x65U, 0x61U, 0x74U, 0x06U, 0x61U, 0x72U, 0x67U, 0x06U, 0x72U, 0x65U, 0x74U, 0x84U, 0x01U, 0x61U, 0x62U, 0x63U, 0x64U, @@ -107,7 +249,7 @@ std::map> jswasm = { 0x00U, 0x62U, 0x00U, 0x00U, 0xb7U, 0x23U, 0x02U, 0x00U, 0xceU, 0x03U, 0x05U, 0x02U, 0x12U, 0x3fU}}, - /* ==== WASM: 3 ==== */ + /* ==== WASM: 5 ==== */ {R"[test.hook]( const Hook = (arg) => { const test_key = "0000000000000000000000000000000000000000000000006b657900"; @@ -117,7 +259,7 @@ std::map> jswasm = { )[test.hook]", {0x43U, 0x09U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x28U, 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, - 0x33U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x06U, 0x61U, + 0x35U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x06U, 0x61U, 0x72U, 0x67U, 0x10U, 0x74U, 0x65U, 0x73U, 0x74U, 0x5fU, 0x6bU, 0x65U, 0x79U, 0x14U, 0x74U, 0x65U, 0x73U, 0x74U, 0x5fU, 0x76U, 0x61U, 0x6cU, 0x75U, 0x65U, 0x70U, 0x30U, 0x30U, 0x30U, 0x30U, 0x30U, 0x30U, 0x30U, @@ -143,7 +285,7 @@ std::map> jswasm = { 0x62U, 0x01U, 0x00U, 0x62U, 0x00U, 0x00U, 0xf2U, 0x23U, 0x02U, 0x00U, 0xc8U, 0x03U, 0x02U, 0x03U, 0x21U, 0x21U, 0x21U, 0x07U, 0x02U, 0x30U}}, - /* ==== WASM: 4 ==== */ + /* ==== WASM: 6 ==== */ {R"[test.hook]( const Hook = (arg) => { return accept("0", 2); @@ -151,7 +293,7 @@ std::map> jswasm = { )[test.hook]", {0x43U, 0x04U, 0x08U, 0x48U, 0x6fU, 0x6fU, 0x6bU, 0x28U, 0x77U, 0x61U, 0x73U, 0x6dU, 0x6aU, 0x73U, 0x2fU, 0x74U, 0x65U, 0x73U, 0x74U, 0x2dU, - 0x34U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x06U, 0x61U, + 0x36U, 0x2dU, 0x67U, 0x65U, 0x6eU, 0x2eU, 0x6aU, 0x73U, 0x06U, 0x61U, 0x72U, 0x67U, 0x0cU, 0x61U, 0x63U, 0x63U, 0x65U, 0x70U, 0x74U, 0x0cU, 0x00U, 0x06U, 0x00U, 0xa2U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, 0x00U, 0x01U, 0x1aU, 0x01U, 0xa4U, 0x01U, 0x00U, 0x00U, 0x00U, 0x3fU, 0xe3U, diff --git a/src/test/app/build-js-carray.sh b/src/test/app/build-js-carray.sh new file mode 100755 index 000000000..474329d92 --- /dev/null +++ b/src/test/app/build-js-carray.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Get the input file name from the command line argument +input_file="$1" +# Generate the hex output +hex_output=$(./qjsc -c -o /dev/stdout "$input_file" | tr -d '\n' | grep -Eo '\{[^}]+\}' | grep -Eo '0x[a-fA-F0-9]+' | sed -e 's/0x//g' | tr -d '\n') +# Convert the hex to a C array format +c_array="" +for ((i=0; i<${#hex_output}; i+=2)); do + c_array+="0x${hex_output:$i:2}U, " +done +c_array="${c_array%, }" +c_array+="" +# Output the C array to the console +echo "$c_array" \ No newline at end of file diff --git a/src/test/app/build_test_jshooks.sh b/src/test/app/build_test_jshooks.sh new file mode 100755 index 000000000..2045318be --- /dev/null +++ b/src/test/app/build_test_jshooks.sh @@ -0,0 +1,47 @@ +#!/bin/bash +rm -r wasmjs && mkdir wasmjs +echo ' +//This file is generated by build_test_hooks.h +#ifndef SETHOOK_JSWASM_INCLUDED +#define SETHOOK_JSWASM_INCLUDED +#include +#include +#include +#include +namespace ripple { +namespace test { +std::map> jswasm = {' > SetJSHook_tmp_wasm.h +COUNTER="0" +cat SetJSHook_test.cpp | tr '\n' '\f' | + ggrep -Po 'R"\[test\.hook\](.*?)\[test\.hook\]"' | + gsed -E 's/R"\[test\.hook\]\(//g' | + gsed -E 's/\)\[test\.hook\]"[\f \t]*/\/*end*\//g' | + while read -r line + do + echo "/* ==== WASM: $COUNTER ==== */" >> SetJSHook_tmp_wasm.h + echo -n '{ R"[test.hook](' >> SetJSHook_tmp_wasm.h + cat <<< $line | gsed -E 's/.{7}$//g' | tr -d '\n' | tr '\f' '\n' >> SetJSHook_tmp_wasm.h + echo ')[test.hook]",' >> SetJSHook_tmp_wasm.h + echo "{" >> SetJSHook_tmp_wasm.h + WAT=`ggrep -Eo '\(module' <<< $line | wc -l` + if [ "$WAT" -eq "0" ] + then + tr '\f' '\n' <<< $line >> wasmjs/test-$COUNTER-gen.js + ./build-js-carray.sh wasmjs/test-$COUNTER-gen.js >> SetJSHook_tmp_wasm.h + else + echo "Compilation error ^" + exit 1 + fi + if [ "$?" -gt "0" ] + then + echo "Compilation error ^" + exit 1 + fi + echo '}},' >> SetJSHook_tmp_wasm.h + echo >> SetJSHook_tmp_wasm.h + COUNTER=`echo $COUNTER + 1 | bc` + done +echo '}; +} +} +#endif' >> SetJSHook_tmp_wasm.h diff --git a/src/test/jtx/hook.h b/src/test/jtx/hook.h index bd78d3419..5e0815ee0 100644 --- a/src/test/jtx/hook.h +++ b/src/test/jtx/hook.h @@ -38,7 +38,7 @@ Json::Value hso(std::vector const& wasmBytes, void (*f)(Json::Value& jv) = 0); Json::Value -hsov1(std::vector const& wasmBytes, uint16_t apiVersion, void (*f)(Json::Value& jv) = 0); +hsov1(std::vector const& wasmBytes, uint16_t const& apiVersion, STAmount const& fee, void (*f)(Json::Value& jv) = 0); Json::Value diff --git a/src/test/jtx/impl/hook.cpp b/src/test/jtx/impl/hook.cpp index d804e245e..2ebe9ac5d 100644 --- a/src/test/jtx/impl/hook.cpp +++ b/src/test/jtx/impl/hook.cpp @@ -82,10 +82,10 @@ hso(std::vector const& wasmBytes, void (*f)(Json::Value& jv)) } Json::Value -hsov1(std::vector const& wasmBytes, uint16_t apiVersion = 0, void (*f)(Json::Value& jv)) +hsov1(std::vector const& wasmBytes, uint16_t const& apiVersion, STAmount const& fee, void (*f)(Json::Value& jv)) { if (wasmBytes.size() == 0) - throw std::runtime_error("empty hook wasm passed to hso()"); + throw std::runtime_error("empty hook wasm passed to hsov1()"); Json::Value jv; jv[jss::CreateCode] = strHex(wasmBytes); @@ -94,6 +94,7 @@ hsov1(std::vector const& wasmBytes, uint16_t apiVersion = 0, void (*f)( "0000000000000000000000000000000000000000000000000000000000000000"; jv[jss::HookNamespace] = to_string(uint256{beast::zero}); jv[jss::HookApiVersion] = Json::Value{apiVersion}; + jv[jss::Fee] = fee.getJson(JsonOptions::none); } if (f)