diff --git a/include/evmmax/evmmax.hpp b/include/evmmax/evmmax.hpp index 70feec2bc3..dff69f8344 100644 --- a/include/evmmax/evmmax.hpp +++ b/include/evmmax/evmmax.hpp @@ -3,11 +3,94 @@ // SPDX-License-Identifier: Apache-2.0 #pragma once +#include #include +#include namespace evmmax { +using intx::uint256; + +struct EXMMAXModStateInterface; + +/// Ephemeral EVMMAX (EVM Modular Arithmetic Extensions) state +class EVMMAXState +{ + struct OpcodesGasCost + { + private: + int64_t addmodx; + int64_t mulmodx; + + public: + explicit OpcodesGasCost(int64_t _addmodx, int64_t _mulmodx) + : addmodx(_addmodx), mulmodx(_mulmodx) + {} + + int64_t calc_mul_gas_cost(uint8_t count) const { return (mulmodx * count + 999) / 1000; } + int64_t calc_add_gas_cost(uint8_t count) const { return (addmodx * count + 999) / 1000; } + }; + + OpcodesGasCost current_gas_cost = OpcodesGasCost{0, 0}; + + std::unique_ptr active_mod; ///< Current active modulus + +public: + /// Create new modulus and activates it. In case the modulus already exists, activates it. + /// Deducts gas accordingly. + /// + /// \param gas_left Amount of gas before calling. Is modified by `setmodx` + /// \param mod_ptr Modulus big endian value memory pointer + /// \param mod_size Modulus size in bytes + /// \param vals_used Number of needed value slots + /// \return Status code. + [[nodiscard]] evmc_status_code setmodx( + int64_t& gas_left, const uint8_t* mod_ptr, size_t mod_size, size_t alloc_count) noexcept; + + /// Loads EVMMAX values into EVM memory. Deducts gas accordingly. + /// Converts to the Montgomery form + [[nodiscard]] evmc_status_code loadx( + int64_t& gas_left, uint8_t* out_ptr, size_t val_idx, size_t num_vals) noexcept; + + /// Stores EVM memory into EVMMAX value slots. Deducts gas accordingly. + /// Converts from the Montgomery form + [[nodiscard]] evmc_status_code storex( + int64_t& gas_left, const uint8_t* in_ptr, size_t dst_val_idx, size_t num_vals) noexcept; + + /// Computes modular addition. Deducts gas accordingly. Operates on active modulus. + /// + /// for i in range(count): + /// active_ctx.registers[dst_idx+i*dst_stride] = + /// operation(active_ctx.registers[x_idx+i*x_stride], active_ctx.registers[y_idx+i*y_stride]) + [[nodiscard]] evmc_status_code addmodx(int64_t& gas_left, size_t dst_idx, size_t dst_stride, + size_t x_idx, size_t x_stride, size_t y_idx, size_t y_stride, size_t count) noexcept; + + /// Computes modular subtraction. Deducts gas accordingly. Operates on active modulus. + [[nodiscard]] evmc_status_code submodx(int64_t& gas_left, size_t dst_idx, size_t dst_stride, + size_t x_idx, size_t x_stride, size_t y_idx, size_t y_stride, size_t count) noexcept; + + /// Computes modular multiplication. Deducts gas accordingly. Operates on active modulus. + [[nodiscard]] evmc_status_code mulmodx(int64_t& gas_left, size_t dst_idx, size_t dst_stride, + size_t x_idx, size_t x_stride, size_t y_idx, size_t y_stride, size_t count) noexcept; + + /// Checks that there exists an active modulus + [[nodiscard]] bool is_activated() const noexcept; + + /// Returns active modulus size. + /// Size in bytes needed to represent modulus. + [[nodiscard]] size_t active_mod_value_size() const noexcept; + + void print_state(std::ostream& out) const noexcept; + + void clear() noexcept; + + EVMMAXState& operator=(EVMMAXState&&) noexcept; + explicit EVMMAXState() noexcept; + explicit EVMMAXState(EVMMAXState&&) noexcept; + virtual ~EVMMAXState(); +}; + /// The modular arithmetic operations for EVMMAX (EVM Modular Arithmetic Extensions). template class ModArith diff --git a/lib/evmmax/CMakeLists.txt b/lib/evmmax/CMakeLists.txt index ae4c6aa238..f763a0d642 100644 --- a/lib/evmmax/CMakeLists.txt +++ b/lib/evmmax/CMakeLists.txt @@ -2,17 +2,14 @@ # Copyright 2023 The evmone Authors. # SPDX-License-Identifier: Apache-2.0 -add_library(evmmax INTERFACE) +add_library(evmmax STATIC) add_library(evmone::evmmax ALIAS evmmax) -target_compile_features(evmmax INTERFACE cxx_std_20) -target_include_directories(evmmax INTERFACE ${PROJECT_SOURCE_DIR}/include) -target_link_libraries(evmmax INTERFACE intx::intx) +target_compile_features(evmmax PUBLIC cxx_std_20) +target_include_directories(evmmax PUBLIC ${PROJECT_SOURCE_DIR}/include) +target_link_libraries(evmmax PUBLIC intx::intx PRIVATE evmc::evmc_cpp) -if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.19) - # We want to add the header file to the library for IDEs. - # However, cmake 3.18 does not support PRIVATE scope for INTERFACE libraries. - target_sources( - evmmax PRIVATE - ${PROJECT_SOURCE_DIR}/include/evmmax/evmmax.hpp - ) -endif() +target_sources( + evmmax PRIVATE + ${PROJECT_SOURCE_DIR}/include/evmmax/evmmax.hpp + evmmax.cpp +) diff --git a/lib/evmmax/evmmax.cpp b/lib/evmmax/evmmax.cpp new file mode 100644 index 0000000000..8d1231f9e1 --- /dev/null +++ b/lib/evmmax/evmmax.cpp @@ -0,0 +1,495 @@ +// evmone: Fast Ethereum Virtual Machine implementation +// Copyright 2023 The evmone Authors. +// SPDX-License-Identifier: Apache-2.0 + +#pragma clang diagnostic ignored "-Wconversion" +#include "fastmod.h" +#include +#include + +using namespace intx; + +namespace evmmax +{ +struct EXMMAXModStateInterface +{ + [[nodiscard]] virtual bool loadx( + uint8_t* out_ptr, size_t val_idx, size_t num_vals) const noexcept = 0; + [[nodiscard]] virtual bool storex( + const uint8_t* in_ptr, size_t dst_val_idx, size_t num_vals) noexcept = 0; + [[nodiscard]] virtual bool addmodx(size_t dst_idx, size_t dst_stride, size_t x_idx, + size_t x_stride, size_t y_idx, size_t y_stride, size_t count) noexcept = 0; + [[nodiscard]] virtual bool submodx(size_t dst_idx, size_t dst_stride, size_t x_idx, + size_t x_stride, size_t y_idx, size_t y_stride, size_t count) noexcept = 0; + [[nodiscard]] virtual bool mulmodx(size_t dst_idx, size_t dst_stride, size_t x_idx, + size_t x_stride, size_t y_idx, size_t y_stride, size_t count) noexcept = 0; + virtual void print(std::ostream& out) noexcept = 0; + + [[nodiscard]] virtual size_t value_size() const noexcept = 0; + [[nodiscard]] virtual size_t num_values() const noexcept = 0; + + virtual ~EXMMAXModStateInterface() noexcept = default; +}; + +namespace +{ +/// Copy of intx::be::unsafe::load but with additional src size parameter +template +inline IntT load(const uint8_t* src, size_t src_size) noexcept +{ + // Align bytes. + // TODO: Using memcpy() directly triggers this optimization bug in GCC: + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107837 + alignas(IntT) std::byte aligned_storage[sizeof(IntT)] = {}; + std::memcpy(&aligned_storage[sizeof(IntT) - src_size], src, src_size); + // TODO(C++23): Use std::start_lifetime_as(). + return to_big_endian(*reinterpret_cast(&aligned_storage)); +} + +template +inline void store(uint8_t* dst, const T& x, size_t dst_size) noexcept +{ + const auto d = to_big_endian(x); + std::memcpy(dst, &reinterpret_cast(&d)[sizeof(T) - dst_size], dst_size); +} + +template +struct EXMMAXModState : public EXMMAXModStateInterface +{ + std::vector values; + const ModArith arith; + const size_t value_size_in_bytes; + + explicit EXMMAXModState(const UintT& _mod, size_t mod_size, size_t vals_used) noexcept + : arith(_mod), value_size_in_bytes((mod_size + 7) / 8) + { + values.resize(vals_used); + } + + [[nodiscard]] bool loadx( + uint8_t* out_ptr, size_t val_idx, size_t num_vals) const noexcept override + { + if (!(val_idx + num_vals <= values.size())) + return false; + + for (unsigned i = 0; i < num_vals; ++i) + { + store(out_ptr + i * value_size_in_bytes, arith.from_mont(values[val_idx + i]), + value_size_in_bytes); + } + + return true; + } + + [[nodiscard]] bool storex( + const uint8_t* in_ptr, size_t dst_val_idx, size_t num_vals) noexcept override + { + if (!(dst_val_idx + num_vals <= values.size())) + return false; + + for (unsigned i = 0; i < num_vals; ++i) + { + values[dst_val_idx + i] = + arith.to_mont(load(in_ptr + value_size_in_bytes * i, value_size_in_bytes)); + } + + return true; + } + + [[nodiscard]] bool operation(std::function op, size_t dst_idx, + size_t dst_stride, size_t x_idx, size_t x_stride, size_t y_idx, size_t y_stride, + size_t count) noexcept + { + if (std::max(dst_idx + dst_stride * (count - 1), + std::max(x_idx + x_stride * (count - 1), y_idx + y_stride * (count - 1))) >= + values.size()) + return false; + + for (size_t i = 0; i < count; ++i) + values[dst_idx + i * dst_stride] = + op(values[x_idx + i * x_stride], values[y_idx + i * y_stride]); + + return true; + } + + [[nodiscard]] bool addmodx(size_t dst_idx, size_t dst_stride, size_t x_idx, size_t x_stride, + size_t y_idx, size_t y_stride, size_t count) noexcept override + { + return operation([&](const UintT& x, const UintT& y) { return arith.add(x, y); }, dst_idx, + dst_stride, x_idx, x_stride, y_idx, y_stride, count); + } + + [[nodiscard]] bool submodx(size_t dst_idx, size_t dst_stride, size_t x_idx, size_t x_stride, + size_t y_idx, size_t y_stride, size_t count) noexcept override + { + return operation([&](const UintT& x, const UintT& y) { return arith.sub(x, y); }, dst_idx, + dst_stride, x_idx, x_stride, y_idx, y_stride, count); + } + + [[nodiscard]] bool mulmodx(size_t dst_idx, size_t dst_stride, size_t x_idx, size_t x_stride, + size_t y_idx, size_t y_stride, size_t count) noexcept override + { + return operation([&](const UintT& x, const UintT& y) { return arith.mul(x, y); }, dst_idx, + dst_stride, x_idx, x_stride, y_idx, y_stride, count); + } + + void print(std::ostream& out) noexcept override + { + out << "{ \n"; + for (size_t i = 0; i < values.size(); ++i) + { + if (values[i] != 0) + out << "\t" << i << ": " << size_t(arith.from_mont(values[i])) << ", \n"; + } + out << "}\n"; + } + + [[nodiscard]] size_t num_values() const noexcept override { return values.size(); } + [[nodiscard]] size_t value_size() const noexcept override { return value_size_in_bytes; } +}; + +template +struct EXMMAXModStateSmallValues : public EXMMAXModStateInterface +{ + std::vector values; + const size_t value_size_in_bytes; + const UintT mod; + uint64_t fast_mod; + + explicit EXMMAXModStateSmallValues( + const UintT& _mod, size_t mod_size, size_t vals_used) noexcept + : value_size_in_bytes((mod_size + 7) / 8), mod(_mod) + { + if constexpr (std::is_same::value) + fast_mod = fastmod::computeM_u32(mod); + else if constexpr (std::is_same::value) + assert(false); + + values.resize(vals_used); + } + + [[nodiscard]] bool loadx( + uint8_t* out_ptr, size_t val_idx, size_t num_vals) const noexcept override + { + if (!(val_idx + num_vals <= values.size())) + return false; + + for (unsigned i = 0; i < num_vals; ++i) + store(out_ptr + i * value_size_in_bytes, values[val_idx + i], value_size_in_bytes); + + return true; + } + + [[nodiscard]] bool storex( + const uint8_t* in_ptr, size_t dst_val_idx, size_t num_vals) noexcept override + { + if (!(dst_val_idx + num_vals <= values.size())) + return false; + + for (unsigned i = 0; i < num_vals; ++i) + { + values[dst_val_idx + i] = + load(in_ptr + value_size_in_bytes * i, value_size_in_bytes); + + values[dst_val_idx + i] = fastmod::fastmod_u32(values[dst_val_idx + i], fast_mod, mod); + } + + return true; + } + + [[nodiscard]] bool addmodx(size_t dst_idx, size_t dst_stride, size_t x_idx, size_t x_stride, + size_t y_idx, size_t y_stride, size_t count) noexcept override + { + assert(std::max(dst_idx + dst_stride * (count - 1), + std::max(x_idx + x_stride * (count - 1), y_idx + y_stride * (count - 1))) < + values.size()); + + for (size_t i = 0; i < count; ++i) + { + values[dst_idx + i * dst_stride] = + values[x_idx + i * x_stride] + values[y_idx + i * y_stride]; + + values[dst_idx + i * dst_stride] = + fastmod::fastmod_u32(values[dst_idx + i * dst_stride], fast_mod, mod); + // values[dst_idx + i * dst_stride] %= mod; + } + + return true; + } + + [[nodiscard]] bool submodx(size_t dst_idx, size_t dst_stride, size_t x_idx, size_t x_stride, + size_t y_idx, size_t y_stride, size_t count) noexcept override + { + assert(std::max(dst_idx + dst_stride * (count - 1), + std::max(x_idx + x_stride * (count - 1), y_idx + y_stride * (count - 1))) < + values.size()); + + for (size_t i = 0; i < count; ++i) + { + values[dst_idx + i * dst_stride] = + values[y_idx + i * y_stride] > values[x_idx + i * x_stride] ? + values[x_idx + i * x_stride] + mod - values[y_idx + i * y_stride] : + values[x_idx + i * x_stride] - values[y_idx + i * y_stride]; + } + + return true; + } + + [[nodiscard]] bool mulmodx(size_t dst_idx, size_t dst_stride, size_t x_idx, size_t x_stride, + size_t y_idx, size_t y_stride, size_t count) noexcept override + { + assert(std::max(dst_idx + dst_stride * (count - 1), + std::max(x_idx + x_stride * (count - 1), y_idx + y_stride * (count - 1))) < + values.size()); + + for (size_t i = 0; i < count; ++i) + { + values[dst_idx + i * dst_stride] = + values[x_idx + i * x_stride] * values[y_idx + i * y_stride]; + + values[dst_idx + i * dst_stride] = + fastmod::fastmod_u32(values[dst_idx + i * dst_stride], fast_mod, mod); + // values[dst_idx + i * dst_stride] %= mod; + } + + return true; + } + + void print(std::ostream& out) noexcept override + { + out << "{ \n"; + for (size_t i = 0; i < values.size(); ++i) + { + if (values[i] != 0) + out << "\t" << i << ": " << size_t(values[i]) << ", \n"; + } + out << "}\n"; + } + + [[nodiscard]] size_t num_values() const noexcept override { return values.size(); } + [[nodiscard]] size_t value_size() const noexcept override { return value_size_in_bytes; } +}; + +[[nodiscard]] std::unique_ptr create_mod_state( + const uint8_t* mod_ptr, size_t mod_size, size_t vals_used) noexcept +{ + // Must be odd. + const auto mod_size_bytes = (mod_size + 7) / 8; + assert((mod_ptr[mod_size_bytes - 1] & 1) == 1); + // Max mod size must be <= 4096 bits + assert(mod_size_bytes <= 512); + + // We make the registers 2 times bigger to avoid using additional memory to handle overflows. + // For small values only + if (mod_size_bytes <= 2) + { + return std::make_unique>( + load(mod_ptr, mod_size_bytes), mod_size, vals_used); + } + if (mod_size_bytes <= 4) + { + return std::make_unique>( + load(mod_ptr, mod_size_bytes), mod_size, vals_used); + } + if (mod_size_bytes <= 16) + { + return std::make_unique>( + load(mod_ptr, mod_size_bytes), mod_size, vals_used); + } + else if (mod_size_bytes <= 32) + { + return std::make_unique>( + load(mod_ptr, mod_size_bytes), mod_size, vals_used); + } + else if (mod_size_bytes <= 48) + { + return std::make_unique>( + load(mod_ptr, mod_size_bytes), mod_size, vals_used); + } + else + return nullptr; +} + +[[nodiscard]] bool charge_gas_precompute_mont(int64_t& gas_left, size_t mod_size) noexcept +{ + // TODO: Set proper values for A and B + static constexpr int64_t A = 1; + static constexpr int64_t B = 5; + + const size_t val_size_multiplier = (mod_size + 7) / (8 * 8); + + if (val_size_multiplier < 50) + gas_left -= A * static_cast(val_size_multiplier) + B; + else + { + // TODO: Add support for subquadratic mulmont cost model + assert(false); + return false; + } + + return gas_left >= 0; +} + +[[nodiscard]] bool validate_memory_usage(size_t val_size, size_t num_val) noexcept +{ + static constexpr auto EVMMAX_MAX_MEM_SIZE = 65536; + + return val_size * num_val <= EVMMAX_MAX_MEM_SIZE; +} + +} // namespace + +[[nodiscard]] bool EVMMAXState::is_activated() const noexcept +{ + return active_mod != nullptr; +} + +[[nodiscard]] evmc_status_code EVMMAXState::setmodx( + int64_t& gas_left, const uint8_t* mod_ptr, size_t mod_size, size_t alloc_count) noexcept +{ + if (!validate_memory_usage((mod_size + 7) / 8, alloc_count)) + return EVMC_FAILURE; + + if (!charge_gas_precompute_mont(gas_left, mod_size)) + return EVMC_OUT_OF_GAS; + + active_mod = create_mod_state(mod_ptr, mod_size, alloc_count); + if (active_mod != nullptr) + { + if (mod_size <= 32) + { + current_gas_cost = OpcodesGasCost{ + 50, + 60, + }; + } + else if (mod_size <= 192) + { + current_gas_cost = OpcodesGasCost{ + 1000, + 1000, + }; + } + else if (mod_size <= 320) + { + current_gas_cost = OpcodesGasCost{ + 1000, + 2000, + }; + } + else if (mod_size <= 384) + { + current_gas_cost = OpcodesGasCost{ + 1000, + 3000, + }; + } + else + { + assert(false); + return EVMC_FAILURE; + } + + + return EVMC_SUCCESS; + } + else + return EVMC_FAILURE; +} + +[[nodiscard]] evmc_status_code EVMMAXState::loadx( + int64_t& gas_left, uint8_t* out_ptr, size_t val_idx, size_t num_vals) noexcept +{ + if (!is_activated()) + return EVMC_FAILURE; + + if ((gas_left -= current_gas_cost.calc_mul_gas_cost(static_cast(num_vals))) < 0) + return EVMC_OUT_OF_GAS; + + return active_mod->loadx(out_ptr, val_idx, num_vals) ? EVMC_SUCCESS : EVMC_FAILURE; +} + +[[nodiscard]] evmc_status_code EVMMAXState::storex( + int64_t& gas_left, const uint8_t* in_ptr, size_t dst_val_idx, size_t num_vals) noexcept +{ + if (!is_activated()) + return EVMC_FAILURE; + + if ((gas_left -= current_gas_cost.calc_mul_gas_cost(static_cast(num_vals))) < 0) + return EVMC_OUT_OF_GAS; + + return active_mod->storex(in_ptr, dst_val_idx, num_vals) ? EVMC_SUCCESS : EVMC_FAILURE; +} + +[[nodiscard]] evmc_status_code EVMMAXState::addmodx(int64_t& gas_left, size_t dst_idx, + size_t dst_stride, size_t x_idx, size_t x_stride, size_t y_idx, size_t y_stride, + size_t count) noexcept +{ + if (!is_activated()) + return EVMC_FAILURE; + + if ((gas_left -= current_gas_cost.calc_add_gas_cost(static_cast(count))) < 0) + return EVMC_OUT_OF_GAS; + + return active_mod->addmodx(dst_idx, dst_stride, x_idx, x_stride, y_idx, y_stride, count) ? + EVMC_SUCCESS : + EVMC_FAILURE; +} + +[[nodiscard]] evmc_status_code EVMMAXState::submodx(int64_t& gas_left, size_t dst_idx, + size_t dst_stride, size_t x_idx, size_t x_stride, size_t y_idx, size_t y_stride, + size_t count) noexcept +{ + if (!is_activated()) + return EVMC_FAILURE; + + if ((gas_left -= current_gas_cost.calc_add_gas_cost(static_cast(count))) < 0) + return EVMC_OUT_OF_GAS; + + return active_mod->submodx(dst_idx, dst_stride, x_idx, x_stride, y_idx, y_stride, count) ? + EVMC_SUCCESS : + EVMC_FAILURE; +} + +[[nodiscard]] evmc_status_code EVMMAXState::mulmodx(int64_t& gas_left, size_t dst_idx, + size_t dst_stride, size_t x_idx, size_t x_stride, size_t y_idx, size_t y_stride, + size_t count) noexcept +{ + if (!is_activated()) + return EVMC_FAILURE; + + if ((gas_left -= current_gas_cost.calc_mul_gas_cost(static_cast(count))) < 0) + return EVMC_OUT_OF_GAS; + + return active_mod->mulmodx(dst_idx, dst_stride, x_idx, x_stride, y_idx, y_stride, count) ? + EVMC_SUCCESS : + EVMC_FAILURE; +} + +[[nodiscard]] size_t EVMMAXState::active_mod_value_size() const noexcept +{ + if (!is_activated()) + return 0; + + return active_mod->value_size(); +} + +void EVMMAXState::print_state(std::ostream& out) const noexcept +{ + if (!is_activated()) + return; + + active_mod->print(out); +} + +void EVMMAXState::clear() noexcept +{ + active_mod = nullptr; +} + +EVMMAXState& EVMMAXState::operator=(EVMMAXState&&) noexcept = default; +EVMMAXState::EVMMAXState(EVMMAXState&&) noexcept = default; +EVMMAXState::EVMMAXState() noexcept = default; +EVMMAXState::~EVMMAXState() = default; + +} // namespace evmmax diff --git a/lib/evmmax/fastmod.h b/lib/evmmax/fastmod.h new file mode 100644 index 0000000000..e8383a39d8 --- /dev/null +++ b/lib/evmmax/fastmod.h @@ -0,0 +1,354 @@ +#ifndef FASTMOD_H +#define FASTMOD_H + +#ifndef __cplusplus +#include +#include +#else +#include +#endif + +#ifndef __cplusplus +#define FASTMOD_API static inline +#else +// In C++ we mark all the functions inline. +// If C++14 relaxed constexpr is supported we use constexpr so functions +// can be used at compile-time. +#if __cpp_constexpr >= 201304 && !defined(_MSC_VER) +// visual studio does not like constexpr +#define FASTMOD_API constexpr +#define FASTMOD_CONSTEXPR constexpr +#else +#define FASTMOD_API inline +#define FASTMOD_CONSTEXPR +#endif +#endif + +#ifdef _MSC_VER +#include +#endif + +#ifdef __cplusplus +namespace fastmod +{ +#endif + +#ifdef _MSC_VER + +// __umulh is only available on x64, ARM64 mode under Visual Studio: don't compile in +// 32-bit mode! +FASTMOD_API uint64_t mul128_u32(uint64_t lowbits, uint32_t d) +{ + return __umulh(lowbits, d); +} +FASTMOD_API uint64_t mul128_from_u64(uint64_t lowbits, uint64_t d) +{ + return __umulh(lowbits, d); +} +FASTMOD_API uint64_t mul128_s32(uint64_t lowbits, int32_t d) +{ + if (d < 0) + { + return mul128_from_u64(lowbits, (int64_t)d) - lowbits; + } + return mul128_u32(lowbits, d); +} + +// Need _udiv128 to calculate the magic number (maps to x86 64-bit div) +#if defined(_M_AMD64) && (_MSC_VER >= 1923) +// This is for the 64-bit functions. +// Visual Studio lacks support for 128-bit integers so they simulated are using +// multiword arithmatic and VS specific intrinsics. + +FASTMOD_API uint64_t add128_u64(uint64_t M_hi, uint64_t M_lo, uint64_t addend, uint64_t* sum_hi) +{ + uint64_t sum_lo; + + bool carry = _addcarry_u64(0, M_lo, addend, &sum_lo); + _addcarry_u64(carry, M_hi, 0, sum_hi); // Encourages 'adc' + + return sum_lo; +} + +FASTMOD_API uint64_t div128_u64( + uint64_t dividend_hi, uint64_t dividend_lo, uint64_t divisor, uint64_t* quotient_hi) +{ + *quotient_hi = dividend_hi / divisor; + uint64_t remainder_hi = dividend_hi % divisor; + + // When long div starts to consider the low dividend, + // the high part would have became its remainder. + // Prevents an arithmetic exception when _udiv128 calculates a >64-bit quotient + uint64_t remainder; // Discard + return _udiv128(remainder_hi, dividend_lo, divisor, &remainder); +} + +// Multiplies the 128-bit integer by d and returns the lower 128-bits of the product +FASTMOD_API uint64_t mul128_u64_lo(uint64_t M_hi, uint64_t M_lo, uint64_t d, uint64_t* product_hi) +{ + uint64_t lowbits_hi; + uint64_t lowbits_lo = _umul128(M_lo, d, &lowbits_hi); + + *product_hi = lowbits_hi + (M_hi * d); + + return lowbits_lo; +} + +// Multiplies the 128-bit integer by d and returns the highest 64-bits of the product +FASTMOD_API uint64_t mul128_u64_hi(uint64_t lowbits_hi, uint64_t lowbits_lo, uint64_t d) +{ + uint64_t bottomHalf_hi = __umulh(lowbits_lo, d); + + uint64_t topHalf_hi; + uint64_t topHalf_lo = _umul128(lowbits_hi, d, &topHalf_hi); + + uint64_t bothHalves_hi; + add128_u64(topHalf_hi, topHalf_lo, bottomHalf_hi, &bothHalves_hi); + + return bothHalves_hi; +} + +FASTMOD_API bool isgreater_u128(uint64_t a_hi, uint64_t a_low, uint64_t b_hi, uint64_t b_low) +{ + // Only when low is greater, high equality should return true + uint64_t discard; + bool borrowWhenEql = _subborrow_u64(0, b_low, a_low, &discard); + + // borrow(b - (a + C_in)) = C_in? (a >= b) : (a > b) + return _subborrow_u64(borrowWhenEql, b_hi, a_hi, &discard); +} + +#endif // End MSVC 64-bit support +#else // _MSC_VER NOT defined + +FASTMOD_API uint64_t mul128_u32(uint64_t lowbits, uint32_t d) +{ + return ((__uint128_t)lowbits * d) >> 64; +} +FASTMOD_API uint64_t mul128_from_u64(uint64_t lowbits, uint64_t d) +{ + return ((__uint128_t)lowbits * d) >> 64; +} +FASTMOD_API uint64_t mul128_s32(uint64_t lowbits, int32_t d) +{ + if (d < 0) + { + return mul128_from_u64(lowbits, (int64_t)d) - lowbits; + } + return mul128_u32(lowbits, d); +} + +// This is for the 64-bit functions. +FASTMOD_API uint64_t mul128_u64(__uint128_t lowbits, uint64_t d) +{ + __uint128_t bottom_half = (lowbits & UINT64_C(0xFFFFFFFFFFFFFFFF)) * d; // Won't overflow + bottom_half >>= 64; // Only need the top 64 bits, as we'll shift the lower half away; + __uint128_t top_half = (lowbits >> 64) * d; + __uint128_t both_halves = bottom_half + top_half; // Both halves are already shifted down by 64 + both_halves >>= 64; // Get top half of both_halves + return (uint64_t)both_halves; +} + +#endif // _MSC_VER + +/** + * Unsigned integers. + * Usage: + * uint32_t d = ... ; // divisor, should be non-zero + * uint64_t M = computeM_u32(d); // do once + * fastmod_u32(a,M,d) is a % d for all 32-bit a. + * + **/ + +// M = ceil( (1<<64) / d ), d > 0 +FASTMOD_API uint64_t computeM_u32(uint32_t d) +{ + return UINT64_C(0xFFFFFFFFFFFFFFFF) / d + 1; +} + +// fastmod computes (a % d) given precomputed M +FASTMOD_API uint32_t fastmod_u32(uint32_t a, uint64_t M, uint32_t d) +{ + uint64_t lowbits = M * a; + return (uint32_t)(mul128_u32(lowbits, d)); +} + +// fastdiv computes (a / d) given precomputed M for d>1 +FASTMOD_API uint32_t fastdiv_u32(uint32_t a, uint64_t M) +{ + return (uint32_t)(mul128_u32(M, a)); +} + +// given precomputed M, is_divisible checks whether n % d == 0 +FASTMOD_API bool is_divisible(uint32_t n, uint64_t M) +{ + return n * M <= M - 1; +} + +/** + * signed integers + * Usage: + * int32_t d = ... ; // should be non-zero and between [-2147483647,2147483647] + * int32_t positive_d = d < 0 ? -d : d; // absolute value + * uint64_t M = computeM_s32(d); // do once + * fastmod_s32(a,M,positive_d) is a % d for all 32-bit a. + **/ + +// M = floor( (1<<64) / d ) + 1 +// you must have that d is different from 0 and -2147483648 +// if d = -1 and a = -2147483648, the result is undefined +FASTMOD_API uint64_t computeM_s32(int32_t d) +{ + if (d < 0) + d = -d; + return UINT64_C(0xFFFFFFFFFFFFFFFF) / d + 1 + ((d & (d - 1)) == 0 ? 1 : 0); +} + +// fastmod computes (a % d) given precomputed M, +// you should pass the absolute value of d +FASTMOD_API int32_t fastmod_s32(int32_t a, uint64_t M, int32_t positive_d) +{ + uint64_t lowbits = M * a; + int32_t highbits = (int32_t)mul128_u32(lowbits, positive_d); + return highbits - ((positive_d - 1) & (a >> 31)); +} + +// fastdiv computes (a / d) given a precomputed M, assumes that d must not +// be one of -1, 1, or -2147483648 +FASTMOD_API int32_t fastdiv_s32(int32_t a, uint64_t M, int32_t d) +{ + uint64_t highbits = mul128_s32(M, a); + highbits += (a < 0 ? 1 : 0); + if (d < 0) + return -(int32_t)(highbits); + return (int32_t)(highbits); +} + +// What follows is the 64-bit functions. +// They may not be faster than what the compiler can produce. + +#ifndef _MSC_VER +// No __uint128_t in VS, so they have to use a diffrent method. + +FASTMOD_API __uint128_t computeM_u64(uint64_t d) +{ + // what follows is just ((__uint128_t)0 - 1) / d) + 1 spelled out + __uint128_t M = UINT64_C(0xFFFFFFFFFFFFFFFF); + M <<= 64; + M |= UINT64_C(0xFFFFFFFFFFFFFFFF); + M /= d; + M += 1; + return M; +} + +FASTMOD_API uint64_t fastmod_u64(uint64_t a, __uint128_t M, uint64_t d) +{ + __uint128_t lowbits = M * a; + return mul128_u64(lowbits, d); +} + +FASTMOD_API uint64_t fastdiv_u64(uint64_t a, __uint128_t M) +{ + return mul128_u64(M, a); +} + +// given precomputed M, is_divisible checks whether n % d == 0 +FASTMOD_API bool is_divisible_u64(uint64_t n, __uint128_t M) +{ + return n * M <= M - 1; +} + +#elif defined(_MSC_VER) && defined(_M_AMD64) && (_MSC_VER >= 1923) +// Visual Studio lacks support for 128-bit integers +// so they simulated are using multiword arithmatic +// and VS specific intrinsics. + +// Using a struct in the multiword arithmetic functions produces +// worse asm output but isn't that bad for public functions + +typedef struct +{ + uint64_t low; + uint64_t hi; +} fastmod_u128_t; + +FASTMOD_API fastmod_u128_t computeM_u64(uint64_t d) +{ + // UINT128MAX / d + uint64_t magic_quotient_hi; + uint64_t magic_quotient_lo = div128_u64(~UINT64_C(0), ~UINT64_C(0), d, &magic_quotient_hi); + + // quotient_u128 + 1 + fastmod_u128_t M; + M.low = add128_u64(magic_quotient_hi, magic_quotient_lo, 1, &M.hi); + return M; +} + +// computes (a % d) given precomputed M +FASTMOD_API uint64_t fastmod_u64(uint64_t a, fastmod_u128_t M, uint64_t d) +{ + uint64_t lowbits_hi; + uint64_t lowbits_lo = mul128_u64_lo(M.hi, M.low, a, &lowbits_hi); + + return mul128_u64_hi(lowbits_hi, lowbits_lo, d); +} + +// computes (a / d) given precomputed M for d>1 +FASTMOD_API uint64_t fastdiv_u64(uint64_t a, fastmod_u128_t M) +{ + return mul128_u64_hi(M.hi, M.low, a); +} + +// given precomputed M, is_divisible checks whether n % d == 0 +FASTMOD_API bool is_divisible_u64(uint64_t n, fastmod_u128_t M) +{ + uint64_t lowBits_hi; + uint64_t lowBits_low = mul128_u64_lo(M.hi, M.low, n, &lowBits_hi); + + uint64_t Mdec_low, Mdec_hi; + bool borrow_hi = _subborrow_u64(0, M.low, 1, &Mdec_low); + _subborrow_u64(borrow_hi, M.hi, 0, &Mdec_hi); + + // n * M <= M - 1 + return !isgreater_u128(lowBits_hi, lowBits_low, Mdec_hi, Mdec_low); +} + + +// End of the 64-bit functions + +#endif // #ifndef _MSC_VER + +#ifdef __cplusplus + +template +FASTMOD_API uint32_t fastmod(uint32_t x) +{ + FASTMOD_CONSTEXPR uint64_t v = computeM_u32(d); + return fastmod_u32(x, v, d); +} +template +FASTMOD_API uint32_t fastdiv(uint32_t x) +{ + FASTMOD_CONSTEXPR uint64_t v = computeM_u32(d); + return fastdiv_u32(x, v); +} +template +FASTMOD_API int32_t fastmod(int32_t x) +{ + FASTMOD_CONSTEXPR uint64_t v = computeM_s32(d); + return fastmod_s32(x, v, d); +} +template +FASTMOD_API int32_t fastdiv(int32_t x) +{ + FASTMOD_CONSTEXPR uint64_t v = computeM_s32(d); + return fastdiv_s32(x, v, d); +} + +} // fastmod +#endif + +#undef FASTMOD_API +#undef FASTMOD_CONSTEXPR + +#endif // FASTMOD_H diff --git a/lib/evmone/CMakeLists.txt b/lib/evmone/CMakeLists.txt index c4fa519091..a5773f0814 100644 --- a/lib/evmone/CMakeLists.txt +++ b/lib/evmone/CMakeLists.txt @@ -33,7 +33,7 @@ add_library(evmone vm.hpp ) target_compile_features(evmone PUBLIC cxx_std_20) -target_link_libraries(evmone PUBLIC evmc::evmc intx::intx PRIVATE ethash::keccak) +target_link_libraries(evmone PUBLIC evmc::evmc intx::intx evmmax PRIVATE ethash::keccak) target_include_directories(evmone PUBLIC $$ ) @@ -48,7 +48,7 @@ if(CABLE_COMPILER_GNULIKE) target_compile_options( evmone PRIVATE -fno-exceptions - $<$:-Wstack-usage=2900> + $<$:-Wstack-usage=2950> ) if(NOT SANITIZE MATCHES undefined) # RTTI can be disabled except for UBSan which checks vptr integrity. diff --git a/lib/evmone/advanced_instructions.cpp b/lib/evmone/advanced_instructions.cpp index e21f0885cc..de77332ee7 100644 --- a/lib/evmone/advanced_instructions.cpp +++ b/lib/evmone/advanced_instructions.cpp @@ -97,6 +97,15 @@ inline code_iterator impl(AdvancedExecutionState& state, code_iterator pos) noex state.adjust_stack_size(instr::traits[Op].stack_height_change); return new_pos; } + +template > +inline code_iterator impl(AdvancedExecutionState& state, code_iterator pos) noexcept +{ + const auto new_pos = CoreFn(state.stack, state, pos, state.gas_left); + state.adjust_stack_size(instr::traits[Op].stack_height_change); + return new_pos; +} /// @} } // namespace instr @@ -315,6 +324,13 @@ constexpr std::array instruction_implementations = []( table[OP_EOFCREATE] = op_undefined; table[OP_RETURNCONTRACT] = op_undefined; + table[OP_SETUPX] = op_undefined; + table[OP_LOADX] = op_undefined; + table[OP_STOREX] = op_undefined; + table[OP_ADDMODX] = op_undefined; + table[OP_SUBMODX] = op_undefined; + table[OP_MULMODX] = op_undefined; + return table; }(); } // namespace diff --git a/lib/evmone/baseline_execution.cpp b/lib/evmone/baseline_execution.cpp index a89878f639..104da74a42 100644 --- a/lib/evmone/baseline_execution.cpp +++ b/lib/evmone/baseline_execution.cpp @@ -135,6 +135,13 @@ struct Position return instr_fn(pos.stack_top, pos.code_it); } +[[release_inline]] inline code_iterator invoke( + code_iterator (*instr_fn)(StackTop, ExecutionState&, code_iterator, int64_t&) noexcept, + Position pos, int64_t& gas, ExecutionState& state) noexcept +{ + return instr_fn(pos.stack_top, state, pos.code_it, gas); +} + [[release_inline]] inline code_iterator invoke( TermResult (*instr_fn)(StackTop, int64_t, ExecutionState&) noexcept, Position pos, int64_t& gas, ExecutionState& state) noexcept diff --git a/lib/evmone/execution_state.hpp b/lib/evmone/execution_state.hpp index 1462fe858b..038fd30436 100644 --- a/lib/evmone/execution_state.hpp +++ b/lib/evmone/execution_state.hpp @@ -4,6 +4,7 @@ #pragma once #include +#include #include #include #include @@ -170,6 +171,8 @@ class ExecutionState /// Container to be deployed returned from RETURNCONTRACT, used only inside EOFCREATE execution. std::optional deploy_container; + evmmax::EVMMAXState evmmax_state; + private: evmc_tx_context m_tx = {}; @@ -215,6 +218,7 @@ class ExecutionState deploy_container = {}; m_tx = {}; call_stack = {}; + evmmax_state.clear(); } [[nodiscard]] bool in_static_mode() const { return (msg->flags & EVMC_STATIC) != 0; } diff --git a/lib/evmone/instructions.hpp b/lib/evmone/instructions.hpp index 84f5e09a3a..cb48cf18ad 100644 --- a/lib/evmone/instructions.hpp +++ b/lib/evmone/instructions.hpp @@ -1220,6 +1220,150 @@ inline TermResult selfdestruct(StackTop stack, int64_t gas_left, ExecutionState& return {EVMC_SUCCESS, gas_left}; } +/// EVMMAX instructions +namespace +{ +// TODO: Use it in `grom_memory` function +[[nodiscard]] inline int64_t evm_memory_expansion_cost( + const Memory& memory, uint64_t new_size) noexcept +{ + const auto new_words = num_words(new_size); + const auto current_words = static_cast(memory.size() / word_size); + const auto new_cost = 3 * new_words + new_words * new_words / 512; + const auto current_cost = 3 * current_words + current_words * current_words / 512; + return new_cost - current_cost; +} +} // namespace + +inline Result setmodx(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept +{ + static constexpr auto MAX_MOD_SIZE = 4096; + + const auto mod_offset_256 = stack.pop(); + const auto mod_size_256 = stack.pop(); + const auto mod_size_bytes = (mod_size_256 + 7) / 8; + const auto vals_used_256 = stack.pop(); + + if (!check_memory(gas_left, state.memory, mod_offset_256, mod_size_bytes)) + return {EVMC_OUT_OF_GAS, gas_left}; + + // Maximum allowed modulus size + if (mod_size_bytes > MAX_MOD_SIZE / 8) + return {EVMC_FAILURE, gas_left}; + + const auto mod_ptr = &state.memory[static_cast(mod_offset_256)]; + const auto mod_size = static_cast(mod_size_256); + + // Modulus must be odd + if (mod_ptr[static_cast(mod_size_bytes) - 1] % 2 == 0) + return {EVMC_FAILURE, gas_left}; + + const auto vals_used = static_cast(vals_used_256); + // max number of value slots is 256 + if (vals_used_256 > 256) + return {EVMC_FAILURE, gas_left}; + + const auto value_size_multiplier = (mod_size + 7) / (8 * 8); + if ((gas_left -= evm_memory_expansion_cost( + state.memory, (vals_used * value_size_multiplier * 8 + 31) / 32)) < 0) + { + return {EVMC_OUT_OF_GAS, gas_left}; + } + + const auto status = state.evmmax_state.setmodx(gas_left, mod_ptr, mod_size, vals_used); + return {status, gas_left}; +} + +inline Result loadx(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept +{ + const auto dst_offset = stack.pop(); + const auto val_idx = stack.pop(); + const auto num_vals = stack.pop(); + + if (!check_memory(gas_left, state.memory, dst_offset, + num_vals * state.evmmax_state.active_mod_value_size())) + return {EVMC_OUT_OF_GAS, gas_left}; + + const auto status = + state.evmmax_state.loadx(gas_left, &state.memory[static_cast(dst_offset)], + static_cast(val_idx), static_cast(num_vals)); + + return {status, gas_left}; +} + +inline Result storex(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept +{ + const auto dst_val = stack.pop(); + const auto offset = stack.pop(); + const auto num_vals = stack.pop(); + + if (!check_memory( + gas_left, state.memory, offset, num_vals * state.evmmax_state.active_mod_value_size())) + return {EVMC_OUT_OF_GAS, gas_left}; + + const auto status = + state.evmmax_state.storex(gas_left, &state.memory[static_cast(offset)], + static_cast(dst_val), static_cast(num_vals)); + + return {status, gas_left}; +} + +inline code_iterator addmodx( + StackTop /*stack*/, ExecutionState& state, code_iterator pos, int64_t& gas_left) noexcept +{ + const auto dst_idx = pos[1]; + const auto dst_stride = pos[2]; + const auto x_idx = pos[3]; + const auto x_stride = pos[4]; + const auto y_idx = pos[5]; + const auto y_stride = pos[6]; + const auto count = pos[7]; + + state.status = state.evmmax_state.addmodx( + gas_left, dst_idx, dst_stride, x_idx, x_stride, y_idx, y_stride, count); + if (state.status == EVMC_SUCCESS) + return pos + 8; + else + return nullptr; +} + +inline code_iterator submodx( + StackTop /*stack*/, ExecutionState& state, code_iterator pos, int64_t& gas_left) noexcept +{ + const auto dst_idx = pos[1]; + const auto dst_stride = pos[2]; + const auto x_idx = pos[3]; + const auto x_stride = pos[4]; + const auto y_idx = pos[5]; + const auto y_stride = pos[6]; + const auto count = pos[7]; + + state.status = state.evmmax_state.submodx( + gas_left, dst_idx, dst_stride, x_idx, x_stride, y_idx, y_stride, count); + if (state.status == EVMC_SUCCESS) + return pos + 8; + else + return nullptr; +} + +inline code_iterator mulmodx( + StackTop /*stack*/, ExecutionState& state, code_iterator pos, int64_t& gas_left) noexcept +{ + const auto dst_idx = pos[1]; + const auto dst_stride = pos[2]; + const auto x_idx = pos[3]; + const auto x_stride = pos[4]; + const auto y_idx = pos[5]; + const auto y_stride = pos[6]; + const auto count = pos[7]; + + state.status = state.evmmax_state.mulmodx( + gas_left, dst_idx, dst_stride, x_idx, x_stride, y_idx, y_stride, count); + if (state.status == EVMC_SUCCESS) + return pos + 8; + else + return nullptr; +} /// Maps an opcode to the instruction implementation. /// diff --git a/lib/evmone/instructions_opcodes.hpp b/lib/evmone/instructions_opcodes.hpp index 6f021f4bd5..5e6e322b4e 100644 --- a/lib/evmone/instructions_opcodes.hpp +++ b/lib/evmone/instructions_opcodes.hpp @@ -159,6 +159,13 @@ enum Opcode : uint8_t OP_LOG3 = 0xa3, OP_LOG4 = 0xa4, + OP_SETUPX = 0xc0, + OP_LOADX = 0xc1, + OP_STOREX = 0xc2, + OP_ADDMODX = 0xc3, + OP_SUBMODX = 0xc4, + OP_MULMODX = 0xc5, + OP_DATALOAD = 0xd0, OP_DATALOADN = 0xd1, OP_DATASIZE = 0xd2, diff --git a/lib/evmone/instructions_traits.hpp b/lib/evmone/instructions_traits.hpp index 9f774089ed..937eb99901 100644 --- a/lib/evmone/instructions_traits.hpp +++ b/lib/evmone/instructions_traits.hpp @@ -18,6 +18,7 @@ inline constexpr auto cold_sload_cost = 2100; inline constexpr auto cold_account_access_cost = 2600; inline constexpr auto warm_storage_read_cost = 100; +constexpr auto EVMC_EVMMAX = EVMC_EXPERIMENTAL; /// Additional cold account access cost. /// /// The warm access cost is unconditionally applied for every account access instruction. @@ -195,6 +196,16 @@ constexpr inline GasCostTable gas_costs = []() noexcept { table[EVMC_EXPERIMENTAL] = table[EVMC_OSAKA]; + for (auto op = size_t{OP_PUSH1}; op <= OP_PUSH32; ++op) + table[EVMC_EXPERIMENTAL][op] = 1; + + table[EVMC_EVMMAX][OP_SETUPX] = 1; + table[EVMC_EVMMAX][OP_ADDMODX] = 0; + table[EVMC_EVMMAX][OP_SUBMODX] = 0; + table[EVMC_EVMMAX][OP_MULMODX] = 0; + table[EVMC_EVMMAX][OP_LOADX] = 1; + table[EVMC_EVMMAX][OP_STOREX] = 1; + return table; }(); @@ -405,6 +416,13 @@ constexpr inline std::array traits = []() noexcept { table[OP_LOG3] = {"LOG3", 0, false, 5, -5, EVMC_FRONTIER, REV_EOF1}; table[OP_LOG4] = {"LOG4", 0, false, 6, -6, EVMC_FRONTIER, REV_EOF1}; + table[OP_SETUPX] = {"SETUPX", 0, false, 3, -3, EVMC_EVMMAX, EVMC_EVMMAX}; + table[OP_ADDMODX] = {"ADDMODX", 7, false, 0, 0, EVMC_EVMMAX, EVMC_EVMMAX}; + table[OP_SUBMODX] = {"SUBMODX", 7, false, 0, 0, EVMC_EVMMAX, EVMC_EVMMAX}; + table[OP_MULMODX] = {"MULMODX", 7, false, 0, 0, EVMC_EVMMAX, EVMC_EVMMAX}; + table[OP_LOADX] = {"LOADX", 0, false, 3, -3, EVMC_EVMMAX, EVMC_EVMMAX}; + table[OP_STOREX] = {"STOREX", 0, false, 3, -3, EVMC_EVMMAX, EVMC_EVMMAX}; + table[OP_DUPN] = {"DUPN", 1, false, 0, 1, {}, REV_EOF1}; table[OP_SWAPN] = {"SWAPN", 1, false, 0, 0, {}, REV_EOF1}; table[OP_EXCHANGE] = {"EXCHANGE", 1, false, 0, 0, {}, REV_EOF1}; diff --git a/lib/evmone/instructions_xmacro.hpp b/lib/evmone/instructions_xmacro.hpp index 2897952db4..a794aff336 100644 --- a/lib/evmone/instructions_xmacro.hpp +++ b/lib/evmone/instructions_xmacro.hpp @@ -236,12 +236,12 @@ ON_OPCODE_UNDEFINED(0xbe) \ ON_OPCODE_UNDEFINED(0xbf) \ \ - ON_OPCODE_UNDEFINED(0xc0) \ - ON_OPCODE_UNDEFINED(0xc1) \ - ON_OPCODE_UNDEFINED(0xc2) \ - ON_OPCODE_UNDEFINED(0xc3) \ - ON_OPCODE_UNDEFINED(0xc4) \ - ON_OPCODE_UNDEFINED(0xc5) \ + ON_OPCODE_IDENTIFIER(OP_SETUPX, setmodx) \ + ON_OPCODE_IDENTIFIER(OP_LOADX, loadx) \ + ON_OPCODE_IDENTIFIER(OP_STOREX, storex) \ + ON_OPCODE_IDENTIFIER(OP_ADDMODX, addmodx) \ + ON_OPCODE_IDENTIFIER(OP_SUBMODX, submodx) \ + ON_OPCODE_IDENTIFIER(OP_MULMODX, mulmodx) \ ON_OPCODE_UNDEFINED(0xc6) \ ON_OPCODE_UNDEFINED(0xc7) \ ON_OPCODE_UNDEFINED(0xc8) \ diff --git a/lib/evmone/tracing.cpp b/lib/evmone/tracing.cpp index fdad141736..fb71d2b998 100644 --- a/lib/evmone/tracing.cpp +++ b/lib/evmone/tracing.cpp @@ -124,6 +124,13 @@ class InstructionTracer : public Tracer m_out << R"(,"refund":)" << std::dec << state.gas_refund; m_out << R"(,"opName":")" << get_name(opcode) << '"'; + // if (state.evmmax_state.is_activated()) + // { + // m_out << R"(,"evmmax":")" << std::endl; + // m_out << ""; + // state.evmmax_state.print_state(m_out); + // } + m_out << "}\n"; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4c9e71e230..467373a6f5 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -20,6 +20,7 @@ add_subdirectory(utils) add_subdirectory(bench) add_subdirectory(blockchaintest) add_subdirectory(eofparse) +add_subdirectory(evmmax-precompiles) add_subdirectory(experimental) add_subdirectory(integration) add_subdirectory(internal_benchmarks) diff --git a/test/bench/helpers.hpp b/test/bench/helpers.hpp index a9083afd75..8f07342b38 100644 --- a/test/bench/helpers.hpp +++ b/test/bench/helpers.hpp @@ -17,7 +17,7 @@ namespace evmone::test { extern std::map registered_vms; -constexpr auto default_revision = EVMC_ISTANBUL; +constexpr auto default_revision = EVMC_EXPERIMENTAL; constexpr auto default_gas_limit = std::numeric_limits::max(); diff --git a/test/evmmax-precompiles/CMakeLists.txt b/test/evmmax-precompiles/CMakeLists.txt new file mode 100644 index 0000000000..cce08f0b72 --- /dev/null +++ b/test/evmmax-precompiles/CMakeLists.txt @@ -0,0 +1,15 @@ +# evmone: Fast Ethereum Virtual Machine implementation +# Copyright 2020 The evmone Authors. +# SPDX-License-Identifier: Apache-2.0 + +add_library(evmone-evmmax-precompiles STATIC) +add_library(evmone::evmone-evmmax-precompiles ALIAS evmone-evmmax-precompiles) +target_link_libraries(evmone-evmmax-precompiles PRIVATE evmone testutils) +target_include_directories(evmone-evmmax-precompiles PRIVATE ${evmone_private_include_dir}) +target_sources( + evmone-evmmax-precompiles PRIVATE + ntt.hpp + ntt.cpp + poseidon.hpp + poseidon.cpp +) diff --git a/test/evmmax-precompiles/evmmax-addmodx-bench-single.json b/test/evmmax-precompiles/evmmax-addmodx-bench-single.json new file mode 100644 index 0000000000..e860b95d39 --- /dev/null +++ b/test/evmmax-precompiles/evmmax-addmodx-bench-single.json @@ -0,0 +1,73 @@ +{ + "addmodx-bench-single" : { + "_info" : { + "comment" : "", + "filling-rpc-server" : "evm version 1.10.25-stable-69568c55", + "filling-tool-version" : "retesteth-0.2.2-testinfo+commit.766b4629.Linux.g++", + "generatedTestHash" : "682d204267cf3a3909bf22c063f2c9cde06a917d56f3666bad7ff4c724b3676b", + "labels" : { + "0" : "empty" + }, + "lllcversion" : "Error getting LLLC Version", + "solidity" : "Error getting solc Version", + "source" : "tmp/micro/jump_aroundFiller.yml", + "sourceHash" : "cadfd8a7ee22cbefac3a420cc4c762ca1a3a38ae3346407bd31694acff16c78e" + }, + "env" : { + "currentBaseFee" : "0x01", + "currentCoinbase" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "0x01", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x01", + "currentRandom" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "currentTimestamp" : "0x61a8d289", + "previousHash" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "post" : { + "Experimental" : [ + { + "hash" : "0x51a20eb8dbdec5af48eeecca9e38acb6006fe28733f8649500092464fe6a6364", + "indexes" : { + "data" : 0, + "gas" : 0, + "value" : 0 + }, + "logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "txbytes" : "0xf8618001843b9aca0094be7c43a58000000000000000000000000000000180801ca0999ee855b1d5325fe79efbc40ad560f9ebabbbb97e72e1a4e9cf7e4b8ba34765a06392df208ed06b901f2997995c138bfa06ae8b1a26c15e8aff52cad68f913e85" + } + ] + }, + "pre" : { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x3b9aca00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "0xbe7c43a580000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "ef00010100040200015e3704000000008000037f00000000000000000000000000000000000000000000000000000000000000306000537f0000000000000000000000000000000000000000000000000000000000003001600153610100600e6000c060e86000536013600153600160006000c2c3010100000101fec39e002600af0001c3c5007200440001c3bc006d00780001c3500066002f0001c366008f008e0001c34f00a000340001c303007c00720001c320004600120001c3bd007b00740001c3be00f700380001c311009d00e60001c303008b004f0001c3cc004200160001c3a700d0008d0001c39b007d009e0001c3100036009d0001c338003500760001c33100a300230001c3540074001e0001c3c1001600d30001c318005900fb0001c3df002a007b0001c3e4002b000d0001c3d300a000b20001c30f009a00e90001c37e00c8000e0001c31e001300ea0001c36a002000b90001c30f006800060001c3e400b700ad0001c37d00ca00b10001c383001000a20001c39e009f00d80001c3390047008f0001c37a008f00700001c35700bd00900001c3ef00ec005f0001c3b4001e00620001c3e800d600350001c3c5008700520001c327009400cd0001c3e4005300eb0001c3b500a200d90001c328006100340001c34300ab005a0001c3d900c900380001c35000ba00350001c30c004c008c0001c3d700c700aa0001c379002f000d0001c300002700900001c308000400500001c3be00d8007b0001c3920008009b0001c3b7006d00e10001c3c2002e00130001c3ce00bd00a30001c3d5002200460001c3b9002700ee0001c357002800e80001c37a0027002f0001c33c002e00be0001c3d000fa00d10001c3ad009100b40001c3b4002c00430001c3ce004500c00001c3db007300440001c365005700b40001c34c00da004a0001c3bb00c600250001c38c005f007a0001c32400d500ac0001c3c400c3000a0001c3cb007d007e0001c348000400400001c3ba003300790001c3ca0050001d0001c34f00f500bd0001c38e004b00ee0001c3ef00e600cd0001c30000e7003f0001c3d9006500d00001c3cc006000270001c380007b00e30001c37e0027003f0001c3ce00d800c70001c31d00be002c0001c3a5004f000d0001c313005500de0001c3a500ed00000001c3b90029002c0001c357000300540001c341000f00f10001c3a7004f00b10001c3ef00fb00df0001c3e1005300d10001c3f900d600e40001c3fd00a700a20001c3bc00c500a50001c38d00f800130001c31900ce004b0001c318008c005a0001c3e200ad00c30001c38a00e300470001c3f8007e004d0001c3c4002600900001c3db000c00440001c33800dc009d0001c3c100d400420001c39e0072003f0001c384008b00300001c35a00a900f50001c3fa00a200410001c3460078009c0001c370002600b40001c3f100be00750001c39e004a009e0001c37d00ae00d00001c3b1001e009f0001c382008000480001c37f009400d60001c3b10048004a0001c34b005d006c0001c321008a00fa0001c3ad003100600001c3aa000e00ed0001c3e4001c00660001c382001e006f0001c3a0006700d70001c3fa00b700cb0001c3cb0092000a0001c35e009b00b80001c3d400b800040001c3d9009500470001c378006d00670001c3190000001c0001c332004c00900001c3ad00f600950001c3e1008800830001c30900f900350001c3f6006000f90001c341001700d80001c37d0026009c0001c360004100870001c35800ef00fe0001c34e006e00050001c32f003f002b0001c30200fd005a0001c3ea007800610001c3d300b400c90001c3050044004e0001c3b9006e002f0001c3cb007a007a0001c3c900f500f50001c377002a001a0001c357009500e60001c329000c00710001c302001e008b0001c3320035005f0001c34c00b3006d0001c3be00d600580001c35900d300bf0001c304007d00120001c3d9001e006f0001c3730011002a0001c34f00ad006f0001c37e007400470001c301001c007e0001c31a002d00b40001c355002600300001c3f200a000880001c3da006d003a0001c38e008e00f50001c3740025001a0001c3ce008200f90001c374006100f10001c3c100db00e40001c3b50024008c0001c3460001007d0001c31200a600960001c36f00b8008c0001c357006f00800001c3f50022006b0001c3ea0074005b0001c39c00e2000c0001c332007c008d0001c3b4008000d80001c395001c00ee0001c3a900af00980001c354006200310001c387000300580001c33b005400980001c300003100af0001c3fb00c3006c0001c3e9003c00010001c3a2009000a60001c37f00a500910001c30f00f000110001c3f5005700020001c340000c00690001c3e4007c00180001c35e0022008d0001c38c001d00d00001c3cb007800f90001c3aa009d00ce0001c308007100ad0001c3dd00f100770001c36a0011003a0001c34f00b100870001c3f000b6003b0001c3db00ef00bd0001c3fc002200f50001c37d007e00060001c3550068000b0001c3b700c100760001c3b3003b006c0001c36800af00560001c398001d00820001c374002200ab0001c31400ee00110001c3b100d3007c0001c31100ca00640001c3e000fa00160001c3de00c700930001c38d00cb008e0001c377006300170001c3f8001100f60001c3f2005b00f60001c334001a00fa0001c3cd009f00550001c3a600b100760001c35c00b6009a0001c397001700020001c3f1004600800001c34a003b00b80001c3e200aa00c40001c35d00cf00880001c3cc004100370001c31200fe00460001c35d00bf00970001c352008300b80001c3d300ef005f0001c3790065004d0001c3a8007600cf0001c30f0053007e0001c30e007e00c20001c3b0006d007e0001c39700f000bb0001c3b80023007c0001c39900ab00bb0001c3f9001d002f0001c373008300e20001c3aa00e300ac0001c3de008600a90001c30c0075004d0001c3d7001300f00001c3c0008300920001c3d2003b00f20001c3c7000b00370001c325003000040001c3e5003f003c0001c38300b9006f0001c3f60065005a0001c30b00fc009b0001c399000000b20001c352003b000b0001c38a000600aa0001c38f003c00bd0001c3ca009a005d0001c3ee008100b40001c35f001e00d10001c34a0012005d0001c34d000700c40001c3b8005f00460001c3a5006c007e0001c3cf001000980001c315008b00d00001c3ab009e00320001c38500ba00a90001c35d004500c90001c3e600f900c70001c3e6001900a00001c33a00fc00b70001c37000d600030001c36700d700870001c341001500750001c369007000a30001c33000fc00650001c309003c000a0001c3f3005200120001c36700f900820001c3f200a400370001c3d60076007d0001c3d200d500f00001c34100b800b40001c3c4009700dd0001c39200f900df0001c3b3002a00450001c39400e600160001c37300e900d10001c32a009100320001c39800c300110001c35600fd00070001c30d002c001e0001c3d0001700210001c39c00e6005a0001c3cb004b00540001c35700c900470001c30b00e2004f0001c3db004200bd0001c384000d00860001c3a900e5002b0001c3ec00dc00170001c3980072009e0001c32c00b2001a0001c32000e400b70001c3ea000e00fe0001c347003800520001c3440086000d0001c37c004b008d0001c33a0031000b0001c3a90075004f0001c3fe00f400e70001c30e007900c50001c373009500250001c32b00dd00230001c3880040005a0001c3c4007a00a30001c3df002300750001c3cf003100c90001c36e004c009d0001c3ad008e00a60001c3ab00eb00510001c3b700a800000001c323009000f90001c3e8009f00820001c3cf007700660001c3b3001100750001c3c1009700a80001c31100f100b00001c33000bf00730001c3d8005000c70001c3860072006d0001c341007300a60001c318000a00ad0001c37b00ac008a0001c350004d005f0001c39f005a00c10001c3910022007b0001c3d100dd00c00001c35d00db00690001c342005500fd0001c351005400d10001c3aa00ea00910001c375008f00be0001c336008700150001c326003800310001c3fa00d600b40001c3d400e000270001c39c00e500960001c3f200dd00f50001c318000900a50001c343008700800001c394003900ba0001c3d800da000d0001c36b001d00ca0001c3d500c700260001c38d001500d30001c391000100d10001c38f00d200160001c37000e700250001c333003300fc0001c3650062006f0001c35f008e00ad0001c3f10012006b0001c3b400dc00d50001c31b008a004b0001c3270001002b0001c331009600120001c38600af00350001c3ca00ad007f0001c3a1006500790001c3b700e000c20001c38e001800430001c33a0095001b0001c300001a00cf0001c3ac001200320001c3be00cb00de0001c3d2002b00a00001c35800d9008f0001c3a300fc005b0001c318000100920001c3b200fe003d0001c3cf00b800880001c3e2004c00e00001c322000e00fa0001c32f00c4005c0001c36100e600480001c3f6007900b30001c3da005200720001c35e006c00410001c3ca008600810001c32200ef00360001c342009800590001c39500a200800001c37300f900aa0001c3990088003d0001c38c002100860001c329008a00790001c3fd000100120001c3f500d500d90001c379005200a40001c310009500e70001c3d400d700870001c3cc006600560001c30c004c00940001c35e00b5009f0001c3fa004f001c0001c38f006200a20001c330007600080001c39000ab00710001c3b0000e001e0001c386001500800001c3ec004500c70001c32f00bf00490001c306002b00d00001c3b900b200790001c31a008000c00001c33d00a600fd0001c30d0021000a0001c37400da00580001c34000a400c10001c3cf004800800001c33a00d000640001c3ba001e00a40001c343002f00e50001c30b00f500530001c3f3009b00450001c355002100690001c3d200b300d20001c3fc00e8001c0001c31600d300400001c38f00a000540001c30a006f00810001c33b007600b00001c38000e500a20001c368006e00d90001c3b4009100340001c30f009f00e30001c3790064006f0001c3ce003700af0001c357009e00fa0001c305005f00fa0001c3d900c700440001c3a500c4000a0001c32d008600250001c330004900660001c3f6007000180001c371005500860001c31100eb00780001c36d00a600510001c30e00d600ca0001c3ab005800740001c3a900d3008c0001c39f00be00b20001c3020006000b0001c31400b2003b0001c38e00fd00d80001c3b600a0001d0001c3100013001e0001c37600a200680001c377005100dd0001c36a00e600610001c38f00f800280001c3e900b5003a0001c3ec001a003a0001c35a001100a20001c3c1001400bc0001c39e0087000b0001c31f00bb00950001c3a700d600300001c3ee009f00f10001c34000ed00d40001c3f800ab00430001c38100b300380001c3a90058009b0001c358008300dd0001c3780036006b0001c3b700a600750001c3ec008e007d0001c379004500710001c3be00b5008c0001c33700db00430001c342005200540001c391000400920001c3c8003a000e0001c3d1003900db0001c351008b00780001c328006b005c0001c352001400510001c3af00e6006e0001c3f100e000cd0001c325000300780001c338008600570001c35600ba000d0001c3cd00b600500001c356004c00f70001c336001e00cd0001c375006c00980001c32b00c900bf0001c309000800aa0001c395009100bb0001c33b00c0003f0001c369006700ae0001c38700f1004c0001c35a00c700290001c32900ab00a40001c36400bb00c10001c3bc00d300580001c30e003000c10001c34500de00120001c39b00a9002f0001c3a200b100480001c32500e000760001c3eb006300f00001c3ce00c800fd0001c3d9007800c80001c3c0004900530001c3db00f4001c0001c355009c00d20001c307008400c10001c3b800a100860001c30e001b00620001c30a001d008e0001c3d900f900480001c36d003d00480001c32d0086002f0001c3790025005e0001c3f100c2007c0001c3080046009e0001c31a001c00110001c39b008500700001c34d001a004c0001c3b000e900e50001c3f300e300750001c3a100ec005b0001c307009400c10001c3dc00aa000e0001c378008e00870001c3b0003f00470001c380004b005e0001c3e2007f00030001c327007e00ab0001c30200af00880001c37f001f00580001c3540046000c0001c33e0015003e0001c32a000700860001c3c500af009d0001c353008000360001c362008900c40001c3c3000c00aa0001c311007f00040001c30e009a00090001c3b0005000010001c31a002000a80001c391001300fb0001c30e001500510001c39e0079002c0001c378003f00970001c3a40091000a0001c3c900d900750001c38a00d700310001c34000e600df0001c39f000b00b40001c3210098003e0001c35600b700c70001c3fc00b500a00001c3650078000d0001c37a009400e00001c3c000ea00dc0001c35800c600420001c38200df001d0001c3fc002c00c80001c377006600870001c3d4005e004b0001c3df007a00090001c3190059006f0001c3a600bc000f0001c398006700d00001c3db00fd00df0001c335004a009c0001c345003100d20001c352006a00180001c38c0037002b0001c33c00bb00b20001c3bc000b00b10001c38f00a100da0001c356004d000e0001c31900f500b20001c39d003300590001c38300c100570001c303002c005b0001c38a002500260001c37d001d00a40001c38000fd001b0001c3ae002f00720001c34d0092006c0001c35300c700730001c34a00e300720001c39c00fd00280001c33000a3001f0001c3a700c500b20001c328005600320001c372006700410001c3a3000400040001c34600dd003d0001c35000b600370001c35900d700240001c359005c00220001c364002400e30001c365009b00ea0001c3a6000000cd0001c319002d00220001c32700bc00ae0001c3ef004500b30001c31700dc000c0001c307000c00f20001c30e00bb002c0001c363003500d40001c3aa003200d30001c3c900ac00dc0001c317007400d80001c336005c00f80001c30f00a200930001c3e100d800e70001c3bd008700b90001c33f00ea00110001c39e005200ce0001c344004900380001c37e004c002b0001c301007e003e0001c3ce00fe00b10001c345002500c30001c3c500a5009b0001c3e300d800660001c33f00a700890001c34700af004c0001c3a400d600d90001c39000a5000b0001c3af001500480001c318008400b20001c3f0009f00a70001c38000da005e0001c3c6004800d60001c39c000700150001c3b4009d009c0001c35000da00160001c3b800f400ed0001c31600bd00480001c3f500e200fe0001c3d100a500be0001c331004d00050001c38c000e00e10001c3d000fc00670001c3a20009001c0001c320000f00cb0001c34300d900420001c307000c00ca0001c349006900730001c337000b00240001c3b3000f00430001c393000000d40001c3ae0037000f0001c3b000df00740001c33900d300050001c30e006600220001c39400cb00260001c35b002f002c0001c3d8006400d90001c30300ae00450001c304001f00f70001c3930096009c0001c34200b400860001c31f00b300610001c3c3005f00880001c34000b500380001c3aa009c000e0001c3f700ca00a90001c312009300280001c37c005e00190001c37000b200670001c3060047003f0001c32500c600f80001c36c002200b00001c3c600e100650001c3fb00a000a40001c350004e00190001c3d1002400680001c30000e700fc0001c37b00ad00c80001c3b0004b00d90001c3a8008700fc0001c30a00a600780001c362000200630001c305004200130001c38400b800fb0001c31d00a600d80001c34b002400870001c3c5004c002d0001c31900b300a20001c367004600a80001c32e0097002b0001c33f0097003c0001c30200ec00a40001c378004d00880001c3890015000c0001c3d6009e00cf0001c351008900fd0001c3f80035008b0001c377007400f30001c30c00ad00790001c3d100d700a90001c311005600480001c3a100d600090001c32f009c00650001c33d000200440001c31d002f00c80001c348004b00d80001c30d00bc008c0001c355000200c90001c347001200750001c33f009d00470001c3e600a4008d0001c376003f00f60001c30700b000e70001c39a00ea00590001c33c008100300001c3b3001900b10001c35800c500500001c3600065003c0001c34d00f900eb0001c35800d700e90001c3a400c600b30001c3e20064008c0001c3fd008200ee0001c34f006100f20001c3d500eb00d90001c39100b8005a0001c3a10067007d0001c3b9007300070001c3ca00f500210001c35c0091001e0001c3f7008600cf0001c37c006e00af0001c3f600e7006a0001c3e400d900550001c376000500dc0001c378008d008e0001c3be007500320001c303006400380001c30d0007007a0001c3c900cc006e0001c38d004300e70001c3c300cd00bf0001c3d80083000f0001c3ce001d005f0001c3bd00d900750001c3ad00b700460001c38f008a00ef0001c39d000c00710001c36000f200310001c3c5008800380001c3a400b600820001c35f001d00bf0001c3b300a700ee0001c3a900bc00ed0001c39500ea00990001c31700f900f50001c35f009300500001c3e3002a00c70001c3da00d0004b0001c363002500970001c367005f00a00001c39f00f200240001c3d200f900540001c3d000ef00700001c37f005300bb0001c34c005200b00001c381002800e40001c323005d006c0001c320005500720001c36800e1004b0001c32600ef009e0001c395001800960001c3e400f300360001c3570052003d0001c3de006200de0001c3ea00c000ce0001c3f0000d00b40001c3a20005003c0001c326002100f30001c33f003500f20001c36a004b00050001c34b00e200f90001c3ea000700b20001c3c600f000f30001c3f300bd009e0001c33300ca00270001c38700db00650001c39a005800c00001c3cd003900c60001c3e7003f00f60001c316002400ac0001c3b6008400420001c30d004200240001c304003000bd0001c38700b600ad0001c32f008c003f0001c392000300150001c3b600e1007d0001c389000100220001c36b002700340001c314009e00240001c3e1000200690001c3e300db00a60001c34200a400470001c35000af008b0001c371005900030001c36300ec002a0001c3cd00bc009a0001c325004100950001c36d006900380001c31300ae00210001c3ad005600380001c3e800bd008f0001c3510002009b0001c38e005100d60001c3f8006400cd0001c3ce009700570001c3f70054004a0001c385002700150001c3a1009000080001c359009400bf0001c33600e400540001c3d7001b00de0001c3b600dc002c0001c3f8007600230001c34f002300630001c3fe00ab00450001c3ee001c000f0001c398009100be0001c3ea00d000f80001c338001400a50001c3b400de000e0001c34200b2009e0001c37b002100c10001c3d8008d00e80001c354001600c20001c3d400d600af0001c306000f00c40001c3e4001500af0001c31d00df00490001c3ac000500e20001c3a0001600980001c316006400ba0001c3eb005b004e0001c38c005400530001c34e00c900170001c3b600ac00930001c31500c900eb0001c3b100d600ca0001c3d8008d009b0001c3c4005200920001c3e000ce00900001c332005d002d0001c36c00f0005a0001c3b100d200890001c34f006300d90001c36c0098003b0001c3d100ed00a90001c3a4002100bc0001c332004b00a20001c30a005e00270001c37d00ec00340001c3f6008700ad0001c37200dd006d0001c3c800f000c00001c35300fe009b0001c3a3003300300001c3c3005700780001c36a00c3004b0001c36600d7000c0001c3f00047007d0001c39100d200f40001c36f00cd00ee0001c3c000fe00b30001c3d0004a00ec0001c381001f006a0001c3aa00d000940001c36600e800c60001c3230001004e0001c3f3009300fa0001c3b0004f008d0001c3d600cd00a40001c382002b00380001c30c00ab00b20001c3280026001e0001c3d300fe00c10001c3bd00de00550001c36800a300a60001c35a000b008a0001c309001900180001c35c002a00450001c30e00af00c60001c379008a00f40001c3e400e400b10001c3f2008500f10001c32d002a005c0001c32f007c005a0001c30f00ab00e80001c3a100db00640001c3fe005c00510001c36400dd00590001c3d200be009a0001c34000ea002c0001c370003600140001c3c9006b007f0001c3e7009100310001c35c00da00ed0001c34c002300b70001c3fe000200710001c35f008a00980001c3e1007700410001c39d008e00510001c3cb004900050001c3f8005e00930001c352004a006c0001c34b008300190001c308002000d50001c38100ea00cf0001c3cf0054007c0001c3180022001b0001c328006700110001c3b700c500b40001c30d00d700580001c338006200100001c3e1004d00110001c3a9007900ce0001c37500f600300001c39b00f800240001c3e400b1005f0001c3d400e900430001c3c7008a002b0001c3d500d5008e0001c35f00fd00ec0001c3ee008c00fd0001c3e700f1002b0001c34400fe00ed0001c3ca007000060001c37e006700500001c37a00e0001a0001c3be007700c50001c315004900000001c3fa009d00940001c3dc004d00be0001c31b00f8005b0001c3a8004800fc0001c3a3008d00010001c3f10027004f0001c33e00a500cf0001c33f000600b20001c34a002a00af0001c35800fc00f70001c361008c00a20001c3ba009800160001c32c001200800001c373009700950001c3d000e400f40001c36a000300e00001c34900e900430001c361002b009e0001c30b00f600e50001c34f007300b00001c3d3002100f20001c368004400e00001c3690037002f0001c325004b00210001c31a002200020001c30b008500930001c31600d3008b0001c38e00c400570001c3b9002100010001c3b60043003c0001c359003800e40001c34300df00f80001c32800bf00520001c36300a0003d0001c3b6005000760001c3af00a0007f0001c368006000460001c34f001300ed0001c30f00c6008e0001c3fc00d0003b0001c38b00e2001d0001c3ed006600c70001c33b001f00400001c3d400e900490001c37200ac00320001c307001a00340001c32d0027006d0001c3710067007b0001c3cd00c200c80001c3c000b800d70001c3a4008100aa0001c3ec00b800050001c36e007300600001c38600f9004d0001c3f200be00d10001c33a008200c20001c353006b00790001c3af006600680001c30a00b300530001c3e1006200d00001c3ed00ef005e0001c3ce00c000750001c3aa007700390001c32f004400610001c34c003400700001c3ed009900cf0001c30300a700830001c3ad00de00bb0001c39b005f00eb0001c3f9005800f50001c3d1001b00ad0001c33500d200680001c31000de00860001c30f0049004d0001c3db0086005d0001c39100d000090001c39d00f500800001c3ee00bf00390001c39d004d001c0001c34c0001006f0001c348005d00260001c388007000200001c33f008f00f60001c3db004e00350001c30500b3003a0001c357005200590001c34300d900130001c3e900a000550001c3a8000900f60001c30f004000910001c38500a6004a0001c30100a4001a0001c351002300d00001c35200ec009e0001c3e1004300f40001c3ef006800380001c38b0081007c0001c3ab004a00240001c38e00ec00f90001c3d90041006f0001c33800e700c60001c37a003500d00001c376003f00870001c376009900700001c382002700440001c3f900b200940001c34c007d00aa0001c379004200140001c3fa008f00b20001c35c006b004c0001c3ca000c00130001c37300a500b10001c301002300d50001c3ab00c8004b0001c370002800210001c3c8005c00db0001c396008500b10001c360006200e90001c39700a700790001c32a000300010001c3b0005900d10001c334009200b30001c34c00c2006e0001c3b40049008a0001c36200db00fb0001c332008c00730001c31b001c002f0001c365003100f70001c3d8003900bf0001c3fa001200dc0001c3fe009b00e80001c3a100f600fc0001c3eb005e00360001c37b00fb00f20001c34a00b900e00001c394006c00b70001c32e00fb009c0001c35d004b00830001c3b8005b00c00001c345002900970001c358003300e70001c3bb00d100770001c32200a700a60001c3dc00dd00f60001c36a00fd006a0001c3f5007600fb0001c3d700e000fd0001c339006d001a0001c370004a000f0001c31b007b006e0001c390008700940001c39100f3005d0001c32900df00470001c36d00ac00fe0001c31600ca001a0001c378004100600001c3ef000f00d30001c33a006200ce0001c3b7002200710001c3c9008f00ec0001c327007200fb0001c305008f00f30001c3a7000300380001c3f900b500080001c35d000500850001c33e008800320001c30b00cf00060001c3c0005e00b60001c3c4006e00770001c3ac002c00c80001c389005c00770001c33b000300020001c3750050004f0001c38a002e00d10001c3db00c600a10001c388007300480001c343006300e50001c3b9008e00c00001c38700c900d90001c3ba003c00a60001c3c800cb00100001c3e000f000f20001c361004d00e20001c39e000000ac0001c312000200e30001c3e7002400480001c34f002300220001c396001e00c30001c3b5006c00fd0001c39f003f00050001c390007d00a60001c3100087003a0001c32b00aa00220001c3a500a700c20001c37b00b1006b0001c3b90088009c0001c3bf00b200340001c340009800bf0001c31300e200f90001c3300084008f0001c3950011005e0001c33200ab00b90001c3e70069002a0001c3be000c00650001c3a400b000450001c3c600f700fc0001c3a600c200280001c3bd00a400970001c345005d005d0001c3d300dd00760001c39400c5001f0001c3ec006c005e0001c36700d900070001c349006500af0001c3f500a5008a0001c3660090006b0001c3d0003b00810001c37b006f00a40001c342002e00050001c3f1003100ba0001c30900f600360001c30400c800660001c337008b00050001c3c4008f00170001c3f7000c00c30001c307006400b50001c31800f900cb0001c37d00bf00db0001c38000b7003c0001c31c009a00a20001c3220026004a0001c34600d600380001c30b002e00950001c38f00db00e80001c378001c00f50001c3f5002300dd0001c34100cd00b20001c32f003400f40001c39f0033000a0001c3b20023008f0001c37100b2008e0001c39c00ba00200001c36c000b00980001c3e600f300040001c3cb005b00af0001c3e0009a005d0001c3bb00af00ba0001c312002c007a0001c358006600b70001c30f006400210001c32a00dd00ac0001c37900b200890001c32300fe00f40001c31d005000c30001c32100dc00d70001c345008e00970001c31f00a500af0001c31200e200080001c370001400310001c3b9003800710001c398009000e30001c35f00a900ca0001c32e003100420001c312009d00b00001c3bb003d006d0001c321001700c90001c30800be007d0001c3950065001c0001c32a004500c80001c34c001c00140001c37700e300620001c3eb007f00a60001c34300e800170001c3b700b6002d0001c3b300f200c60001c3c2005300b80001c3ba00d9001c0001c352009f00a90001c30700b200fd0001c3b400a200400001c34d00f300920001c3a5009200360001c36d00d900090001c36f0070009d0001c3b0006000bb0001c3d900c100fb0001c3f1007800190001c3320047006c0001c315004600910001c384001f00020001c363008f00c90001c3fc009900a00001c3e1008d005f0001c395001b00ea0001c324006100ce0001c3c9009c00b10001c330009b00f10001c31a00fc001f0001c3b4004300680001c36300cf000f0001c3f000ad00970001c31800d000050001c35e008d003e0001c31f00d5005b0001c38f00b7000b0001c3bd00ac00d80001c3d5003200db0001c31800ce00030001c3ed006a00c80001c32600ea00d80001c363008300fd0001c312004800910001c328002200ea0001c391002e001e0001c3e6003900e50001c32d00cd00b90001c378008a006d0001c3eb00ac009c0001c31b001e00ef0001c3a300b6006a0001c311002e000b0001c30100dc003d0001c3d6008100000001c33b003300f20001c3260088008e0001c30a00ac00260001c3e6003000de0001c30d006d001c0001c3c100ec00790001c3f100da007c0001c39f003e00600001c3a1005e00270001c38c0077005e0001c30d000b00ae0001c3a200eb00b40001c3ca0069002c0001c3b700a300850001c31100d600d30001c3d2005f00ac0001c38c009600620001c3ba001100b30001c3d4000100d40001c31400be00050001c338006700120001c3cb000a009b0001c3b1005700e40001c356002c00dc0001c301002700c80001c3ae00af00580001c3ba004500770001c3eb00dc00a10001c3790051008f0001c33c00cc00100001c34400a3000f0001c3ad007b00650001c32500d900260001c36600ac003a0001c302007c002e0001c3ed006800bd0001c38c003d00e00001c37900cb001f0001c38d007000ec0001c3b500aa00950001c3930057004c0001c33f003b00430001c377007f00780001c31b00b200f00001c37c004300f10001c3c900b000070001c3a100de00740001c360003e00910001c3c000c300970001c37400aa00790001c31300c000cf0001c3e10083007c0001c3500098001d0001c34b005d00290001c317001b00e30001c3bd003800f00001c3d3001600ce0001c33c000c00b80001c3690069002a0001c3d8006200350001c31d00d700600001c3620046009c0001c33700f2000d0001c324004f006a0001c30c00b900c70001c36100a400f20001c340009800e60001c3e3004a00d20001c3e8005700080001c392008c000b0001c38f00fc00d80001c3a300cb00ec0001c361009500030001c3e7003d00660001c3c500da00c10001c3c8000b00eb0001c363006600ae0001c3dd00af00830001c33b005400fd0001c3a3003e00260001c35d008300af0001c354008900180001c340003700540001c381005200650001c30b00c300070001c31100a7001f0001c3860092000f0001c32a00a100580001c3bc00af007d0001c35400cc00930001c31b005900d30001c33200a100150001c3f1007a00880001c3c3009300400001c33700c5006e0001c3ed0015006f0001c3670036001f0001c318005d00b50001c36f00e700390001c3a0008b009c0001c3ea00a9000a0001c3c7004800960001c383005900680001c36a009a00390001c394008a00460001c3bc00e100ef0001c30a00ac00680001c33a00d000ee0001c3de0040008a0001c376008c00920001c3a0009f000d0001c34e007f008d0001c36e004100360001c3f1003b00f50001c39300f3007c0001c3b2005b00e80001c393000700980001c383003400c40001c39f00cd00830001c3c500b6000a0001c3b700d7002e0001c33c00b200e10001c33f00b800480001c3de00b700820001c35b00b600b20001c34000b600e10001c343004200bc0001c39100b500fe0001c3a7002f00510001c3a00003008e0001c3b8005400ce0001c354006e00970001c3ec006d00400001c37300f500430001c3e900fa00430001c30a000700930001c3ad004d007f0001c31100c200f30001c30600e5008e0001c34e004a00fd0001c35400f700c00001c3ca004000430001c3a600e4007c0001c3800077002a0001c3d6005000980001c3e4006e00920001c34b00fd00050001c354008100b60001c3b2007100340001c34c00b300390001c3ac00d000a10001c3d600c400220001c3ab00d800ce0001c32d002a00960001c3a4009d001a0001c38a007a00e30001c39b00dc00ad0001c38c00f400270001c39600a000360001c338002100330001c3d9009900e70001c30a0085005b0001c3a3001a00cc0001c3fd0017009e0001c3c3001900720001c30200a600b70001c3d8000f00a80001c3f9002400db0001c3cf007f00b60001c31d004a00930001c384003a006f0001c3e300e600160001c3d700f800a90001c3fd00e900c00001c39d002f008f0001c32d000900350001c30a002b00fb0001c30b0008002d0001c3b300d100fc0001c32f004400230001c37e008200390001c31800c900c20001c3f00017000f0001c38000d000f70001c3bf002a00ac0001c3c300e5002b0001c31800f600730001c3f600c200db0001c35a007500100001c3dd004b00400001c30e0072008f0001c31b00e600e70001c36d00cf00c10001c33f00fb004f0001c337008300af0001c30700e000d30001c3d600d400740001c35f00f3004a0001c3ae00db00670001c3be001900660001c301004400b60001c3ca00b400ab0001c37a00c900800001c32800d200740001c3f0006600a30001c301004900260001c3a2005c00d10001c39b0019007c0001c3eb00f9005f0001c3ac00a600f00001c34400a400830001c330003b00f60001c32f009700940001c3be00b900d10001c3d4005c00ec0001c35f00c800d10001c334003d00e10001c3ce005000d70001c3bd001d000f0001c381000300970001c3cd007100100001c3bc005f00b40001c3c4004000550001c3a500cc00d80001c39b00e500b40001c304004b006c0001c368007700980001c3ad00d800c40001c358003c00c90001c34c009f00be0001c33b005500e00001c327003800570001c32600ef00c40001c335007100ec0001c35800e000d20001c32d006a00820001c335009400cd0001c30500b200080001c3e80059009d0001c3190038009e0001c30500b400750001c367001d00220001c39900f5000a0001c3be00b100540001c35b006100480001c32f00e5005a0001c39800a500ce0001c36800a100d00001c34100be006b0001c3a6004200a40001c3f6003000080001c3ac00ce00d10001c33e007500710001c31100bf00cb0001c354002a00380001c33b003e002e0001c305005900770001c363005f000b0001c3430056009a0001c3e800c400190001c391006600c70001c3650045001f0001c37f00bd00100001c3310060005c0001c34800e800a50001c3dc00c400ae0001c32100de00290001c349003a00ef0001c35e000c00a30001c347003500ae0001c3420077007b0001c3f000b8002c0001c32800d000900001c3e2004400ec0001c339008300420001c38400c5005d0001c3820008006d0001c38f0083002e0001c38a001500ed0001c3ab006800190001c3f0002a00440001c38500a700050001c3cb006900b60001c30d00d700f20001c383001300b00001c30e009a008e0001c33a006b00dd0001c3a800e400b90001c33800bf00170001c3140002009d0001c3580041009a0001c39e003200f80001c3ed00dd00b00001c32e00b200570001c3e700f600a80001c3f80035003c0001c35f00d900200001c3fa00d000bd0001c3a000fe001d0001c3c30002002a0001c35800f500750001c31f002400930001c38d004500c90001c3a800cf00100001c36e001b00cf0001c38a00e400030001c348001e00740001c356006600900001c35600f100b10001c39d009c00f10001c3f600f200be0001c35600c2006d0001c3b5009700b70001c3990066005d0001c326002600320001c32d00a700a60001c33c009c004a0001c3fa00d000090001c35b006900910001c3dd006f00bc0001c350000b003d0001c35100db00410001c3f0000200020001c353007000b80001c376003700390001c39700ca009a0001c303009600450001c3a200eb004a0001c352006600900001c3f700cf00b90001c351000e00370001c3f200d200d10001c370005d00920001c356000800da0001c3d4006000cf0001c39700fc00630001c364001a00300001c336003900d60001c3ea00fe00410001c31e00eb001c0001c3e5000500a20001c303008d00cf0001c311001200a40001c33200ee00410001c3f1000000290001c3a5001900670001c3ea00ef00100001c3d7004400d50001c3dc001600e80001c37200de00560001c3de002d005a0001c31b00a900610001c3a1009b00450001c366006500e20001c365005300d50001c35800c8004e0001c3aa004b00280001c3c10040009d0001c3f9006d00b70001c38f00b9001d0001c35f003b00360001c395004b005d0001c358009100230001c39600ea00ef0001c3d000bd00080001c36c00ec007d0001c3f2004200c90001c399008b00380001c3c2006b002c0001c312003100cc0001c33300c9003a0001c327002f00a20001c3f200d400af0001c3a5000100930001c3a600e2002b0001c38f009900fe0001c37f000e004f0001c338000a00b80001c34a00bb00b10001c3f3006a00e20001c3d000f1006c0001c32a00dd003f0001c35f00fe00630001c36a00a400cc0001c3c3003200660001c3f4001700dd0001c36f004f00730001c3210031005e0001c3f3003600390001c30b00a000380001c3dc009300bf0001c392009a00e40001c344005a002f0001c38c002b00310001c3ea00e800680001c33a001000b70001c3b4004000cd0001c35b007e00f90001c3be00a900510001c339002600360001c3b600b800660001c389001b003c0001c356008500e20001c36d00c000ee0001c3e4004700670001c32b00d3000c0001c315004b00220001c3a30092000c0001c318004300240001c37d007700e50001c32100db00b00001c37c003800cd0001c372007600950001c350003800a80001c3a00031003d0001c36300c100a40001c3af00c300910001c3c2007600670001c36c00bc00d50001c37d00a9000f0001c36c00b600cc0001c3710096009c0001c38e004400660001c38200e100140001c3d8006300380001c3a3002400d20001c330007200060001c371005e00410001c3a7000f00c30001c3ec003700510001c34c000c00df0001c3ea0092006a0001c32900b4003b0001c338002100470001c39800ee00e00001c35600c1000e0001c381003500780001c37e00cb00e80001c32c001c00480001c3e500ad00b10001c3a8002700660001c30b00cd002e0001c391009000d70001c35400c3005e0001c3a9003000220001c335009d002f0001c39e003100a80001c36900d600390001c32d0002000b0001c3620023006d0001c32200b800d50001c335001600de0001c3ec00ac008a0001c3c5008e003b0001c32e001b00ee0001c36d00f900070001c3c500f900ab0001c3ce00f2003e0001c38100de00d00001c34100bc00a40001c3a6004e00600001c3e3001100d80001c3bc00d5004a0001c32b007900550001c31500cd00a30001c3bd00a1004f0001c3fd003000ab0001c36100cc00830001c3b5006f00d40001c39500ab00a60001c381008f00160001c30d00e600680001c31200f600510001c3a600ac00df0001c3e9009700b10001c34c00d800700001c39e0024002d0001c38b00d4003c0001c356007e00e30001c3a5000600bf0001c321006300450001c3e00059004e0001c36300e9003a0001c321006d00a90001c3d0004400090001c39000b500460001c3b4001100c50001c34a008000cb0001c37200c9000c0001c395004800430001c3d600ae003d0001c36000af00320001c359005900ba0001c35800f100340001c38e007500cb0001c336002b005e0001c39e00d400cd0001c34200f700430001c352001a00dd0001c3dc00e800910001c3fb00ef00ac0001c3d300c500440001c346003300de0001c35100ab002f0001c3b000b200df0001c36000e7004f0001c38200a4006b0001c342005200930001c3a90027007b0001c3da000300ed0001c348009c00000001c3e000a600190001c3f300e100730001c34000f700aa0001c3d900df00d20001c31800af00b40001c323002400350001c31d00e700440001c39300a300e70001c3b500e700350001c329002900f10001c3d900c100400001c39d00cd00ca0001c3d20082000f0001c3c7001300d70001c34800bd008e0001c32100af00180001c31d00e800640001c31e00a000550001c34c00c6000b0001c328000f005e0001c36200b5004c0001c384004100dd0001c38000c300440001c385001a00210001c3c900c800790001c328001600590001c381008700e30001c37400a200c10001c3ae00d300110001c3410046008a0001c38e002300990001c34500f500b00001c3dc003700a40001c3e400aa00910001c3c900b8009c0001c3b300af00f40001c3110027000d0001c3fe008600aa0001c3bb004800d00001c3c8007b00630001c31b0047000b0001c355000c003f0001c397005000a30001c34800a1004c0001c382008e00660001c3db008a00ea0001c3270030008d0001c319004f00010001c3a800c600060001c3c9002a00c90001c365000700cc0001c3df009400f10001c378007000620001c379006f00590001c38400f800990001c325006f005e0001c31d00ba00410001c3b1005900c70001c36d00dd004b0001c318007600740001c3ea001b00e80001c34400ad00110001c3c2004e000b0001c3270092006e0001c32e00cd00d10001c3fb00cd00600001c39200f100040001c30400ac00d70001c3f6002800ea0001c3a600b900ba0001c31f00ea00b90001c33e006200f20001c3d400db00ab0001c3c000a2008f0001c3df0072002c0001c33f000600e70001c33e00d500b40001c38000b900840001c388003a00b00001c3d800af00260001c330000400f10001c3b200e400350001c3ce005e00ca0001c3ad006f00a50001c31800ae00c30001c3df00d300ac0001c3ac005800cc0001c35600e500f90001c347002700ad0001c3d2006500170001c31b009d00180001c38300d4008c0001c3280080000d0001c3a6009a004f0001c3ac0003009f0001c3c5005100fc0001c3bd000d00fb0001c32800cd00e10001c3ad002b00e50001c332005900ef0001c3eb007300650001c3e900ce00360001c35100bf00ad0001c36f00c700690001c37b00df00d00001c30c00e600910001c3a800d200e60001c37800f5003a0001c39f006d002b0001c3a600ab00740001c306005900220001c33b0032004b0001c37500e000850001c30f001f00bc0001c3f3009000a80001c3610038005f0001c313000100490001c384003000d40001c3420024002e0001c31e001800780001c3d400d300e00001c335006200690001c31e00e900a10001c3c6005a00af0001c345004d008e0001c3eb006e00f20001c3e90069009e0001c30600fd00020001c3fc005900300001c31d004500230001c3bf00e800560001c3db004700040001c337001900be0001c3ca008600100001c38100b300360001c3ae006b003a0001c3df00c300660001c3020024006d0001c30d003600f20001c375005100380001c3ec000c00750001c3c000d200db0001c33800b3007e0001c318006600b10001c3d5009d00a70001c322008600150001c33400f200060001c35c00c300040001c32500ce002a0001c3e20001003d0001c3f9004300f20001c30600b200d30001c310003400d20001c334009b001f0001c369008a00640001c3c3002400e90001c3ef00b100ed0001c33d005800640001c3320033002f0001c33d000b009a0001c35d00e500cb0001c3e4003b00be0001c33a002c002a0001c3140005005a0001c3c8005200690001c3fd007a00fa0001c31b001800260001c31600c700d90001c333008800610001c374006f00c60001c37400db00ae0001c38b00a300040001c3ad00cf00330001c39d009c004f0001c3e700f400370001c36000c900b70001c35f00ef00c00001c32100c6003a0001c34b003a00f60001c3a500f300a20001c3c2005100ec0001c39900b600f90001c30300d8005c0001c35e009700c40001c384002800680001c3df004e00080001c3e1000c004f0001c3e1000a00d00001c301005f00b40001c37d002d00a50001c39d00e200e40001c364001e00390001c3ca00ee00bd0001c39800e900ba0001c324005300d60001c38200c5002d0001c3cb0031007d0001c33000c200490001c314005c00710001c310007d00110001c373003f00db0001c3de00b500240001c35200ce00460001c3bc003800880001c38500bb00860001c3aa0006007c0001c334006000d80001c356000300270001c38a009000020001c378008800ca0001c34a005500da0001c39f003b00400001c36d00a000c50001c3e0002600210001c3dd00fe00680001c336006e00db0001c3db00df00f00001c303003600120001c3a600cb00d70001c3fd00f700b50001c3cd00f1005c0001c399004200960001c319000f00d10001c38e00da005f0001c32800e6004b0001c3a5006700ca0001c34000d7002a0001c353007400700001c3ba0068006d0001c37b00c900ab0001c3de001f00a20001c397009a00820001c399003e009c0001c3dc006e00d00001c34a005b005b0001c3e30056002b0001c3f5005400870001c3b0009b00440001c3fe00b400b40001c36000ef00810001c309001900b10001c3e100f500490001c311005300510001c3b100b900d50001c371003200d60001c3c1004800e80001c3e400da003b0001c38a005d00610001c3b800e6005f0001c39d007c00160001c3c5007200050001c32b00e700c40001c37e003000840001c39b009400d00001c387001100dc0001c36c005300530001c313009e00da0001c34600c100e60001c3d60082005f0001c34900b200d00001c38b00b800530001c3b200c700400001c349001900850001c34100ec00080001c35400cd00e00001c337008d00100001c3c6001c00c50001c30200ae003d0001c3b600aa00d60001c3ba001700510001c350004d00c00001c3b9000200210001c36600a7000a0001c3a0005e008c0001c34900ec005f0001c39c007000d30001c3e5005300850001c3ae00e600290001c326005400150001c361006400fd0001c37c009f00160001c343006500f40001c3f4003e003d0001c32700bd00e70001c39400c600a70001c3d200ca00490001c394006f00420001c397004b002a0001c36b00ef006b0001c3bb00e300150001c3b6007900b60001c332007f00e90001c3d5007100760001c340002e00760001c3a7003f00490001c3a9007b008e0001c39900fd009b0001c3c10071004c0001c3d600df002e0001c3ef007000960001c3c4007e00dc0001c3d200d300640001c389006b00760001c3ee00db002f0001c3ba00d4005e0001c3eb009400890001c353002700c80001c34c006c00460001c33b0040004e0001c396003700b20001c3ac002b00090001c3cb00cf00e30001c3f7007200050001c358009000360001c345004f00e60001c37d002c007e0001c35e007400000001c3f3005200220001c359005e00800001c341006b002b0001c302005f00fc0001c31b008600900001c3f1006100390001c37d002a00900001c3fe006a001e0001c35c00a900e60001c30500b000190001c3fa00a4007b0001c3af005200240001c34800fb001b0001c39700ad00800001c3df00f200f10001c36c00a700da0001c3c4007200f40001c379006900f10001c318003900c60001c3d8004a006d0001c377006300230001c37700c300290001c300007f00dd0001c326000a00bd0001c359001c004e0001c3c700a700d80001c38b00af00f90001c3ce00cc000e0001c30d00e600180001c3db002100830001c3ef00a0005e0001c3b50073007c0001c3b300ef00bb0001c3a8007000640001c34600e600750001c3a500a000330001c377003000da0001c37a000b00160001c37c0071009f0001c356006200e20001c357008500280001c333007c00100001c3ed00f500930001c35a000600100001c3bf007a00930001c32500ab00630001c39400a300630001c37a00b100880001c34000a300790001c38c004100010001c360000b00740001c3d2006900990001c337004900ac0001c394000a00ef0001c32a00dd00ef0001c3990010007b0001c32e009b00040001c3da00f400480001c363008700df0001c3e200c600970001c3c400cb00600001c377009f00920001c32f003e007f0001c35b002b00140001c3c2003600360001c339009200fb0001c33a00df00c60001c39f00e600ca0001c3cf00c700ae0001c3770000002e0001c393003c00840001c374008400300001c3b8004c00310001c3c6003000c10001c302008d00880001c3b4007800120001c3330099005e0001c3f200d700740001c3b200ad00460001c39b005000790001c313003800a20001c39a000e00770001c3d0001900d50001c37900ae00d20001c3ce003a00820001c3ea00e600570001c3ac006500830001c34100a100b70001c35f00ac00fd0001c3dd00d200150001c316000100f60001c3c3008000190001c3df00b900890001c34f00fb00370001c373002200200001c311001f00b50001c3ae00b1008d0001c381008a00030001c324009800eb0001c38d00b800a70001c3bc0037000e0001c30000f300420001c36300d800b20001c34c002c00ee0001c3e9006b00310001c36d00de00a80001c3dc007d006d0001c320002600590001c3cf004f00580001c33a002a00120001c363002d00d60001c394002a00df0001c318002300020001c3e4006300000001c324004600fc0001c3cc00db00cd0001c3d6000f006f0001c366003800710001c353008100900001c3b900d1007c0001c36b00cf00020001c3e5009800020001c3c60084001b0001c32c005900d50001c31300ba008c0001c38f00f500570001c31c003100030001c31300aa00cb0001c31900e900560001c3a100c300a90001c392007a00be0001c36e000700180001c3d700ce00270001c3ed004200b00001c3880071005e0001c3e000e100e10001c31700cc005f0001c328000b00b80001c36b005200770001c3200080002f0001c345009800be0001c33f00eb00430001c315001d00730001c3c600f700ee0001c37800cf00d50001c344004600030001c347000800230001c3a4003700210001c3d700f8002f0001c368001300310001c34700da00400001c36400d700490001c34100f1003a0001c33d00f200840001c37900c100ce0001c37600ad005e0001c3bc002000f90001c3e1005700830001c3b500bb005e0001c352007d00dd0001c38f000400d10001c3a900f100240001c338001000540001c31e004100cb0001c33e0030008f0001c335009100620001c325001d00aa0001c39d00fb00e20001c31000bb00c00001c37200ad00e40001c3e6004c00940001c3e1008a00340001c3d7006200540001c36300e500ca0001c34200fb00b50001c3f00062002c0001c39500c600c40001c3e0005e004d0001c3e2007300470001c31100b500910001c3fe001f00df0001c3d800a800a40001c3b300da00590001c39c007d006e0001c378001600d70001c3d0001d00af0001c36b004b00930001c30c00a300910001c3e2003300790001c367004c00b20001c348005b00b90001c3a500d9004d0001c3f4005600120001c32200bf004b0001c36d00fb00790001c3c6009500e00001c32b00fd000b0001c3c100b500ec0001c31100f400400001c39500b300a40001c300001700500001c3500098003f0001c33a009e00650001c34900c700de0001c38800b200b10001c3e6006b00920001c33d00c400100001c3d500b700220001c309001a009d0001c3e5005800750001c3a50014000f0001c3b500db00a80001c32a008d00090001c34600c1007c0001c3a7009100050001c3b7009400b80001c3fb00ea00240001c31600a700940001c3a5003f00b40001c39100d100a40001c3f60094007a0001c35f00a400e80001c374007500150001c347004600020001c376008400ba0001c38900cb00d20001c30c00c800370001c33800e900770001c37a00b100b60001c3c8009300960001c32100f400ef0001c393001600570001c310008300f90001c38b004f00ec0001c33f00f000d90001c32800f800a70001c3550082003b0001c357001f00de0001c3e800f600de0001c32d006700e60001c37700e500f50001c34c00ea00160001c33200d200230001c35600f300600001c317005c00340001c38a00c100c60001c3dd002800900001c3b5003000790001c33500ea00270001c335000c00640001c36a00c900270001c349007f00130001c3670069006d0001c384008400980001c32c007400380001c3bd0021001c0001c381001c007e0001c374009400b10001c3fe006e005a0001c33d000100680001c30c0080003d0001c38100ed00ca0001c3d200e500230001c312000e00dc0001c304007200510001c37c008100eb0001c3d1005f00c20001c37900bd00f60001c3030095004c0001c37900e900180001c324008200c40001c3360083006f0001c32000a400580001c32400ef00630001c3ae009700730001c33600fb00f20001c39700e100920001c32b00c500f70001c39900c400130001c32100f300670001c380005000850001c3ad00a2007a0001c37000e000c80001c346002f000e0001c3f4000a00980001c34e006200920001c31400e800b40001c36500ca00150001c3200006004f0001c31d007c00360001c33a00ae00300001c3a4002300a60001c3220049003c0001c35a00d400640001c35900e400e40001c330006c002d0001c39a00b300790001c35f00db00090001c3b10008005f0001c367003d00a40001c30f009800f90001c3b4009400b30001c380001e00f60001c32500a000ad0001c3cd001c009c0001c3fb007900480001c3720063000c0001c30d005100450001c364001200020001c39e006a00470001c3f900af00390001c3e300a800030001c30f001700690001c3c600ee003f0001c3fa003800f80001c3ad005100d10001c3fa00a700790001c3f90025003d0001c33400a200160001c324009e00b50001c30c002a00d00001c34f008a00670001c38700c5009b0001c34300cd00e90001c3cf00d100040001c30100a200620001c35400d3001c0001c3c2006d000c0001c30500f700940001c33700f000640001c336005400d30001c374002500c90001c351001300db0001c3fb003100700001c34c00c5009c0001c33d00c9004c0001c3b3005600c60001c31c00b800aa0001c3dc009400210001c357008900fd0001c39a00ac008c0001c3c900f5000e0001c392007800e60001c34400ad009f0001c33a004100cb0001c3c50087007f0001c34700f900e00001c32f002500da0001c3ad00a900560001c3e800fe00b30001c37a004200970001c3a7003900420001c33e009800820001c35400d300db0001c345006200060001c38200bc00b70001c367002c00eb0001c3bb007700070001c34500f000720001c3a9004400210001c32f000400e20001c392000a00930001c326003600010001c34100b9000f0001c374002400200001c32e002300530001c39d00a600a40001c333000900ce0001c334004e00c20001c30c000d00640001c3300006001a0001c3e7003d00b40001c31b00f0003b0001c35c001e00c60001c37a00b6005c0001c3bd003900330001c35a00f1001d0001c324000a00470001c37a002b00a40001c3bd000600280001c38c002c009d0001c375006500450001c31400ea00d60001c3e5001c00c50001c38f009300f20001c3c5002d00ad0001c342001f00380001c3f900d0009a0001c3a700f500f20001c330000600040001c3ee00f100190001c3a000f300ef0001c38100ce00d70001c3fc000f00ae0001c327006e00a00001c37200ed00ce0001c31b00a2005b0001c3d500b700c70001c3a9004000560001c332007100400001c31600a900c30001c36f0003006b0001c349009800bd0001c393006a00cc0001c38200d400eb0001c36c000a00ae0001c37a006500e20001c39f00c100de0001c33f00bb009c0001c3da003500ea0001c31700ef00140001c329000800600001c3e1008600490001c330008d00190001c3da004f002b0001c3e600db004b0001c3d300c800c90001c3a3007000dd0001c38a0069005f0001c32200e800380001c3b20091004f0001c3d200d700dc0001c32400bc00b40001c3060031000c0001c3b600e300b00001c30c00a6007b0001c38b00af00710001c3b6005000920001c393003000620001c3a70071006e0001c33800dd003b0001c3a400a600110001c314007e009b0001c369004e00e50001c3fe00fd002c0001c373006700930001c30a008200db0001c3bf009b00530001c379000900110001c3bf009b00d50001c313009800bd0001c31e005800f10001c35b002700d80001c36a00b8005d0001c349009000490001c310006c002d0001c39d005500170001c31700cb00ef0001c357008c00100001c38f00ca00220001c32300b8000c0001c3eb005900a90001c3b1007c00b60001c3b6000100f80001c34c000e00c60001c31300fb00d80001c325004a005e0001c3a40070006d0001c3d500c800220001c3d80083005f0001c3af006700000001c3f300b100f10001c3db0085003d0001c33300d8000e0001c33300a6007b0001c38900db00f40001c32d00de00ca0001c318000500390001c31f000100e00001c36c004200350001c307000400e70001c3f7005800370001c3370091001b0001c3b6008a00c70001c37600d500690001c3690000008b0001c3be0034008b0001c36b00fd00a90001c3a6008900170001c3fe00de007b0001c372003a009b0001c3ec00d500fa0001c30b002800640001c39500ce004e0001c34800df00130001c330009f00f10001c32d004f00e60001c34d006c00240001c36200a7003d0001c3d700a500910001c3a5004600a90001c3ac00de003a0001c333008900fc0001c375004f00120001c32800ed00ac0001c3680092000e0001c32d00c500410001c324009c00b40001c3c7007500f50001c37f0017002a0001c36100c000dc0001c3a300e000500001c387008100a30001c3900077003c0001c31300d000e40001c3a6006600d30001c3d00062008a0001c3ec001300510001c323003a00770001c3270037008b0001c3e90093008c0001c30400a100050001c39600cf00310001c39c00d6001d0001c3bf0081001f0001c3830019007e0001c354000300700001c3c0000500cd0001c36c007d00570001c3530087008b0001c34700b900450001c3af008f00aa0001c36000ba00c90001c30b008c00550001c35000a700930001c341002700340001c344004400510001c3d0007900650001c3af002f00780001c37f00ca008d0001c3e6001c00d50001c3a4006700eb0001c3330039007b0001c32200f600580001c3ca0089000f0001c38200c200030001c3ae0019007f0001c3f800e800090001c3e8006b005f0001c3400018007a0001c3dd005100aa0001c37000bf00880001c3d300e700df0001c360009800b20001c36e000e00500001c3b5006e00ea0001c3e400b200b10001c3d50077001d0001c31f00c900050001c38b006d00e00001c3240045004d0001c3f40094003c0001c385003a00920001c38f008400d70001c3ee006100020001c39900c6004d0001c3d300c700010001c3c5002a00fd0001c35200bd00e70001c34b0051009e0001c3f5005f000d0001c32100d000c10001c3bd00f200c10001c32000a700700001c3cf009600990001c303007c00320001c39e003c00ed0001c37900fd00040001c35c001d00e50001c32f002700890001c32e005b00cb0001c372008f00190001c367001d00fc0001c387007d00950001c33e00ce001d0001c352008400c60001c34b00b8000c0001c31400d300080001c33400f100ee0001c3bf0015001a0001c3ec001500940001c3bb004100120001c367007e00ee0001c330003900080001c33f00d100d20001c3a8001000010001c3f8004b002d0001c383003a00de0001c3e600a900ae0001c3db005c00ea0001c3bc004e00be0001c348007f00a40001c342001f00370001c3ea003e00090001c316006a00550001c378004a009c0001c30f006e00d40001c37000a5003b0001c39e00cb00f50001c3ea009300ac0001c3c000e700050001c342002100d90001c3c700f900c70001c373004e00250001c3f700a100fa0001c3ac006900f90001c3f000a900210001c3da00d300a10001c313003400380001c30d004a00950001c363009d00900001c347005000130001c32d003b006e0001c3af00cc00d10001c3680011005f0001c3240026000b0001c3a6001600e00001c3ee005600fb0001c33c008500cf0001c38f005400620001c35c009b00550001c3540054001e0001c3c700ac00e20001c32000d800fb0001c350003300f30001c3f9004600de0001c3f4005500660001c3b5008a00400001c35900a900f10001c3f0002c00960001c357008f00be0001c3c3009900ca0001c34b00af00050001c368005c00f20001c3b30012009c0001c3a2006e002c0001c32c00f8004e0001c3fb00d300970001c31800ae00380001c380001400000001c31b00f6004f0001c3ed00eb00f50001c3de002700120001c39700a5001a0001c387008700e20001c35500a500080001c330004f00210001c34c00e000fd0001c32000cd00f20001c358002e005b0001c3920025005e0001c35500d300040001c334000000150001c3c0005500140001c3e400df00860001c3cd00c900680001c36f00cb00cb0001c3f4009d00f40001c38f006200750001c39e003f00390001c392009000960001c39f004000550001c39c007100750001c350006700780001c3fa004900ad0001c3f1006600180001c3ec007300100001c36f00f0002e0001c378006300ba0001c3b1005c002c0001c338005c006f0001c32e004e002d0001c340007c00f10001c3ad002c00fe0001c3d700d300de0001c3e8000700c90001c3d0007800a80001c337003800830001c3c60007007d0001c32b006c007f0001c3c3006d00a70001c3f400fe00250001c3a2001000500001c3f1009500770001c3f100f100e10001c3450063008c0001c3ce008700710001c33c000c00b60001c343002000250001c321000900e40001c3dd00ea002b0001c3d5009400dd0001c357007600900001c3cf009600930001c381001d004e0001c34e00c2008a0001c3ba00fd00a20001c37800a800ad0001c34d000e006a0001c3f600b500840001c333000500e50001c3fc00a3006f0001c3e8002200850001c3e10031003c0001c347007800e50001c31200a6003b0001c3d600d700e10001c392003100330001c335005200760001c3b900b200700001c3ec0039004b0001c3380027007e0001c3c500cf00db0001c39e001200770001c35f00d100700001c336002100cf0001c3ee00d500f90001c33a001400e70001c397003400d60001c36b006f007c0001c38a00fc007f0001c3d100c900300001c34f00de007f0001c3c900cf00050001c3ed008300ba0001c352008f00ec0001c330000d00c10001c3ea00b100720001c36400e000ce0001c305001b00140001c3e900ed005c0001c364002200a60001c3a800c8005e0001c3d6005b00400001c3c6004300ce0001c3c1005800910001c398000a003b0001c37b005900050001c307001d00110001c39c004f00100001c39d00b000b80001c33900ac00720001c3be004f000a0001c30800bf00540001c304009200fe0001c35a00a800710001c38a001000a20001c338005500840001c395006b00100001c37d000300b10001c3bc003100cf0001c324007500a60001c3a2007b00e30001c30c00fe00dc0001c31500f200be0001c352001b00db0001c37300f300750001c300005f00bb0001c30a001b00f10001c36700b800f20001c376003b00fb0001c3a0005b00000001c3dd003f00bc0001c31f00ca00170001c307004300710001c3b200fa00750001c3700019007d0001c34b00bf004a0001c3960002008f0001c3f400a700d60001c32a00a700d70001c3ec004d00510001c32a006300b90001c37200aa00cc0001c318004700770001c351000f00440001c3cc007300570001c3ed003c00bd0001c3f4005d00e90001c3f800c800de0001c36300b3001d0001c30f00ec00950001c34400f1008c0001c3b1000500790001c38d001700c40001c321007c00d60001c37500d600780001c3da004900990001c3da006800ca0001c32600a200a70001c3b900f200d00001c3820037003b0001c3bf0074008a0001c391005c005f0001c3e1003c00460001c38a00b8008e0001c31400f300e70001c3f600fb00220001c30d00eb008c0001c31000bd00f80001c33800d2008b0001c3ad000500d50001c3e5001300b00001c3e500ca003d0001c3b8003600a30001c3bb00fb00910001c3e400ed00d20001c382001300f20001c3e1000d00000001c33200ca00170001c3fe004b00370001c35e00fc001e0001c360000c00a50001c3de005800ba0001c376006800290001c3d900ea00d00001c370001d003d0001c34400c600da0001c3b0006c00f20001c3ac007400f00001c34b00c000b20001c3e3001400b80001c3cd006a00470001c34700c500740001c323004a00de0001c3f5006c00ba0001c31300b100770001c305002500ea0001c3ab006500450001c3970010009e0001c3bd009600400001c3a1007100ad0001c3eb008a00a40001c39e003600e10001c30500b800650001c38400b100450001c395007a00b80001c374007400a00001c3f400fc00200001c39000bc00cf0001c30000a400980001c3ab006800140001c34d00c500a60001c3e6007100ac0001c31c000000d90001c39e006300f70001c3be00b900ed0001c369009b004a0001c33f00d300ae0001c3f500fb001e0001c3780059008e0001c39f008000d10001c34c004700610001c3d600d0008b0001c3d4005c00600001c389008d00a40001c303004000560001c34d00d6008a0001c37000a200380001c386005700780001c3b6007e00020001c311000e00460001c3f300f7005d0001c3b9003900e60001c38e00ed00720001c304009200430001c366006700ce0001c35a006300840001c35400de000c0001c35600ad004a0001c38b0075001f0001c3c50040004a0001c32700fe000b0001c36a004000df0001c37c007500950001c3ba00da003e0001c301005100f70001c32e00ae00f80001c3d400ee00bb0001c30900a700890001c326002e007b0001c335006f00b70001c3b000d400e90001c35d00c300680001c307007b00ac000161010060006000c16102006000f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : [ + "" + ], + "gasLimit" : [ + "0x3b9aca00" + ], + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "to" : "0xbe7c43a580000000000000000000000000000001", + "value" : [ + "0x00" + ] + } + } +} \ No newline at end of file diff --git a/test/evmmax-precompiles/evmmax-addmodx-bench-vec.json b/test/evmmax-precompiles/evmmax-addmodx-bench-vec.json new file mode 100644 index 0000000000..2ff2da88f4 --- /dev/null +++ b/test/evmmax-precompiles/evmmax-addmodx-bench-vec.json @@ -0,0 +1,73 @@ +{ + "addmodx-bench-vec" : { + "_info" : { + "comment" : "", + "filling-rpc-server" : "evm version 1.10.25-stable-69568c55", + "filling-tool-version" : "retesteth-0.2.2-testinfo+commit.766b4629.Linux.g++", + "generatedTestHash" : "682d204267cf3a3909bf22c063f2c9cde06a917d56f3666bad7ff4c724b3676b", + "labels" : { + "0" : "empty" + }, + "lllcversion" : "Error getting LLLC Version", + "solidity" : "Error getting solc Version", + "source" : "tmp/micro/jump_aroundFiller.yml", + "sourceHash" : "cadfd8a7ee22cbefac3a420cc4c762ca1a3a38ae3346407bd31694acff16c78e" + }, + "env" : { + "currentBaseFee" : "0x01", + "currentCoinbase" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "0x01", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x01", + "currentRandom" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "currentTimestamp" : "0x61a8d289", + "previousHash" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "post" : { + "Experimental" : [ + { + "hash" : "0x51a20eb8dbdec5af48eeecca9e38acb6006fe28733f8649500092464fe6a6364", + "indexes" : { + "data" : 0, + "gas" : 0, + "value" : 0 + }, + "logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "txbytes" : "0xf8618001843b9aca0094be7c43a58000000000000000000000000000000180801ca0999ee855b1d5325fe79efbc40ad560f9ebabbbb97e72e1a4e9cf7e4b8ba34765a06392df208ed06b901f2997995c138bfa06ae8b1a26c15e8aff52cad68f913e85" + } + ] + }, + "pre" : { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x3b9aca00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "0xbe7c43a580000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "ef00010100040200015e3704000000008000037f00000000000000000000000000000000000000000000000000000000000000306000537f0000000000000000000000000000000000000000000000000000000000003001600153610100600e6000c060b56000536097600153600160006000c2c3010100000101fec38007d402060f10c37809cf031b0f0fc3bb05540d3d0e0dc33706480672041dc3452ee805632704c33344e508c11403c3af05df02820710c335001200030000c3b7038c04b60318c3df0add0b433e03c36107130a290916c3d605af0a361908c3d001740537071ac39d06600ab2050fc3ad033209cf0215c355156d12461708c3680a0610f9000fc38f05c902b20314c37c089c06e50110c3fc004106b5021dc32911440f410f0cc31a00a800370000c39634fb024d5902c3e3019c061f0e10c3455d5e50027e02c3d901fa00160919c3400ac003500912c3e4013d0a410a13c3f00179100e1e08c33a002e001f0000c3f7006a07380a13c39607290ff2000ec3a300e800800000c3130a4508530717c3390bf1005d0912c3f402e2055c2005c3160cc1031a0c13c3b902b702bc021ec3ca0d7c201b3904c33c0ddf02680a0fc39707c5043a0e0ec3bf06700e910b0ac334078b041a081cc39c04da01da0116c3dc0111087c041bc3e8057223ac1404c3fd00fe00d2030fc396237d2b8c2603c322492d46c21403c3410dd103c2040ec3820cb60703190ac36305fc00c8011cc36e0dc8051a140bc3f700eb01960513c33ac5c53a0df201c34706ba0261051ec357095d09c80312c38b05b403040a17c3530615088c041bc3c200fe00450000c38307fb00ec0111c3a00fe803ec0306c3c906fe00de0309c3ae00fb00730000c3ae0bf501d80507c3ee002209760517c322dd59a68e7101c34e58e20e604f02c33a0d83083e0c0fc301139208f1010dc3dd041f1c950d08c31327c709df0506c32108c60269051bc33c0d520b350d0fc37a04290647051fc3910b0c18ce040ac3340eb005e6010ec3bb11023f891d04c3c2039606710810c3de01f50083041cc30f11bc0411110ec34f074e07010b17c35b17990e221f07c3aa07760cf4010bc3f2027017b60c06c3c809df05a40f06c321de10efad5201c34306c10284041ec36e066306900418c3fc01057dc71c02c3c3028c05090b16c3b80b521cfc0006c3f1004f0643061bc3e6059415ee0305c359085c08450914c3000e2a0bc70312c36915bc09551807c37b216f24ed0404c397033a06fd001dc3a6006200890000c34325a212c00c05c30c0e6708370b11c31077c11f575402c38c06120dc60312c35a0b8c08e7010ec36b058e044f061bc3ca0aa911831805c318099c04f40018c30f0a6b062a0916c3f8077887798601c3b70612139a080cc35e50e20ef00702c38109f201c1040dc376168d13801506c330071c083b071ac328066704fb001fc3bc022109120918c314277017332206c34f16a00b211b08c3a8006700060000c3db01f90033071cc38904f60026071dc34e23be0d0a3105c3db010209a4031bc37c07a3057b0711c3fb01bc16234903c3bc0bfa00cd0806c3c90193035f051dc3b946926d47b801c363077e05f60016c3a4037a05940419c3750fe4039a0b09c3ca11443e593703c3520bd702ca030fc3c403ee016a090fc3c103c703660910c3fc00a703d5011ac31717dd0301190ac39003fe00b6021cc3f303e706672604c33a15101af70009c33510ad06b1060cc36c00f300fc0000c309127c0a95080dc3373234324d2c04c38306300a520913c31609da010e0a18c31b070b0791031fc36806100a220a16c365197b16282306c33306110780041ec3ca025a07b60316c3fe000709910419c33b1c311d3e1b07c34312e802a9080ac32b13580f600e0bc3d6033612ca040bc34f066b0527081bc3b1079e08650e0bc38009750a580c0dc3fc005305f6001ec3131db209ed0208c3e40040065d051cc33d15a6094d1309c3352120258f1206c3bc02e80069051ac39908cc040c140cc379053708b50317c3dd017b06fe0014c3b14ec13eb64901c3ef00ea00950419c394232f45673203c330126c0dbd060bc3133b1c38762204c3120d410a460a12c345060508a1031ec38d04910426081ac38b0302081b071ec32548c712f90203c3b50208094d061ac31c0b89051e0b14c36c06b103c30217c3140cb6039d0513c39804ef005d0618c3c206d6041b1909c30ff015ea956a01c3d109741bd50805c32907d50154051dc37f07b404610911c374003300600000c3ba048d06410b11c35e05eb0030061ec331ce21de7b8401c359143a189c0c08c308f7fb0419e601c37f068306570814c3e7031f20ee0207c3da01f9009e0414c325090d0bb20316c3da0c6035f20403c31a073f06b3021fc35b0afb0081080fc33d0b8507960611c3290e520bec010fc37613c308d60507c3d502ae032b0a15c3f702c812453e03c32d070108e7001ec34916b709a00b08c33c0fca04dc020dc3c20f063e762204c3dd046e124d1608c3d6019604cd0217c3634e1c711b7202c3520834095a0715c385044f06a7031cc35d005200270000c3b0035507b90218c33e26641f1c2d05c34a08270af00015c341264a24a31205c398041709740519c3fe00440717081ac3a21f2c46b11a03c3b8029203fc001dc33a18ea029c0c08c359059303ee001cc3679835cabb4401c32407b502a3021fc39f05b604690811c39d0802155d0d0cc32a0a5f085c0814c3d501e800fb0018c3d3011c09cd0217c31c073b069b031dc3ca03fd007a080fc3310e5c0b17100ec35d0cd70391080dc319e60af5798601c3da121c71216f02c329092d091a0a16c3ce04fb002d130bc32f081a09d60118c38d26772d942303c3050a82059b0419c3e0022610c6040dc38608c4036d090fc3a50376051a0917c38e1c9a19bb1104c31c11670b01130dc3f200ca038f080ec395087d0a3b100cc3e1000d001d0000c33f07b20231071ac3260ab503320a14c3782d9324174d03c36c045105de011ec355383d403d4003c3cf03090fc20310c3380b050ed90211c38d1c6426831f04c3be00e200140000c376040a0827071dc3c106b007e9020ac3a506ba04f0010ec3d600e4007d0000c338428229ed0603c3160ca7043d0a13c3de0309164a100bc37c0491037c041ec3ea01a3040d0c14c30711a806da020ec319e611ee33cc01c3b70231077b041dc307091a09e60119c3f5009004860419c393240f50354303c3870650088c0514c3e800080864051dc343bc7986c13e01c3ca00e900940000c3310bf800cd0212c399067c08a40510c34013c405e8020ac3e3007c04df011fc3ea02e702b00809c3c704d003d4030ec3728d50afb04f01c35e359722b31903c330080d09b60219c3ef01101ad40409c34e070b0a150a17c328089704d00119c3690a490ce2010fc3cf02040e020e11c3ed002609910516c3fe01c13eb24d01c378135019611607c3231b6513181c08c35607b8031a0917c38805040a940417c3201226123b100cc31719c506461409c377047c0434071cc3630f7c0df3010ac36c078605bf0315c3f0020224f40107c39d04c402970416c36505ea003c071ac3d302c802230a15c3bb03bd03420a12c30c79216f973402c34e0c520ce5010ec3be03d7023f0b11c3b30c0829591b06c35c05d501d2011fc33d0e500ddf020dc3d6068a13102706c3cf040c187b0d0ac39207360e92070ec3050a4e07430719c38b046d05de0119c33c0f2e10ef010dc36106cd02800518c3e21d0bf4936c01c39e030809b7021ac3020b6606830517c34f108c0ab2070bc3091295080e120dc3550e36101a130cc3ad0d9312172606c38506fa00330a13c3420e540dec010dc32107220776041fc37308490ade0111c33f408d265e3503c32a0714084b061cc3c802d102470913c3ac03bf02ca0217c3b0273c61157502c31200e200bd0000c33d09030c850614c31d0f4a0cf1000fc34b24a412a11205c3bf02b2039d0416c37c05e401ca0219c35f20242bc00c05c3bc029603e7001cc3ea03431afb0007c38604f400bd021ec33ec16b9426d901c38204cf0144061ec32607890367051ec31527611a0d2806c387047f04c4021ac3a806690a95070ec352051e0779041ec363275929d10b04c3181c6c12ef0208c3470c450c2c0e0fc33c083a08930418c3990e1c20ae0b07c32e291e2d3d2605c39e08830a95080cc3050f8b07410b10c32f1df900341d07c35e0e261329130bc3e1019a047a0615c3dc016b05a8031ac361098607310c11c3c007a50b3c1808c33112540ff2010bc31009ed00f90019c390032607ae021cc3c50053000e0000c389003200610000c3df05b80b5a1b06c3cd02ba04ba0411c3340c7008d20210c33e26e804d80705c35a14031f940d08c38e10be09032407c35b0a8408b1050fc3af034a08430815c3a407db031d120cc3960d7c10c50708c3ce03c0048e080dc3cc337f8022dd01c3180a8c05260916c34a0008000a0000c3e41bea1515ea01c31d070b080c081dc3d5042a17dd0309c3f800c5030b0f10c3700fd404441409c3240ec40381080fc3b5022b085c061ac38907af05d5020fc3430e1811480e0dc353096807ec0113c35d0c0a12600c0dc397004000b10000c357219415502305c3e9014409700713c35607bb02c50217c3691e8718831805c3300e900719100ec3730e5c109b0a0ac36105a90277041fc356180623f60107c3db020810fd000fc339c67c8355aa01c3d4012f080e091ac381094d0c4d0c0ec3120c380a370a13c323075c05c5021cc33d08d301c50217c39705e001ed0014c3b8235356eb0a02c39b09ad07b7060bc376044d06f9001dc3070d150c380a13c3a5069307c0040ec3c902d302570813c355063d07210819c34e078804020a19c39803340771051bc34510f40107160bc3a307211204140cc38a3ae60cc01f02c325135b0e17150bc3212c3528282b05c3b202df0123081ac346085807440816c39307330dc1040fc3505779434f5802c3ca024607320819c34606d40144061cc336c949b6af5001c32424c00a7a1606c33c0818098a0418c32d10450ea3070dc39a321674f90302c38d0ea00bcf0608c3dc23c03f6b9401c358a71ce3d32c01c30a7ae60c475c02c3102215217b1207c38a031f073e061ec37e041b0814081bc30f155e0ee8020bc3e203d7059d0c08c333227217471e06c3f800760a3f0e0dc3122f3d26212c05c3f900251b0f1e08c37c06fc00600714c3fe00fc00ed001ec375068605c30216c31717f00126150ac37b0ee502730f09c31920fa00331d07c38708470c1b0f0fc3700b8a0980090dc3850412099e031ac3dc01dd01ac021cc3ed003008cd0219c3dd02210d4b0b10c32409070a920417c3390b77085c0911c34a14bd07ed0209c37c120823e70307c3c5027805a80317c3920317076c041fc3440e8409430e0dc34bb46c938c7301c31b26df052f2206c3580ab404ba0410c3a107c005e1020cc3fe000c1bfd0009c34606ea0039071cc32008970432071ac3c404650b710a0dc3e004bf09241f07c36b0af50079090ec32907a703d2011cc3f602f9019c1804c31726ea031d2506c33c0de102260f0ec3fe009a0391031fc32e34083db11304c3dd055c1bf10206c3b80b5b1b2b2306c3dd02120fd2030fc3820cde035a100ac3d1029b05110c13c3d602d302bf0312c33208a304740617c353099505280b12c3e8007305760519c33b08030af30018c33111d103790b0cc3d903710b1c120cc30009a203e4001cc3f3002e0a3b0914c3fa00090a960417c3c1039b05510913c33b06cd0178041dc37843296ba92b02c35f05bc0222071dc33119ed02ea0208c397048405830515c37106b203f70017c33d0b9b05650911c391379734bb2202c3f102391c611607c3f503423f443e03c3bb023308a40318c3d00fcb11164d03c3e501fa004e0a11c3dc04091e9c0c08c3060ded00820613c31e001700560000c3d901c102dc0118c32f121115d9030bc32408ed00640619c37b21cf0cbe1004c33a0ab204330b12c3c30ff103e80504c3c605bf06b3070ac37b08390d70090fc3090d190c010e12c3bd0512120a120dc3370dc2048b070fc3f700690a540c0ec3720f3516601109c38e06a3051f0d11c3e606df085c2804c39137a32e147502c36b076807d40215c3bb16a81d1d4b03c3970a9f09dc030ac3ab0301091f081ac35b005c00f40000c31e208910990e07c321373333682504c3e400ac02da011fc3b3034907bc0218c3d308c50bfc0005c3030e2f0b170c12c38f04060936071bc3da024e0b8c070fc36e0d540fdf020bc3d603df02400f0cc3e7000c00fc0000c3bd033a0a110c13c37b05d201870517c385078d07420b10c3740f111af90009c345060309ae021cc3e901ad05ee010fc320252125cc0806c37e125c17d80507c3da016a06d90117c31e005700d30000c3ac0479064d0814c357157411fe0008c30c0a5a06030a18c374051c0830071bc398037d05a7031ac3770698043a0816c32d001200430000c3a8047a06770615c39405ec017b0613c3290b60084f0913c31a0c080dea0112c36c0ae90194070ec31f00e3006c0000c3e307d50a941a04c3040a000a5e0618c3150ba404340a14c3f900ad030b0919c3f5050c79ca1a02c37910d804f10108c39d05d502f00011c32b08be0245071ac3e3011b0870051bc3850596051a0a15c36409da02600911c31108bc029c031bc3c108291e5c1707c35057c91b8c3902c3d306bc09811207c32f2289131b2606c3d6298f70e21d01c3000fa905a00510c33b08220ace0216c3060eee01690811c3c303ec015f0813c38a03d00181041ec32e11bb0505140cc37b0e5c12401509c39203b802fc001fc37c046c05fc001dc3230e390d490c0fc3f9009605a50512c34a06680539071ac3d304960a600f0ac3750575056b051ac32b0887042c081ac3f503cc11643303c34f085c07ec0015c3eb00f80010081bc34609e401b70314c3380b8c06820612c3f700d90188031fc33909ea01fd0014c36726b412a01704c31109e900330818c3f5036633184d03c3970a5710e1030ac39c04090c770614c32610640b4a0d0dc332078704b9021cc3131d4d16561508c3f405cf181f7002c36f05610579041cc31300a800df0000c3f70497348e3802c3300a1e0b8b0613c35905770491031ec36505ca015f051ec3650a420cb9040fc3f6008c037e041fc314125c0c6b0b0dc3ce00ae009d0000c35a098e06e40112c383298329cc1103c3560a540aba0410c34408c102c30215c3ac044209bb0314c38405a304af0316c3520e710ba1070cc3e400f100d8011cc39814651e0b3005c3030a1c09b40319c3fc006e0bbb050dc35d06670523081bc367065a069e0418c3cb025b06400718c37b162125d30706c32118b1080e1a09c3ec00fa0013081dc328089b03af031ac38706b204b60313c3c303f700b00411c3aa058f078b0710c36c0efd00810c0ac38808f7002f0e0ec3bb44a35c0cf301c345ba09f650af01c35f05350641061fc3200ce6016c0812c3bc021309b5021ac3bd0235081a0918c337c8f90654ab01c36c000700150000c3121dea02f30108c3a15e728d05fa01c39d0adb046e1009c3c003290a6a0714c350002d00c20000c3fc03f00ff70801c3330d90075a0b0fc36f06a404fc0016c3360f400e7e090dc3570a2b0d660910c3e6084f3a832903c3c2149f20762d03c3320973066d0616c31e38fd000b3d04c3d901140a040a17c3b7039e04020c15c38a098209c4040dc3c9026807ea0113c3d2013508500717c3cc039007f3000fc3033f6626c90d04c3030a8405800518c3b802380761061ac32d09130a5c0717c362062109830518c39704de0187041ac317003a00ba0000c31b1cc5075a1408c35115f8004a1608c3a9038f048d0419c36c052e08ac0319c3eb002d07f6001dc33e0944080b0b15c30618b307880b0ac3fc00211f6f1407c324091e09b80218c33108a803a40319c31f09e7019b0417c3360d490c93070fc382086c0970090fc3c903070e050e11c3f0009004060919c37d05eb00150a17c33b0b5c09e40111c3c13ecd32bf4001c3be089c0c241b08c3690ac8035d0a0fc3a100d3006a0000c3a55ae91640bf01c3b917194cdb0c03c3bc4345ba669901c37a07dc01000e12c369057904de011bc3bc06d304ed010ac33c0bf800470a11c37307ef00e60114c3bd02400630071dc3620c7f0999070dc3dd03930c361609c37f061d0bb40313c31e088b042f081ac34a19c3081e2007c33706f2009f031fc31d2df502751b05c375067c06310915c349085108f10015c3fd00b704660910c3df1070476d4902c39107730a02120ec37910ca06df0408c3170a6a064f0816c3bc024e0681041dc37f09c1046c0a0ec397056b07dd0113c3c002d6019c031cc3cf06dc04711108c38006cc021c0b14c3e102d103fe000cc306081e0736061ec30a12890914120dc3bc169e20ca1103c3be20a22e5d5102c352060109eb001cc3f900fb00d60119c3710fd2057b0e09c3b1037105440719c3800516093f0818c3ab03df01190919c3de00a8008d0000c3cf017704b7021fc356079704100918c3f301d403ad060cc3c3041c10d1030ec3ef08e60cd21602c34906ef00ad031bc3c40b7c1a941505c3cc01d801a8021ec3f003ba11ce0c04c3619e0bf4bb4401c33206d20140061fc31011670a550c0ec38c06a905f40011c3ec00d301d9011cc3630583040f081cc3a503d001460719c37c05b203610619c32f09fb003e0915c34e07050ae30118c35d098807520a11c3580b14108f080ec3af0032002f0000c3a904eb00240a15c394047106780616c3f2001f0c700712c3c837b14e42bd01c3aa06e801600c0dc3f0019706cf030fc3ce043b118a0a0bc3d30b8a1dc90d04c37e07120de30111c34306fe0090031cc3460b1c0e6f0910c3af021708db011dc3b2022e074c061cc39004b0036a051ac31b4c7c2b712f03c3e900b203df0117c31e1417158d0a0bc3ca115d36b71803c31d2d761b9d1305c3af060113480e0dc36a05fd0075051bc3db03d403cf040cc3d601650580041ac385062c0ab10314c3c2066f0e23160ac3460bb1049a0610c30c226d14391c07c3ef003d08730518c38d050c0b390916c3e403db05b10b07c35807e0012d0916c33407a70344061dc3eb007900d50000c397220055035403c383115b17771307c3730cd70337120bc30124eb02e40307c3ee03b70eef0305c380058405580717c3bb0d6a1dd00905c33e0e770ae8010dc394054609f70014c31077634ecb1a02c3aa03ca027f0517c3700657086d0615c3d801b1021c071ec37a0d1117d5040ac33c09a4044d0814c3b712c00f961a04c37c08bf04fe000fc38c08e601c7040ec3dc02ba04570a10c3e9000b0a220918c3c800bd00040000c35a0b7509470d0ec3c7010f073d061fc37005200751061cc31c0f680a2e0d0fc3a30f0629601a06c34206e400e3001dc3fd02de210ff001c35708410a4c0913c34fb0708f17e801c3db04810e351609c3c903c003f40010c37744c11f8f3802c3ec000c084e061dc3a00dd0060b2207c3f700f9004a0a12c3bc036007670714c355076406d00118c396343f60505702c3f4005c089a0513c30b51443e075203c320002400460000c3071ff900c20708c327078c0382041dc3e30235105e0d0cc335065905e9001dc388275e35683203c3853d5555087b02c38c048904ed0019c32424c00a092906c399049204010a19c33643af1aa51e03c33e0c2f0d420c0fc323084406e4011bc358088406bf0313c3510a400b450a11c32f08fa00360819c37905b003240819c31a0d61091e0d11c3010f4f0b950610c3f400000944061cc327d853acf30c01c331220d28c20a06c39506310ca50511c3a0034607630618c3de21b34cdf2001c3130a070afb0017c3a604c402d80114c3d106ca07771307c3b7027c044f051fc3f9004d07e60119c3e701b204f70011c3e5029f0a8c0c09c3be02730529081ac3500d4b0d3a0f0dc3b6032b0aed0014c3931554229d1305c33dc28877986701c3c205ab07a3080bc313002f00090000c3340ca205990610c35007f700fa0019c3f000f6005a0912c3380b6708300c11c3e51a11ee3bc401c394038d049a031bc3fe00fe00e90208c3460b67096e0910c31a19740fd30409c36e083d0bf60011c3f700ee00330817c3aa2a0f78cf1802c3da01870430071bc3d702010eac0411c31a0e310c1c0e10c31313021516130cc37406110bbc0315c3620abe04230e0fc39a03db019f031ac36519fc00451f06c30e0da405dd0112c3930ac206aa080ac3fe008f08e3020ec39403e500d0011dc343069603ac031bc3c408c608122107c3c80160058e031fc3460c0110d3020fc30a0a2309370817c36b0d2f12a4080bc3f501151de40308c33e10a1076f0c0cc31e16b207630f0ac3e8023f11b7060bc31c14a2088e0a0bc39903bf0269051cc3c712a41e483d03c3c105b6063a110bc37305c402140919c3490d2e0ec2040ec3ab05b7048f070fc302082507a9021ec3170deb014a0a11c386116d14b80a07c32b0bc3032c0b12c32a094b07ae0317c36c15d805bd0907c30631f701562105c3130810088e041cc37d0a7e09ad060dc3921b1d38c60e04c3170e3d0cb70410c312210324d20607c37a1ab30f991405c30224a80ce70307c35507b603ee0018c38b268927513a03c3dd021213b6060cc33f18c607c40708c3670d4e10ca040bc37904ae0244061dc3e901d602760712c3b14ed8275ca301c34910ef01e4020bc3fe007c04f8001dc31f0a5307ba0316c3a603b402c5021bc3c902e301250917c3778829d6718e01c37223492d3b3104c3360f9308670b0dc31b0e230d070f10c3ad008a008e0000c3c60e9819f00304c3639c857ad32c01c33821bd0be70406c39b05260c8c0611c3c90a4225891705c3b4255057565402c30c0c0e0c3b0914c337162218591209c3840ce602940a0ac3a3058f06950611c3c302df01ed001cc390035b05f3001fc3fb00ea01060f10c30110db02cc030fc3740454051a071ec3c1040210dc020fc3a9044e08e00114c3cf04481004160bc3ec06fa01a91c03c36c24b712bc1004c3e103a609091b09c35f16980e062307c31815f8006c0d0bc3bc05e202ab060dc33d07f600f8001bc3c50b4f23093105c3d0032d1021110dc32e09f500e40117c3cc019303ed001fc3300a9805ea0114c33a08eb00c80217c3017f3e60a62c02c3090c0f0c030c14c3d0096d1d9f1305c33e0998055f0814c3820b910a41110bc337167d0e131a09c344008600320000c34306b10257061cc358372b46912403c3461a0b22a10d07c35c205721791a05c31b11bc05730a0dc3001cbf07c80609c3c303d502ac0413c34e08020c360a14c395031107fc001fc3be03b403720714c30f11e202550c0ec3ca0105083b071cc3521c7117ea0306c39107db02a1060ec34a063307ef001bc3dc052c23ae0d06c34a06ed0092031cc34a196715da0507c3d4016e05360819c3690b590ca8060dc3af06e801470f0cc39807bb05ea010dc3d501ac02c7011fc3e8001f08f4001cc38305020a5f0618c35e05dd0119081bc3e5017c06800613c3dd026509350b11c3c803c9030e110ec378055707610617c3500cd503be040ec3260b9205e10113c3570bf0015d0a0fc3bf0526122e110cc3f1013e15001c09c38827c912892703c38e089d072d0f0ec319096b064a0718c3720695049b0416c369050e086b041ec36f05240723071cc3f20dde21b94601c37d205929273604c3e901630da2070cc3cd0ced04ee0404c3ba036d089e0512c3de022b0f5a0b0ec3a80c8f10a50c07c39607440cca030fc3db048f0e860f08c331096107a60416c30b11350e06110ec3440b6909870710c3a857ee1108f701c3aa034a08f90016c3d8029e059f0511c3ee0098041f0a16c37a13a40db50a07c3950451079d0416c319e6f30c51ae01c37f07460afb0011c31b397a21cc0c04c38b0a800b22140bc3110e070edb0211c3ee00aa0285031fc3b106d603310f0dc3503aed069c2103c398055409540912c3510f770c880a0bc397048d04a9031ac3340b5309110d12c3a1045d077a0517c3aa06b50593070ec3087b813fdc1102c3c902a5048d0514c3f40077044e061cc3c7021808ad031bc3f200e001df0118c3906fd728b54a01c35e17d106122107c3f00116134b0f0cc3e601a603920419c342070b09c00219c32c2a3428502305c3fd0094081d120cc3b213b313792104c3ac03d601f0001bc32d0b280b130c13c37409180f72090fc3aa11601f751b05c3be06c7056d0e0ac35a1bc709262406c3748bc43b46b901c39d629b64f00f01c3141d6d12441708c3ec001508f7001dc3de03fd00f4010ac3b003fd00950515c37a0c3b1114150bc32f0ca305540a11c3200d0a0e200d11c38a05100a880517c3ac1b5937553803c32d0783049f031dc370237b21ce0c04c3781bc70bd90705c356126e10800e09c3cd05d8043d1509c37111281adf0408c3b402a00390031ec386042308f5001ac38a08fd00340e0ec34417970db30908c35709eb01a60511c31b0aea00810516c3e700b900700000c3d80168059e031ac34a0a3b0b480a11c39106df01130d12c3f600ef001f0a15c35f063009070a17c3881d2e34023f04c3a9025e0567041fc306081d0736061fc3c5028e05e20114c3dd04d305361908c367000d00d60000c3639cca35cc3301c3cb03620a360d0fc3dd11674c505702c3b907900b0e180ac39603ac02f8001ec3f000700437061dc3a9045708680714c3ec010113e1020dc38406080ce90114c36a31f802c01503c35c078205d60117c3040ac502000a19c3260bd602530913c3ee003009140a17c32c1a910daa0a08c33c274e23d80705c39a0a31149d090ac34d06c602e7001ac31a0fa106cc030fc3ef012418f90009c3f0001d0781041dc348245f20382705c362052e0717081cc312edf40b40bf01c32f095c07450817c38a08b505570c0ec3f1003e0654051fc33e306e24de0804c3ad1468251b3904c3d403870a1d140bc3e6022917131a09c39b039403ee001dc305539a215d3603c35511f501c3060ac323100b1288090dc38e055309ad0413c3140d180d750811c376229c182d3404c3b908c4077b1008c36c0d6e0d620e0bc3170855051b071dc39415f302532205c3010dda011b0c13c36b06e201990417c34608fa000a0b16c303199d09870c0ac323007b00d00000c3d802c603630812c3b2196e30cb1103c37709550cc2040ec3d902cb027c0613c380048604a0031dc3047da72cad2902c33f60a22e3c6102c3b80292046c051bc36c0d0017e1020bc31708a20302091bc340264724dc0705c373172224481e06c37a0aaf0690080dc35f357e2bce1003c3ac05480cd4020fc38004e80039071ac3ea009104ae031bc3cc03ec013e0c10c3310b100db40412c33e0e470e5e0c0dc353060209dc011ac3560622074b061cc3f5000b0c670714c3740775070f0c13c32012d60304140cc36d05ad03f2001ac304106d098c070fc3f7003f0e87090dc38a04f200fa0018c34b0844085c0715c3d50185050b0a17c367042806bf021fc37f00d700f10000c36d142b1ef80107c34d062108cb011bc37d0db307fc000ac31c2db60e142f05c34d11e502630f0ac34b0678056d051bc313170d18db030ac39d044d07500717c3840423080b091ac379136316881107c31c00cf00020000c3ee000e0ae70118c30653f503e90703c3f00073077a0614c3400c280e210e0fc3aa044408650715c35e054c0570041ec30324e7031c2007c32e1d6116591707c38f088509620c0dc3b005430de3020ec3112f2e29b00f05c388277c2ba21f03c3de21a659629d01c37e0596046d0519c3dc03c806780f09c32f45702fb01a03c383077d07ce0211c3ae079209720c0bc33e4082299e2003c34506df0116071fc3131afe00431409c368323045f40303c32b2ada07362805c3a903270876051bc3dc07ba0dcc0a05c31d093108cd0217c37b044a0600081ec30b07cf01e6001fc39703cd0175041fc3cc031a0d7e0711c3ac0b471a0c2207c3e20e5b52206f02c3b60388054e0814c3cd02af04b50412c3eb1406f9639c01c3c901190715081dc39e03fc004f0719c346085e078c0517c3792c24491b4c03c39e07ce0383090dc380057205be0218c39212c9095a1b06c3c601c7017b041ec3ac035e06d60119c32b15a9082f140ac39c0e5618721407c37b05dc01b8021ac38a04dd01ac021dc32011b80516110dc316745455704702c39203a902df011dc3e8007705450718c376045f055e051dc378103319231b08c3a1068e08e9010ec38200f200bc0000c3bf03110bb30315c3cd014706f9001bc3cd020d09110919c33428761b532205c37d04cc01eb001dc317082108d6011bc32a0b3a0a9d0513c3000aad032a0818c3990e461a0e2207c37506df01ce0217c39a0c221b0e1e08c3d004860cbe060ac396349634ac2902c3ea00110802091bc375064608440816c33818c107b90808c3d701ac02f6001cc36907de01fb0014c36b044a0561051fc3ac062b10d4030dc3f807837c1ce301c3fd014c594e5802c36a10a40a5d1209c38605fa00d20118c334088705b80218c3c3020d0a6e0618c37005fc003c071ac3e4007400320000c35b051707c5011fc3cb05940aa3090ac33106090852051ec38705c702050a17c36609010f860710c317079a035d051fc3c50b80198c1705c3310cdd027e0810c357053e06e9001fc3a902330620071fc3fa00aa07c0050bc3a2088c0a0c160bc3620d0914a8070cc3de04d405701108c3570c720aed010dc3da013807fc001cc3f0011f120b140cc351186e14ed0207c30a0d4e09df0112c33408e001890418c315170b18970a0ac3bf027f04dd011bc3a3068f07340d0fc3f200c702a10318c3ef00b904230c11c38778b14e29d601c3f007cf18386302c3c002f100e3001dc3fc009f0954110ac3cb02ef00040a17c34f0b071084080fc37a135618381c07c396099f086b0d0bc3f8004f0bc5030fc31515bb06f0010bc39309f90089090cc37d0bc605be050bc31a097705ac0317c3eb007305590619c3dc05b90bda0606c3a5058d074c0b10c36c183222671906c31a0d67081a0d11c37f04cd01ac021ec3e201bf0252051dc351075f061f0917c3ee111ae5c93601c3e1017404f5001dc3230e7409c0040fc35e10e00357100ac3e801b305d7030dc3eb02041b9b0b09c3f900b6032f0915c36c1dc20cad1005c35721f003a31205c34208a8034c0816c3ed0080063c0914c3e202a308a4080bc3bf03ae046b0714c3270e6b09db020fc32707e101d9011dc3f3018e0a7e0b0bc3db02ea01ba0410c3af0d2524f20206c39336e80b525602c37d07bb033c0a12c307080408c3011fc382054207d20118c3021f101d181c08c3c904cd032c100dc319178b0b13170ac3d4016b04a2031ec3ef007f078b0611c3500e3c10bd050cc3020e090e1c0d11c34f006300b50000c35a087506ad0414c3b208ae09fc0009c3ae04e701130b14c31f08b1036e0519c3204a214a6b3103c3ec0092048f0419c3be04510bc3040fc3de021b11a4070dc3a2070713b5050dc36f489f30dc1102c3a50c1f20641607c346b92cd3798601c33d0ee5022e100dc33428bb0d861805c37609f50097060fc3f301fb00e7020bc37c0055001b0000c3aa0449080c0b15c3bb051412c6040dc326070e08bb021cc3a90a9f0c741108c386045b0672051ac30209f700dd011ac3bd03ea010f0c13c35522be0dd90705c34f0de002f3000dc382042b082d081ac3f2017d0afa000dc3fb007e10021f08c3c7022a09c80217c34609300a4d0814c344080b0b850515c3d30b133b4a2d04c3b604f000c70312c32709bb02f40018c36b08bc03df0111c31ee1c53aa45b01c34b084408fe0016c36106ef007f0519c32636961ac90d04c3450c680a9b060fc3eb010510ce030fc32e0a080cc80214c37a07410a8c0613c3400f780b98080cc3c2039f05da0113c35d0e500f650e0bc338000e00220000c320164d111b160ac3b2042d0de70110c36009390c9f0610c3a903100829071bc37d0bb007cb040bc34f060a08a4031dc364063708350818c36c0419077c041fc3c2021a09500717c3a003ab03770518c332cd04fbdd2201c3ab2a465c983302c3e503f800411708c338314d2c033f04c3b0035c07540717c3772dde0b3f4003c36c31503a9c2103c3b5026a0535071cc392057b06ed0015c31c119408320f0dc3fc00d4015d051ec3b5005f001c0000c30b18a90824150ac3840984098e080dc33c09a204d70115c34d0e3b10a0070cc3380f0e12ce030dc3ef004e070c0919c37a04ec0015081bc3fc00b203920416c3b802d401d1011dc3a304120cf00013c3ca068a0e0d1e08c328d7fe01e51a01c3ee006505cd011cc3e201800469051bc3db018a04be021bc33912f800ae070bc384049e03c6021bc3391c7d126e1407c34d06660515091ac3a20026007c0000c314ebc738966901c3cf021d09240918c3d3041d16df030ac3a2049305b50315c3d005dd03c40609c39c058f06910611c36609340c920610c31c253821731706c3b518f603473d03c3da015d0523071fc3e4003807c4021cc37905020b140a17c38706ca02770713c39503be0240061cc3bb07e103131a09c39207a206f1010ec38706330a420913c32806af0227061fc3a5032b08fb0019c34b0f9209460f0cc301109507ad050fc36b098b07ab0510c307164510d2040bc36205930385041cc3520bd8022c0e0fc328356e24133b04c35c096008f20012c337077e049e031bc349099705290a14c39b030708df011cc38505cb02cb0218c32d08ba02760518c370066e065f0716c3021f3119e20308c3e61950af39c601c3f1016f0cf4000cc3443e8a272a4703c36e086208060d12c3550bb4055e0a0fc3d6011307ed001fc31c0a8e05220a15c30f3cce0c732304c347069f0328071cc3a9037005970418c33112b606d8030bc3550ea307790b0cc3c205750be6020cc3027e31670f7802c39f038a047c041cc3711784140d2806c37e15b00d511d06c3f8003a1335140ac30608ea001c081cc3a00820147c0b0bc3de00cd002e0000c3f4014d1d4e1d06c371048b038e031fc31a397c205e2804c31d387622722304c34209e801240a14c33543a01fbf1503c33328601f083105c368121b1c1c1c08c3ea039e0d172107c3ef017c0d44120ac3a30ff202c50906c3010f4b0b9d0610c3680a8f07e1020fc3d7018804da011bc372054107060919c3ad10e505b30f05c3bb006800c40000c3562ad60af60204c36327472eb71204c3eb018c06a90413c35f08f100880612c3ee01690af0010fc321098605410817c3043e5c28432f04c3651e681e532205c38c095c0d670c0cc3340cf300e40110c36f12e5038e0e08c352155315311908c342bdaa5506f901c3bd025f05cb011fc3cd023c08b80316c367050309fc001cc3720c600e540f0bc3f7001e087d041cc3f700460d540c0ec3390ab703000d13c37d155a1b651906c30c0b52079b0416c3210a1c0a120a16c3141a8a0dd10509c33a2085144a1e06c38b26dd0b035403c36005600550061bc39f20df0a413f03c33a31df081d3804c33907b702ea001ac3b602af03dc011ac307098f04ac031ac3bd0bda06ea0306c3500a5c09370b11c33233c50edc0804c39207f400560b0fc31715f800650e0bc375054b07f50019c377066107400915c3c902fd000c0b16c3361c5e17721407c3ef01dc0341130ac32e458528374203c3a103cd0121071cc3040aae03dd0119c3ba02b9021c0918c39e06ed01ae050fc36b0dfc00860b0bc377050b0add0118c3b8021208c3021cc300087c0448061dc3d415833e3d6102c3d804930d3b1808c35f08350ae70114c3400d6a0ada020ec392040b0b3f0816c383048104a7031cc33506f00073041dc33c093a09cf0215c3be040b11240f0ec3d501d201b5021fc3e703ca06ab0a08c32817e403021c09c32813af078c0a0bc3027e206fe20e02c32d078e0464051bc3890593049b0416c3e001f4003b061dc3770489045b051cc345123e133b130ac31b0c8c06090d12c3e600b2021d071ec357079204fd0017c36208f900c80312c32b1a3719791008c3161de9021d1c08c3f101610bcb030ec32a0b350b120d12c31d09e401de0118c3cd054c13af0809c3430633078e041cc3c0028c04e80018c33a1c1d204d1907c3b3026005f3001fc3d606fc00a70e06c33e105d0d9f080cc3720a9708350f0dc36a096e0978090fc3c105840b790c0bc39c03b602ac021ec38009291087090dc319e6d827659a01c3b004250dc90310c3e501020957061ac3d106ee02481a07c3d4010f0a9b0416c3c203cb027f0712c34c599336694b02c3ba05550e8e090cc336164514760f09c3a10a800e970b09c33e1101175c0e0bc3c8015d05c8011ec3670b5c0cba050dc31d0a1a0aa70415c3650b400e7e090dc3620bec013f0d0ec3530721099b0417c3da01580523071fc3926da25d6a9501c3761b9714bb0d05c32a0a75061f0b14c34607c302420718c359372e45892703c3471a6915cc0707c37907b204e30113c34111f401a3080bc3b0028604b1021bc329081409880419c316070e08cb011ec3420c6a09690a0fc3530c4f0ca1060ec395061d0db10411c3e302460ebe050dc3d202bf04370c10c31717800c56100ac3b612e406762204c3c0048b0801130dc39906fe009a0511c3b703c5024a0816c35706bf0238071cc30e089f0311081bc39904a003410719c3100a170a980416c30b0ba804910515c39e04b503910514c32a0ff400e4010ec39305fb00070b15c32e088e04f50018c3e501df02440d0ec3830b9c093a110bc38909710a3c0f0dc3144ee4098b2603c33921ae0d302206c3a003b303de0119c3ea02e702700e0ac3a9030809e90019c3572acf0c4e2c04c323143012820b0bc32c083e08210918c31509c702620619c35307010a650618c37904c2025c051ec37b1a3029522205c3e6197c8324db01c3e9011c0ada0115c3a512c20cc80b05c352074e08650716c33421f901ea0306c30a10c603510b0fc31900a9003d0000c3b202c60164051ec38f083e0ecd030dc37b08570a560a10c3d901aa03480717c3600088001b0000c3b2039304840419c3a90c261f032407c35f08ca02690714c36633e608c81203c3c903b205d1030ec3720042004c0000c30f0a3909980416c303095006d7011cc39604a203950419c39805c6039b0512c3ba22fa02017f02c35307c802e30116c3be41f609eb1401c34f58fe008d3902c35508a204cb0213c3bf04430ed1030dc3c2030b0cf60013c34406fc00cb011bc35122be0d1c2d05c3e701c60419110dc313088104de011dc3f500940305091bc30f095d06bc021ac3e7009203eb001ec3792c0f503e4003c3150fe4014e0b0fc34108e801160a17c384082d0e0e100fc3a5067709b3050fc3d102e9018f0514c39a06e501680910c37a0479043d071bc34400d000c50000c3cb055612970b09c35e14ca066c1208c3d3006400b10000c3c912e10a762d03c3ee0056056a041fc3b9083219581408c33114db03620f0ac316074f05cb011fc3ac02ab030d081cc3a90477064c0814c35d084c09f50013c3b603c702010a18c3164d3e40264803c36407df01ac0316c398675ca32cd301c369253432712304c3dc014406a5031bc3d7019704fe0015c3a407a20700150cc3c502120842061cc34506b902aa031bc3c80230096b0715c31e0c7107a80412c30c07180772041fc3ac04c903560911c39e03f100d9011dc30a1e3d18311908c30f0ab7033c0816c3e8176e918c7301c321071f0716071fc35d052f0674041fc38d06ec01ce0211c3c302ad023c061dc303320e30671e05c3ab1cb419ee0503c30b0709077e041fc32107bd0257051fc3190c1d0c9a0512c36505c20234071cc39605a704f30012c3260a1c0bc90214c3ed011c0f300d0fc3d003f600f5000ec312edea15e31c01c3ce01650501091ac3f302d806bf0a06c39e204d3be50803c39703f10011081bc3d30eb7185a3703c36d49bb22117702c3a6040f0b570815c38b06e501380b11c383044007840419c3ea15c837de2101c38a17ea04302905c3173ac90da21704c3900b1717c6050ac35710a7082a150ac3b4029203cf011dc39f07d6030c120dc3f40b708f14eb01c3ef08236e7a4202c3d901e901140b15c33e2077164b1e06c36c07a5040c0b15c375009f00d90000c3ad1be608802a03c3520e9f0836100cc36708b304810712c3f0033c27701c05c38009420d7d090ec322092209800518c33d07ac03160919c33b106f0c830a0cc34b168f0e641308c3cf10513acb1103c3e2041027bf0a06c3170a4308910516c39c043109a70415c3fd005307b20318c30b09c80201091bc39d096a0ec5050ac3de01d0025e0911c3330c6009030e11c3190a9504810517c3c4022109860518c3b902ef0017081dc3f4000709bd0219c3472e492da21704c3df013d0b220d11c3820c0618a5090ac3650f1117b8070ac3590659061f081ac39c215738184d03c36200bb00d80000c3f5009203e7001fc347080c0ac70217c35d10da0315170ac33a07110950061ac38b26a71d294703c3611fb60e592105c3ac1b0d50822903c3cf03560af10010c39012451fde0506c3fc00f600a5031ec330087005400719c3660c780b1a130cc3c0027e048f031fc3ec09be20415f02c35d0b131078090ec3e7005e0534061fc3110d5f08d00212c3700bd30308140cc38e034906ea001ec3fb00ba05e1020cc3461af401fd0007c35c061c09820519c392089408c6040dc3af033c0763061ac390048a04f80018c318077f0481041ec305088a0456051dc3541c551c2a2306c356096009fd0011c3d602080dda0212c30009a30360051cc3b605a406370e0ec32a15fe00f7000ac38105a903730616c382068606090d12c3023fab15a81504c3270e9e06190f0fc3bd040b1110110ec3a20fb00d4e1d06c35207d002da0116c30c084f06d3011cc31309ac038d0419c3710686056f0615c3da033b13d8030ac32e09b703fb0015c3ad038005410719c3fa008b13af0d06c3a50b031fc10708c38306c6037e0712c30a0fc203a70510c39c033307bd021cc3b525ea0adf1002c38407330c390c10c3162e671e691e05c37a05fc00140a17c31717720ed8030ac3a403190845061bc38104bc0225081bc3d107491e1d2506c35754813f943502c33e11e502670d0bc37e0e4215571209c307f830cf38c701c3a802e3005f051fc3cc025508d60214c340002800f50000c3c30ae903b60c06c30132f701ce0905c35d05c201e6001fc37708d7028a0611c30d166f0d34120bc32c2ae305da0705c34a06d1011e081ac3db020a0db70412c39504a00394041ac3b512cc0cf10304c348097606420914c3aa07540ec0050cc3b6037106350915c3b9113033fc0004c31f20bf09661507c325126a0c9b080cc37545634e833e02c3351032112f110cc36a958778bb4401c3cc011a08e9001ac3762226363b3104c34e07ba02320818c3b209ca06601308c356122d177e0e09c3c1037907f00011c3340c8f07eb0110c3f9003b1c461a07c35a52e70c077c02c36e07f700ad0413c30d092e08c20219c33d060e0816081dc3410e4b0d690b0dc36c491973366402c3c01ff803f00702c311095606a4031ac3700b900932110cc3fd00880328061fc315ea05fa29d601c3a8043d0ac50313c3520c270f4d0c0ec313175a1051110ac39d085a0f9a090bc35e11ce05191909c3d9014608e60117c3c0050015e4020cc33b13c0069c090ac347066605fd001cc3de05441fcd0806c39a03ae032a081ac33e0757063b071ac34317e603c50708c3bf03410a410a13c3d804001cf60109c3141a2418401509c3cb012e06e8001ec3c2054b10a8070bc3ea00d501c7011ec38f040a094d061bc34508f400bf0216c31e1cf5018b0e08c304087e0426071fc3132fb40f921505c39f03380656051dc31e0849078a041ac36d189312fe0006c3a0030309a4031ac3cc04cc045c0d0cc38a04c1020c081dc32e143114750d0ac37a04f000bd021ec312080408d4011cc38b04420736071bc38a06dd01600812c33a0d7d084a0c0fc3f8004d06c4021dc3ea03f201741307c3eb016208080d13c34a0013004f0000c3b304bc031a0c12c3b408b508351609c334217716b50c06c373092d0e89070fc3b802f800df011cc3e0012c07bf021bc3ef005100e30000c372045005c6011ec32f08780570051ac380080610580b0fc3aa0285040d081dc309109b0607100fc33b085507c50216c316266d188e1206c30432c10c322905c39708ab079f080cc32e074f0659051cc3c0028104c1021ec3ec03d507c20a06c3410ab204fa0013c3f4004d0d5f0c0dc31e0c190c160c12c33407b602a2031cc3ec00a703a00417c3fa00fe00511309c38c03d50131061fc34f2ca815d80904c32a6a9a32b12702c362056105ef001fc30519660f870c0ac3f400fd00cb0215c30516830bd4030bc32e07b70207081dc3ab06f10104110ec38f04ea00ba021bc3b6066d0d790c0bc3ae10e205ef0305c348165615281a08c38f0ad703570f0bc39404cd02810516c3cb07da05281e07c3df087722622704c3a7039f03ab031ac37422871ebc1004c3e8016806cd0216c3a100d100330000c3b8027a059c0418c3830af600d7030cc38c00d700570000c3e00f7246137602c3fd00960466051ac34708da018c0517c3b303ab03a70319c3c51d3f60047d02c32408bb028c0419c36c0e930a8d0b0ac30e07e20035061fc3a809730fee0109c3eb02a40a551209c3c108de04691507c35507b703e30118c36707d402350915c365052e075a051dc30c0e7e070a0e11c3433e2c46ef0503c36027512b093d04c39504f600cd0218c3fb00260dd00210c389047105b80219c3d702400b650910c31a0a70069c0416c36608c1030b0c13c37905e501f9001ac33e260831fd0005c37706b103cb0215c3c0036609190d11c3bd03cb03740811c39d058206420913c3a62cdf10595302c36b25133b602704c31911211123100dc32a07f300f2001bc3721ccb0a771b05c358219e13bc0d05c3c6048609410e0dc3fd00c5026c0714c34b0a260ca00512c3650bae067a0a0dc3c602ce02930514c3c3013506fc001fc3f800490ac10312c36f09d5020c0f10c3fc013d40304503c3600db306d0030cc3b703c702520815c3ab0a3e18c00708c3f9012636343204c32509e201b40317c3bc03c902000d13c33333de084e2c04c3e601dc01d10214c3b104220d430b10c37809c004230e0fc39805f0005c0813c3c10661111c1909c3e40d654d833e02c34d08c302250916c33d0b6b08f30011c34d06f200c5021bc3550c1a10a7060ec39803450663051bc307290e287f1506c3f9007c0e2e1709c30309d70129071bc3ba02a003cb0218c317099304380818c3ba078f0ca00a09c3c703c803dd0211c3c601750443061dc3160830075d051cc3240e150f6d090fc3aa048006d70213c309110f11200f0ec3e4032b1e5c1707c3470c1c0f330d0fc305323c27322905c327485339802a03c33d07a9035e051bc3070fdc02530a10c32c077c04ed001ec3114f01544d3b03c30b0983049f0319c37744b027714702c36f08d302140d11c3940ff501521807c3dc02c8047c0a0dc3c503b803d30213c3b0057f090a110ec3d8013908540718c39703b50244061bc39f0cdd041f1c08c34a24ee03e10605c3e700500606081cc3dc01820445061cc38112301def0207c3f7005106d8011dc3fb00cb028c0419c37408a7054f0a11c30c0c5a08af0413c3d4025908170b14c30a0a7306540717c37c04380709081cc3af50ac531fe001c34606700541061cc30e082b07c9021bc34409210b160b14c327074c05f4001ec3851e3033402f04c3a003fa00b00319c3e9007f043e071bc3f4002a07aa021ec3bd07de03481409c3db03df02fb000bc33c07e201e00119c3a1037604b9021ec319737943057d02c37311d605341908c3aa05510ace0211c38a05f000a90317c3e205701cbc0d05c311174c114b120ac3cc039107aa060ec33b06ee00f4001dc3211bcd065e1408c3eb01e202730a0ec3b8048807ad0510c3ca055d103a130ac3bd02b20208081cc3a904040da70412c3c4024d068c041cc331093b082e0916c37207e0019f0512c3c9367a85cc3301c34e050b08f1001ec36f186619182606c3560cf700b0050ec3a80ae6035d1408c39d046b07820515c37107370a5a0813c32008ed00c70219c31107cd01af021ec3c3034809ca0213c3e80be20ed71402c378043906eb001ec35b074c08a20415c3d702080d9c0513c3ac04d502e80114c3fc00d105151a09c3b604b803070d12c3280ba7041e0c12c3931b422fce0c04c3fe005a05c3021cc39d03f7005c051ec3d102eb010f0c13c372052f0788041bc3ac06410fc7040cc3a800d400190000c30019d704ed010ac38f04090858051cc333079c030e081bc33311d603ce040cc3540d4c0d93080dc3bb02b40267051bc3c400c300e90000c3a805240e8e070fc3bc4366994bb401c3e2016b085c0911c37a2cab1cae1b03c3f200bd0292041ac3b50e8f16ee0305c3043e801f0a3d04c3f5002111f0010dc3e1016506e00119c3b307a908a8080ac38c05fc00410915c39b0028004d0000c3e9005000cc0000c3060b8705250a15c3af04300a350a14c3a90e6919541c06c3a9052d0e1f0e0fc397052a0baa0413c34d591475ea0a02c30b1be7025c1209c3ae1b5339f80203c3837c57a8ce3101c32308d80100091ac386040608e5001dc35111bd0644120ac3a212a611bc0d05c37809680a440c0fc3cd021f0de60111c332069c03a9021fc3a412212ced0305c338270033cb0a05c34a0ce801f9000ec38b04f9009b0419c30c1ea50baf0a08c3340b0d0d8c0612c340177411820f08c34c2c831fda0904c3a105b104aa0412c3090bb103ed0016c3960a331422160ac3f900c602eb0016c3083dcc0cdc0804c33d0cbb04320d0fc33d09b8039a0514c312079c038d031ec39204c802b40318c34b0ff301d0030cc3ac0d8314541c06c30e09cd0194041ac392074f0be4010fc30a28fd00751706c33e10f500800a0cc3c703480c140f0fc39903eb00b3021fc31107d201f6001fc3110c5608490913c37f001600a40000c3440baf04c00311c3f3023b27811905c3dd06162ed80705c33c093d09d00215c35a067705f00018c3001ca40a331609c3bf102c34293504c38607aa050f0e11c3e7001b0742061fc3f107d216fd0102c3510e34107d0a0cc30614eb01fb000cc378064d08440914c33e10391035100cc3cf018e0499031bc3fd00c90221081ac306094207570619c333665d51bd2102c3b9025906b8021ac3e70199047d0518c30909c60224081bc3ad037605a20318c31d1239108a090cc35f50455dae2802c3f500e401d00212c30a515439e70803c3f0003d07b50219c32f68465c7d4102c3de018f0412081cc35721ca0ae60505c3630541066c051dc3e701020b220a16c37e042b08b9021ac39215d907601f05c33e15870d980b09c3050c7307be0314c35615c307771108c3c70e6825343204c30a093a071a081ac3810c261527150ac376046705ac021ec3ed01580b02100fc3991936325b2904c36b18cb08c20a06c3a1034607100919c30708a30252051fc3930576062b0a14c3fe002847095203c3410c530bdb020fc30d1e5914800f08c3610b640be1020ec36709420ba20510c3f50aab5426d901c3eb004f081b0a15c3db010908ad021dc34006d70110081cc3530d760acd030dc369059e034c061bc3740aaf06ad060dc32c2a6f1cc70b05c3d30e28473a4103c3143ae107e40604c3d1020b0cd50213c3a603a90383041bc3840a530e8d090cc33107e001c2021ac3200a5e07080b16c3f100700425071ec37b041c0795031ec3c705a807620e0bc3e600640545061dc32f1a910dc00708c38104a20359061bc3837c6a95de2101c3b5030e0af40017c3f500310731071ac3e700c2020d081ec366991ce3ac5301c3e9165ca340bf01c3a503c40271051bc3dd119833fc0102c3cb080b286c1806c36109af047a0711c35c0e0c16c8050bc3710cf60022140bc3ca0aa4120a3105c3010c080b550815c35a0b6f0a5c0b0ec3b202ec0024071dc3a1072312c5040cc3af0709164b100bc35ba45ea1f80701c3c10343093a0a13c3ac0295034d061dc3b4063b11b2070bc3ae06e10299080cc3ac1425367f2004c3c0021e0764051ec3db01ca018b031ec38511aa0cae0b07c30a08f900ac021dc31f11b205350f0dc338083408400718c36d097108660910c317261527342106c38206c5038a0612c30f15c305c1050bc3946be51a7e8101c32e0e1c10230f0ec38414581b1b2606c3a0048306c80214c354091b0c270c12c30400b200ed0000c37c0db507cf040ac3020b3309840516c3c801be022f071dc36719af0d761606c317191819111a09c303fcb748986701c366157114172107c30b7a5455555502c3790e970bb90709c3037e445d963402c39303a20304081dc39107280e6d090fc30b0ba704380916c3b103060ac70218c3ef086d491d7102c3890ee703a90a08c326369d18f70204c33428bb0db50e05c3ce011b08a7031bc3f9000b08fc001ec3770f151a101a09c32b2ad907342805c371087d08b00410c3d402c503970513c35d06dd012f0818c35e1ac809c90906c3180ca505540912c3f900e2019e0511c3d1025b0a450b10c3b50acb079c0e07c30613b305c1040dc34912ec01ba060ac3300af4008d0613c3de013d09de0114c3a503a1041f0917c30f086205cd011cc32c237217631a06c3880abd06e8020bc35d07a104000c15c397061f0e260e0fc3360f2b10f5000dc37804860347051fc3080af500f20017c3720be102440f0cc34609ce02310a13c3d8016606960419c3890be003e6020ac3d0027705760517c344081e0a000b16c3860fc806da0408c33e307f20043e04c3492dc00fcd0c04c346074407660618c39e037d046c051cc31c0a5707170a16c3ea023014dd030ac378108e0e581408c3850429084e061ac382080811b5050ec30f080009c9021bc3db039d081e120cc35b12e5020f1a09c32c075a05bd021cc3241f0b22990e07c36d05ce01980419c334109d0892090cc38903d3018a031fc33d611b72e10f02c31b0fca03f4000fc319e69b6403fc01c333070d08a5031bc37b429037a52d02c3e1018a07da0210c3ea002100c40000c35107f300770517c3d2018c0314071ec3640c740b6e0c0cc3ce03ae054d0c0ec3d202fa001b0a15c3e307e606512b04c3a35cd02f4ab501c39d04c602a20414c375073e0a070d13c3f401850c990a0ac3640bda0274090ec3ba05a007c6040dc3f501980b7a0e09c32507ee00e0011fc3f701ba0b282306c3a503b10264051bc37405ce01cc011ac37504040878041fc37b12ad0b4e1907c3630c560d8f080dc3a2051d0e4c0b10c3e7066027801f04c324132e1324130bc30600e600fa0000c3460a8a064b0a12c37607f300db0212c3bd08e203e00308c38b0a510fb1070bc3ae043809720714c3271eaa0c1a2007c3db04141abb0709c354062c08290819c3580d2312d3030cc31e4b8429344303c320093108620618c3ed128778f40b01c38e06ba04b70411c30714aa0799080cc3420c0810310d0fc35e05d60123071ec351063307cf011dc3d9031717e3020ac38c055108340915c3081e9f0cb50908c3fe000212e5010ec3fc00b804140d11c32c34133bd50a04c363063d08000b17c31611e4023b0f0dc36416c807b00b07c37807de01d30213c37807aa04f00012c37f0429071a071dc37905cc02a80319c3fa00f900f20015c37c12371cb10b07c35612940b061b09c3cc0434124e100bc367077c06070c14c31b097406420817c3b00bc009032407c39d0ce603b40908c39005010d0f0c13c389096c0b85090dc3de06202ca61105c33e13880b20160ac3910a4e10ba060bc35905590528071ec3c41dc81bb72402c378054a06cd011ac3f401ac0d3c2006c30713aa063a0f0dc31409f400200918c3fd00ab1cd50e03c397078009da020ec3460962071f0b14c35e14f501ed0208c32c1312151d140bc3350bd102e30111c3ed017b0af0010dc31621441acc0707c3da069c10382106c3f6000a165c0e0bc3ca01760420071dc31d71bd210c7902c3050dd802ec0112c32ed123dc32cd01c32a154712d5040ac359a6fe0151ae01c35907ae037c0517c3130ec5035b0a10c34b002900900000c3620e141537120bc37d048b0440061dc35b073509b70316c398036e0523081bc37504fa004b051fc3ed00f9008e0513c3f900d302120c13c3b0039704bd0218c3ee01bc053d0e0dc3b60388057a0616c3ca01eb0021071cc35a0c9a0720110dc3af02f900ea001ec34c2cb412f10304c39800f000870000c38c043807ac021cc3e21d827d679801c35f05da0195031ec31a19061bde0309c357065206c10219c3030a8904450718c3fa0589768c7301c3d5017b04dc011cc3d22d827d708f01c3a806db02c7040ec33809c5024d0814c31077415fd71402c38f105118172107c3ca0130079d031bc3d005770f511309c35e050508d4011dc33416e902e10309c353398b26384203c3a317d30be30704c3581b3f202a2306c3a704d2022e0b13c36c08a305d30212c37d0e061b681009c33d06bb02b6021cc3361648144b1409c33e06750450061dc36b07330a120c13c3cd03440dbe040ec3fb002c107c0a0dc30a28611ad40706c3040ce301c00314c36906ed00b40317c3430a9206d70212c352055d0511071ec3441226154b120ac38a06b104c40311c35e0516075a051fc31a145e0ee2020bc3a70ebf0a262406c3ab07c9044d0e0cc3570a360c430b10c38e070011c8030fc3280b6a07580813c3c114e209e30903c3c6018c03c9011fc3fd002b0a520814c37708f500470a11c3ec00d801210b14c3e401ad04f60013c3580bee01480c0fc3d704bf0610170ac30500f400600000c3590d3d102d110cc3d30276064d0814c3350e760919100ec3aa03370760061ac30629b30cd50706c36206b003380818c30e12450e530d0dc327074306e1011cc3390b040d250c12c3120a9f04b60316c3c5022a0ac20314c31873c71cfe0002c3d501c70285041ac3770882070c0e11c34e16a50b551508c3391c311df30107c30414bb056d0c0cc3a20a6511e00309c3b419a51e174d03c3a604c103ca0212c30c0efc00290c11c30c30282bc10c05c313272c23122706c3d003e102280e0fc35b09e901510912c3031c3716571209c39c071d1091070ec3a9027b0456051fc3c9003d00be0000c3c809d207711706c38c06480a430b11c3790cc4057a0c0bc3480eed019f070dc35418341dac0b07c3926db34c916e01c3870492049c031ac3340e2f0e1c100ec37b120b227e1207c3a1032e06b5021fc38112381c1d2007c330671575823e02c3d80143070c0a18c3b704f5007f0810c3f702ac142f3404c3460018004d0000c31209be02820519c334083608ce0119c3010031008d0000c31f08d70173051ac38304f400c4021cc320079703ca011ec3e00aca11732e03c30124f701af0b07c379009e00830000c329000000240000c3b805e3020d120dc3200b7b06cf0213c3211faa0c9f0d07c3b5038a05690715c3270c3b0b520a11c3ef003e0afd0013c39f0a061bd90409c35100c2009b0000c3e601360d2f0d0fc3505754555d5102c3843dea0ad01702c378217722e70604c33809ea00530716c3b6249f308c3902c3f700060b530815c3fb007d05f50017c37204d6010b071fc3de012d0c610911c3b004050ffb0010c3dd018c05d10214c30e084f0638071cc31e4b68321f4a03c37107c303c70312c31607ab02c3021ec3b303d3012f0818c37404a50221071fc37c15481e781606c33a0ab7047e0712c3843dcd19883b02c34f052b0700081ec3eb00fd00d20119c3bd03c5029a0514c337083708020a19c3b7039004350818c32f0c9c05fc0011c33116800eda0409c36a1513210c2207c3e20152065c061bc37f202a35442e04c3e6010b0c7b0613c3f5019e0ae90209c3281adc04351908c308080d08c8011ec3490a450a750811c3e1019804c80215c3ac04ce02dd0211c36d095b0a1a0f0fc3c102b702f8001ec3300ba305950512c3ee012d17d80409c31f257517f70106c33244d80da61d03c376087b07160d11c3a60375041f081cc35808cb02950513c3e60cfd01f60402c31417930ac2060ac34507a5034f061ac3b419e608423f03c35505480673041dc354553565525602c3bd03d602140d12c31309e600a4031ac3b0093619f00108c34908f300fc0016c3ed006700340000c3491e1227971106c3130b8205810615c3740991070d110ec3742e0254e50803c30033fa01601f05c3180dad04d20211c3e60251113a130ac30c11d902290f0ec3a903c102cc0218c359069704490719c30b0b4308950416c36516e1047d1207c318106b0aae050ec3c8090a28ad0d06c3c20488076e090fc3ec01fe00b60412c36609380b7c0711c39506020e130d11c39d0383046d051bc37605bc02690617c37d042b075d051cc3ca011f07af021fc3ac14fb01a11704c3fc00b302f3001ac313002900b90000c30310220eb3050fc3601a7a168d1306c39307b005540c0ec33700e800ef0000c3007fea0a8f3802c34708d202360916c356066d057e041ac3a908a309810c0ac37d15d806721706c36b1dd508da0705c32c0b220ca80412c3e001cb02f40018c3cf00e400a50000c3c90ac50bf30205c3ec007e046e051dc35e1a2125f20206c3350d1b0fe4010fc3661e631f671e05c35605f000aa021dc36825df08881d04c3e8006a05ad031bc38208240fe6010ec3660655079c0416c3d4033412f9000bc3c003d3024e0814c3a104c902340817c32f09e8011c0a16c31613b10634100cc34c00a500380000c35508b403ca0213c3eb002a08310819c3b718a21f6d3003c34a245e207d1a05c3300e9a07f8000ec32a0dc3032d0d10c333116e0c660c0cc3120b0e0b080b15c3bb02a20355061ac35f167513c70807c3b1070f1513150bc38604bd02e2011cc3a30475063c0816c3bd02580578041dc3b7046409090f10c333160d1afb0009c38115eb03851406c3af02b1029c031fc315073506e1011ec3502b502bba1104c3a1038604fd001ec31e076d041c071ec3f0001e00360000c37d05a0047b0517c32d0ac302b70315c351054206f3001ec3fc0073055e061ac3be02d4013d061fc30d0b3309b60316c3900ad803f7000bc35808bc03cc0214c30f09d901af0319c35b36a71d304503c386055e07570716c32337432f602704c3fc008505da0115c31f1c4d164c1608c39805090d9a0512c3f001221bef0208c3b509c007081e08c3b8026106ad0319c3bf024f0537061fc33428f701f00305c3cc01e600e2001ec3701474138d1007c3f500b805e3020cc34c051f07bb021fc37e19701c592105c39b033e0798031ac34c08da014a0816c32809b403a30417c3b602ec0062051fc310221e208f1007c3940348063f061ec31d097605e50117c34e097b06480913c3e5012609600617c3d003ce032b0e0fc3dd01d7014b0719c394094c10b2070bc35000ce00d90000c36234b917cd1003c3810fac0ac50708c3201f8811b70a07c31a07af028f031dc3a1039104480718c3472e6127612704c3310a67071d0b14c38b08460ebc050dc35a0738093a0816c3840a94082d110cc3190a270a2c0a15c3bc048407120e10c3ec024d19421b07c37507190cfa0013c38007f4001c0e10c3f200eb00390000c32e0a4d08e10114c3601f5322492405c322498e258e2503c3780fbb07e90209c32c0cf700c30311c36e05940358061bc3b6037505910418c35107170a330817c3b2057409500b0fc33a205a1b721706c3400a370be60112c33831891dbf1004c37008df01ab0411c30c22d3062f1d07c3b904d70299060fc3e102a50687090dc3ad04e601240c12c3ea031726b40c06c3ef055a379c2103c30316fb0049100bc3415fd515127602c3a204dc01ba0315c3f300b203060a17c3350bdc02b10411c3f6008f0419081ac3ba021708a4031bc325122a11d5030cc3c2036e07780713c37b10880e711108c37c410e78654d02c37f063d09960514c3e501e301f5000fc34e058b03de011ec3421f78169f1006c360087007140c13c3d804840f151d08c317217314eb0207c322117f09530d0dc3c5021d0a6d0616c30a237214172107c3d40ea31e942303c3aa036f05aa031ac3690634082d0819c3a017bd102b3504c374057d05d20118c3d801db01e30115c31f07fb00a0031dc35f280d3c562a04c30708290751061dc391048d0467051ac3c2043e0db6050ec3dd016d07e90114c353079404290917c352118a0b18170ac32d1a890e771108c3a9047507910513c38d1087110e2207c37c06a904d40214c3a41e3742e70803c36699c53ac83701c3460b79088e0710c30308a60373041dc398220852872803c3f5003f08220917c3bb075e11cc0509c34f0c6b0a81090ec39504e301190a16c3080fb2042e0d10c3a80e8214fc0006c3c303120dbe0312c3f30c03fc52ad01c3380dda02670a0fc3b50af701d90507c31e251726761606c38b05210b940514c3f7009b05860711c307097a0551061ac33a13ec01b3070ac3ce06fd003a1808c3c707c007dc0408c38304fc0032071cc36f08ce023a0b11c39124bb16c71203c35106a30332071cc37d08170f0d100fc31d0f00111c0f0fc3300b080de10112c3f400680540061dc34b14e502700f09c3bf077f0e970b09c3c80224090d0b16c32c69485b913702c3e6003b0790041ac3fb007314d60507c3df01f500d90118c37f047204e8001fc3b20334082f0818c339278119252b05c3da029506250c11c30b1b26189f0a09c377048b0369041fc3d0043812fe000bc3c00607181d160ac36a0bd803f6000dc3970e63164a1907c33e07010a6a0519c38b06e701360b11c39d037605c9021bc32748134e3a4103c3a6048b06870613c361056f05a4031cc3f60059052c071dc39607340de3010fc3c7020a0ac10217c30d79a12ffb0202c3e001c2027c041ec36805af020e081bc3d801ef000b081dc37a0ea909541309c3324401542b4603c3e601ea01b40313c3611ab90bf20206c3551caa0e342106c39c05400bb50411c30f10a90596070fc369064807500717c33e098f05c20314c3e409a51e992203c39a05430afc0012c36b0a530ce3020ec3ee000b0cfb0013c3a412e405242b05c368074d08f20015c32018a00ad50409c3a8038a04c2021ac3a1092016990a0ac3300a4509100c13c39d03b402e6001ac31427ef02551c06c3ea00fc00d20117c3b2057d084e0b0fc301085d05e4001dc3ae03ce02780517c3611f3728fa0105c3f1002f0b6d0812c30c790d79843d02c309f653ac15ea01c3fc005122f90105c3d002c902cf0216c3b803b703cb0215c31c10bf04660a0e61010060006000c16102006000f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : [ + "" + ], + "gasLimit" : [ + "0x3b9aca00" + ], + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "to" : "0xbe7c43a580000000000000000000000000000001", + "value" : [ + "0x00" + ] + } + } +} \ No newline at end of file diff --git a/test/evmmax-precompiles/evmmax-mulmodx-bench-single.json b/test/evmmax-precompiles/evmmax-mulmodx-bench-single.json new file mode 100644 index 0000000000..7594d52b9f --- /dev/null +++ b/test/evmmax-precompiles/evmmax-mulmodx-bench-single.json @@ -0,0 +1,73 @@ +{ + "mulmodx-bench-single" : { + "_info" : { + "comment" : "", + "filling-rpc-server" : "evm version 1.10.25-stable-69568c55", + "filling-tool-version" : "retesteth-0.2.2-testinfo+commit.766b4629.Linux.g++", + "generatedTestHash" : "682d204267cf3a3909bf22c063f2c9cde06a917d56f3666bad7ff4c724b3676b", + "labels" : { + "0" : "empty" + }, + "lllcversion" : "Error getting LLLC Version", + "solidity" : "Error getting solc Version", + "source" : "tmp/micro/jump_aroundFiller.yml", + "sourceHash" : "cadfd8a7ee22cbefac3a420cc4c762ca1a3a38ae3346407bd31694acff16c78e" + }, + "env" : { + "currentBaseFee" : "0x01", + "currentCoinbase" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "0x01", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x01", + "currentRandom" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "currentTimestamp" : "0x61a8d289", + "previousHash" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "post" : { + "Experimental" : [ + { + "hash" : "0x51a20eb8dbdec5af48eeecca9e38acb6006fe28733f8649500092464fe6a6364", + "indexes" : { + "data" : 0, + "gas" : 0, + "value" : 0 + }, + "logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "txbytes" : "0xf8618001843b9aca0094be7c43a58000000000000000000000000000000180801ca0999ee855b1d5325fe79efbc40ad560f9ebabbbb97e72e1a4e9cf7e4b8ba34765a06392df208ed06b901f2997995c138bfa06ae8b1a26c15e8aff52cad68f913e85" + } + ] + }, + "pre" : { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x3b9aca00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "0xbe7c43a580000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "ef00010100040200015e3704000000008000037f00000000000000000000000000000000000000000000000000000000000000306000537f0000000000000000000000000000000000000000000000000000000000003001600153610100600e6000c0609760005360da600153600160006000c2c3010100000101fec51e00da00280001c5bc005c002f0001c54c00d200a00001c53b0091004d0001c52b001200a60001c508004300840001c56000cd009f0001c5ef00db00470001c5fa007d001f0001c51200f600050001c50e00d900f70001c5270006004b0001c55a0051003d0001c536002900cc0001c525004c00440001c56d00ac00fe0001c5980043000b0001c5e4005300150001c55e0098002e0001c51d005d00f20001c593000b00820001c54e00fd003e0001c5670013005f0001c5d7005800500001c5f3000c00390001c597008700f20001c5670054003e0001c5a1001800870001c5050076008e0001c53d009300590001c5f9000100f40001c573001800150001c5dc007900150001c57700ab00a80001c54f00c200df0001c509004f00350001c55e001c00de0001c56c008000ca0001c541005f00060001c5130034005f0001c5e100c300df0001c5e600d100530001c56c008600b20001c53100e100280001c52b009e005e0001c591007300070001c59a000600670001c50800a300fd0001c5e2001f002d0001c544006f00660001c55300a100740001c59f00de00050001c50c008000180001c566005700500001c57400d200420001c55400e600e70001c53e000400700001c516000300fe0001c557008400280001c57d006100100001c52c00ea00e00001c54000a9005f0001c5d00045003a0001c5bf005700cb0001c56600f4009a0001c5ec001c008b0001c5630036003d0001c50b002a00590001c54b00c500190001c5ed00cf004d0001c5e6009f00aa0001c5e800bc00060001c54c001c00190001c5b500e9006d0001c588008000020001c5ad00d3003d0001c517004000af0001c53d00e400980001c55b003d00b80001c5d1005b001b0001c5ea005b00150001c5ec005c00d70001c515008800dc0001c51d001300cc0001c52700fe00940001c53a00bc00910001c5b1005300040001c57b00e200fc0001c59f00de005c0001c545001d003f0001c50e00e800490001c5dd0057004c0001c512009a000e0001c5420036000b0001c5ef009c00870001c59600d5001d0001c52500e7003f0001c5f80049007c0001c51a00a400320001c525005d008d0001c58100b800180001c557000100310001c57200d2004d0001c5f1009900130001c56b000c00d10001c57a00a5007f0001c52c002000d90001c556002c00750001c5ed00ab00390001c5de00c0005a0001c54c00ea00250001c5bf00dc00fa0001c50600d400a30001c562005e00060001c5bc008300a10001c52700d300840001c5c100c600370001c553008000140001c52a002d00e60001c532001e003c0001c5fb00b000230001c581009d00700001c56700c1008d0001c59600e200750001c5b60022001a0001c514006100500001c55e0073006d0001c51d00e000a50001c5db00ee00e80001c58d00a2006c0001c5530006004d0001c57a006300d10001c5fc00c7002c0001c546005b00680001c54d001300150001c54b004200970001c5030099000c0001c55b009e00810001c5dc00f3007f0001c53700a100ef0001c59e009900880001c581001e00c90001c5aa00f3007f0001c54b00d7000f0001c5e1004800e20001c5e70096004b0001c5d70068004e0001c55500a6003e0001c508004900430001c50700c000710001c5e600ab00bc0001c51e00ac00a00001c51600cd00570001c54c002100cc0001c56100fa00bc0001c58700cc007f0001c5c6001f00a90001c51500d7002d0001c55a00ac00af0001c5c9001300540001c5bb006100a40001c59a000100410001c500000500610001c517008600700001c51a007800bf0001c5ca008100220001c5ce000600730001c5c500d900d10001c53d002800c60001c5a500de00b90001c51800a500a60001c5f400a2002e0001c53900a800880001c5e200f100ad0001c51100d100660001c5b100d200430001c52400ba00d70001c552000e00af0001c547004700960001c578001d00ca0001c50e009900ec0001c5c6006d00c60001c579002f00a30001c59800ae00f60001c546004d00560001c525005500a00001c57500f900a80001c528006b00d70001c5c5001700ec0001c521003900830001c592002f001d0001c5e2002f00830001c5b200d100220001c520008700e60001c598009b00ae0001c5350087007a0001c5a300a400710001c5d4003b00380001c512002700320001c5ad006000b20001c52a0004000e0001c571005300770001c53100da00ec0001c53600e500870001c56b003f00880001c5d600fe00360001c5c2003e00730001c5f1008d000f0001c5f9006300630001c567002600de0001c54100b800020001c582001800f20001c5f100fb00690001c50e007100630001c5a80022009e0001c5ea007700cf0001c537002400450001c5ef005c00020001c55000b800690001c5bd00c100030001c5d300b500190001c584008b00a90001c5cb003500cd0001c53d004200600001c55a007000a00001c57a0092007e0001c5d900f300200001c550009600a10001c5d6003d00df0001c5db00be00a80001c5a6009100da0001c523000300a20001c5bc00a7001f0001c513009300a10001c51e00da00dc0001c53600de00a70001c566009100e50001c50b009e000b0001c59b00b800000001c5800048001f0001c59a0050006a0001c5fc006600010001c56a009b00bf0001c50e003d00e60001c5c6008d007e0001c55e00dd00b00001c51a0060004c0001c5f0000300f90001c5bd007f00810001c57200b100ee0001c5e6004900f80001c56d000a00d00001c58700fb000d0001c58b005800090001c5b8001a00570001c565005400a30001c52400cf006b0001c50f009600850001c513000c00310001c5fe00a400750001c55000ce00c60001c55a005500df0001c5e0000500cf0001c509007f00290001c5e100d200fe0001c59a00e000b00001c594006d007d0001c5260053001f0001c566004300ce0001c5ee00d3009b0001c5f700f300d10001c59900a4002a0001c53400fc003d0001c5b9007000430001c57e004f00fb0001c5c000c900110001c58400bc00be0001c58100d500ae0001c58e007f00430001c5f8001f00b80001c5820036007e0001c56e00da001b0001c55600ef00940001c5db00d100cc0001c524006600f50001c59800fc009c0001c50d00b000320001c54d00aa003b0001c5390063007b0001c56e007700860001c53f004b00010001c57000f200200001c5d400b300cf0001c59000db00510001c5dc0091005a0001c592000e009f0001c52700da00070001c5fc00cf00e50001c51300b1003a0001c55d009e00ad0001c51600aa00fa0001c578007300610001c50900ac00ea0001c5d000dc00f20001c5a500cd00340001c55a00fb00a70001c57f007400bd0001c56f00d6002c0001c5f400c3001d0001c5f8007800d20001c5af009d000e0001c55d00c000110001c5130023002f0001c568006f00bb0001c512001400d90001c55c00e8007b0001c5d5003d002a0001c5a4007d00350001c51f00db00450001c5cf008c00170001c53c00cb00670001c5d70002008d0001c5ec0017009a0001c52e00f5005e0001c557007c004e0001c5c400a600e30001c57c005800c00001c590000200480001c5200016007c0001c566009b001f0001c54e003700100001c5c000e200590001c55d00d000060001c5c7005800cb0001c5f2001700080001c537004d00180001c50c00fb00ce0001c597009e00420001c5bb006f00a00001c597007100d40001c560000300090001c57a00b1001e0001c5b900ab00630001c57d00ba00d10001c5c3009700b40001c53e008c00e10001c54500d0000e0001c5ee002100b20001c59f007a00f00001c5d3002000a20001c52f007b007d0001c57d00ab00e30001c51e004800040001c50900a7004c0001c556001c00a60001c51400fd00cd0001c58800b900240001c5e100da00940001c56a009100230001c50e00e100220001c51a001000870001c5ca009f00870001c511006000800001c56b001500240001c54500e400340001c560004c00440001c54a007d00190001c5c300bf00740001c59b00ab004c0001c58d005200e30001c562005700380001c54e007700790001c55500d100530001c544006000860001c5c7009500f30001c57300f700660001c55f00ac001c0001c5fd00c600190001c59800d000750001c59c00bc001f0001c54d0007002e0001c527005c00650001c5e60004008c0001c564002d004e0001c551008000df0001c5b9004600a90001c546009200cf0001c59300c900a70001c5b6008700d00001c5b5006a00630001c528006a00120001c51200ba00d10001c5f900ee00090001c53a003500030001c5ca00ec00230001c5870068003a0001c550004a00b10001c51300ed00060001c5e8002a00e00001c5b40061000e0001c5d700fb00e90001c53b001200b00001c50d002c003e0001c53800be00080001c5a8003b003e0001c5c1005c00f00001c583006a005d0001c5a5008500a10001c50800cc00e10001c525003b00e70001c557001a00630001c50a004e00ba0001c5370089001f0001c54500fd00f50001c5a300f900b00001c5db005e00f70001c55600d9007a0001c583009a00640001c59a009b008e0001c5cd001c00290001c5c300d0000f0001c5b600dd00dd0001c5c300e0008d0001c5f1003600350001c55100b300450001c5b2008b00d50001c57d009100e50001c557007600d30001c571002800730001c551002b00230001c57a004c002d0001c5b30069009f0001c5bc0027005f0001c5040046004a0001c54000d500490001c5fa00f0008d0001c510009f001f0001c55900b600490001c5da006d00940001c559006600a10001c5fa007600de0001c567001a00da0001c5b2005800c20001c5a4002100960001c52a00a800280001c526009500340001c51600ee00850001c57900ad00e90001c52900c1002d0001c50600f800b10001c54e004900940001c5f300c600f00001c5cc00a300560001c545007a00f70001c5ae008a00df0001c53800bc00070001c5a1001200570001c504004500b50001c5d8005200970001c58b00b700a10001c57d00ea007a0001c5df005e00ed0001c526006f00e40001c587004800160001c5b70083008a0001c58e004600ca0001c5ac001c00d10001c511007400550001c58f000900f10001c549003d004f0001c5cd002300ee0001c50900b600810001c5dc006800bc0001c538002600da0001c540001800970001c54d00b6002c0001c52d002a00ab0001c58500c0007e0001c547004700270001c5a400fd00740001c5fe001300a20001c5eb00e6008b0001c55800f6002c0001c55d002500170001c537005000320001c584005300810001c5f800c8000d0001c514002d00130001c588006700160001c5fc001700fd0001c56c00db00860001c5a1005b00e40001c5b800dd00d80001c53e00a200860001c56800f900520001c54100ea00370001c5a20037001d0001c5c900e200040001c546001200340001c55f000200850001c5ee004b00070001c570007a00c60001c5a300ad003f0001c5db00c300ac0001c5600039007e0001c55200c700e90001c5a000cb00610001c54300fa00770001c54400ee002a0001c538000a00ed0001c5fc007500530001c58800ba007b0001c51a006b00b20001c50500e000520001c537002f00b90001c5e8003c001f0001c5e7008b00990001c575007d00bd0001c50c000d00190001c53d001800ea0001c59700af00940001c597005400090001c576004a00550001c55e0095001a0001c5df009500320001c59f006900f40001c58f001d00490001c5100043009c0001c553003d00d90001c5c300e900ef0001c55400cc00730001c5b6007900000001c512007b00220001c508005500300001c5a700a400730001c589003d00190001c58d000100580001c532002a00ef0001c5da007400fc0001c5a2004600f60001c556005700cb0001c5a4005700690001c5f200d8009b0001c55700ee001e0001c53600d5003f0001c5ab008900e80001c57f00fa00880001c55200e500940001c51900d600990001c53e005c00510001c5e300b000200001c57200cd00990001c5a900e200450001c5aa006700ce0001c599001200420001c55900fb003a0001c53c00d400320001c5b200d000760001c5c9006d00770001c58f00ad002d0001c590002200b30001c51b00f200880001c53800d500e70001c58d002000430001c5b80063003b0001c535002300f10001c54100b100340001c58c001f00730001c5e000ca00460001c5c6004000620001c5a700f4008f0001c5ed004400eb0001c53d00ed00c60001c593003100d20001c58b008f00bd0001c5b8003f008d0001c56500ba001c0001c509002d006d0001c5c9004800830001c58000ef00b70001c5c700ab00180001c510002f00f60001c53b00b400430001c51b008e00820001c5ae006800450001c5cf002200050001c5bf001200170001c5ae002b00e20001c549002200000001c5d0009100c80001c5bd00c300b20001c53700a600dc0001c512009800930001c5c1004a00960001c5d1000400610001c5f2002c00d40001c575004800b50001c56d00dd003a0001c54000d400da0001c5f400b200d00001c58600d600610001c5f700bb00f60001c5e400c700d00001c5ab004100270001c55600b4004a0001c51000aa00c60001c54f007a004e0001c575003e00da0001c57f001d00770001c50d000500910001c506003f00ae0001c58c00b400fd0001c5f000e800d70001c5f50058000e0001c518009e00530001c5af001000c00001c5db00cd00f70001c5f000b700910001c53700e100470001c54e0080002b0001c54800a800610001c58400f300c00001c5a4003800950001c515008900e90001c5cb00b100090001c553000500790001c565006e00b80001c5f5000400420001c5ab007200c50001c5d8004800580001c5c70084003b0001c5af00e700ac0001c544007a00e10001c541002d00790001c5650021004f0001c5270008008c0001c52d00ba00580001c5ba001900040001c56f000800490001c50d00bc00010001c5b9002c00f00001c535002f00200001c523006100e50001c5a400b300920001c54300aa00260001c539003f00d00001c506007c005a0001c5d9009e00850001c5d7006f003c0001c54c00a4008f0001c5fa007900de0001c57f005f001b0001c5d800d3003a0001c5c5007700070001c53d009d00140001c509002600040001c5ef0024006d0001c5f4008200750001c56800b200fd0001c50300ab00350001c5bc00e900450001c50d00f6002f0001c5f90008001e0001c53e00ee00bb0001c5f200b800bb0001c502009f00710001c53200fd008b0001c5f6005900a30001c570000700ab0001c5f2005c00d70001c536000500390001c5a600a700d10001c5c9007400740001c517007b00aa0001c578007100f40001c5e7009a004e0001c5a200af00b80001c5df0098002b0001c545009300ed0001c5b400ed007d0001c56d00a600380001c5e40045000f0001c5ac00d0005a0001c57f004500340001c5a80088009f0001c5cd002400400001c595004600280001c53800b000270001c5de00f100b00001c56d004800040001c50c00ef00c60001c513000a00650001c5fe003800c20001c58d00c100c80001c5a1003d00e90001c5ab00eb00b40001c5d7005900940001c5f100aa00490001c56d00b1008c0001c516009e00b80001c5e000b200b40001c5750070003d0001c5b9009700d20001c5f700c9001c0001c520002300ae0001c57a006200a50001c590007a00f10001c57100d600be0001c54600da00bf0001c54e002f001e0001c5cd005600df0001c5f8005d00a30001c585005d00b40001c53a005d008e0001c533001300a50001c5ce000100550001c50200d400390001c54000de002a0001c5e000d000a30001c535009c00900001c540005c00200001c57800f200590001c5bd00d900fd0001c50700d000a60001c5e400fe00f10001c576006300f10001c5c3002a00880001c5d3003300e50001c576004f00d80001c5e1006a00b10001c57700bb00240001c5e2008600700001c5780067007f0001c598002100a20001c5c000cc00a20001c5440053000f0001c58b000300a80001c549001100370001c562001e00320001c555003d00620001c5df00c600450001c5cc008400ab0001c58000bb00620001c50d0029005b0001c5d1007e00d60001c576009e00400001c59c0064004a0001c5b900e400040001c50d009200250001c53d00de006e0001c50a00cd00ce0001c5ba00cc00150001c5eb00ef005b0001c5f300b100bd0001c53a00ee00cc0001c55c005800e80001c5c000c100820001c59a00fb00770001c598008d00440001c59d00da00bb0001c5f7008200ab0001c556006900fb0001c5a400f800880001c57100e300060001c5db007b00990001c559007900920001c57700ed00500001c5cf006600950001c59d007a00d10001c58800d000900001c557004f00740001c565006f00370001c5f300df00650001c5fd00bf00a30001c5400092005c0001c5c400dc00180001c52d00ec00dc0001c538000100580001c5fe006b00360001c5c30019003d0001c58f00a900c50001c53e003100f60001c525003000f80001c57e00bf00790001c5a200ea00e60001c58e007800a40001c55f00dc001a0001c575007500e80001c57a00fd00360001c5ae0092009c0001c53d007400d60001c539002100dd0001c5ad005a00b60001c5f1002e00fb0001c5a100b900fc0001c53a006c00640001c580009b00e80001c50e009000670001c5f8000c00660001c51100b4000c0001c53f005200130001c56e0017004c0001c54500e6007c0001c5c700f7006c0001c52e006a00370001c55200ab00380001c531001b00210001c5e100bf00f30001c574005400da0001c55200e2009d0001c5ea00c300780001c5d3009000580001c5f6007a00180001c5a6003200b50001c5ce00de00730001c5b300c300900001c5e500eb004a0001c5cb0021005d0001c597000300d90001c5510016004c0001c548005500db0001c5a4004100850001c5d600f900000001c52100e2002f0001c51100e800840001c58a006900d20001c586001700e30001c51b00a7004e0001c535004a003c0001c52e009d003c0001c585005f006a0001c50300ec00840001c594009600770001c58c005000630001c5af008800210001c5d3003900180001c590003100ed0001c516002500710001c57900bb00d00001c506007300490001c56b000a003d0001c58d008d001d0001c50f009d002e0001c5d90018001c0001c54e00fd00a00001c5a800f8000c0001c5f5009200d80001c5ca002500550001c53b007800620001c566000500b50001c57b004200dc0001c5bd00a7005e0001c52f000a006d0001c5dd009800f30001c548005b00f20001c56400c400b50001c513003100ad0001c52b003700990001c5aa00ed00de0001c5c5000c00300001c532003a00320001c58c0008006d0001c578009f00160001c516008500c90001c5d1004800ed0001c59100b600020001c50200c5008b0001c5d70065006b0001c5910037007c0001c5c000b5002a0001c50b007d00a60001c55c006100170001c52500c000520001c5a100a8004d0001c5020086001f0001c54400d1000f0001c55d00f800b70001c593002900620001c583001300ce0001c573007600b30001c5df005e00240001c5580092002f0001c519000000a30001c5ec00a900770001c55d003c00d00001c5b7001500db0001c5a0001c00760001c55700b700720001c5dd00b900b90001c5fe005200d80001c56a00de00110001c5c40091005b0001c5cf005a00450001c5b0004300560001c58a00f9008f0001c517008500450001c52b00af00100001c51000f1006f0001c5da009500030001c598007a00b10001c57900b800d90001c525003500200001c563001000fd0001c541009300540001c52c00b600a00001c5c600d800d80001c5900038008a0001c518006800030001c5d4008300a00001c5d1001a00f70001c5d20026001b0001c5510091003e0001c5f5009900e90001c5da00d500b00001c5e500a7001f0001c525009800220001c5be00d300050001c5d200ce002e0001c50d00a800b40001c564006e00fa0001c581007a006e0001c55900f1000c0001c5ba003600400001c5a100dd00860001c5340056003e0001c5fd0014005a0001c5cb00cf00680001c559003400550001c519006100a90001c527004e001f0001c5be001e000a0001c583008800250001c560000300540001c5b300d100cc0001c50c008f00a40001c5f2001800220001c5330081005f0001c5ad00cb001c0001c57000ef00d50001c5b6002f002e0001c537003500ba0001c531008100aa0001c57b00d200480001c59e007c00de0001c57d003c00ad0001c55e00b000640001c5e700bd00810001c5d3002600940001c5f400ba00550001c5a2003400f60001c50a007500880001c54e009500320001c5d100aa00460001c54f001a00be0001c52300fc00040001c552000900710001c599000a00f60001c54300ba00f30001c5b300a200d40001c52b00a300490001c517003600280001c58a008400b00001c595002700c80001c5e80098001e0001c581004f00e20001c59900b300a90001c5b8006d00320001c5ac008c001a0001c58a004a00fb0001c59a007d00830001c5be00b900290001c5720061000d0001c516000f00910001c5cf007300c10001c58c00ca00c30001c5c1000100ac0001c51c000600650001c53600cd00040001c5b700dc009b0001c5e5000900d30001c54e001600d50001c5c20079001e0001c5340091003c0001c58e00a000690001c5a4002c00040001c5fa009000ba0001c536007900f40001c5b1005b003f0001c5940028004d0001c58f000800670001c57e000d009e0001c53300b300420001c5f400c2008c0001c5880069003c0001c5cc004c00bd0001c58e005e00b20001c550009d00ef0001c5710063008c0001c5890060006f0001c5d5000300c60001c54f00ef00590001c54b005f00090001c531000b004e0001c5c4005b00c70001c5b800b200860001c519006800a00001c5b500ac00b80001c5f000d900e40001c50100d800180001c51400f700450001c50200fe00e40001c59c005a00750001c52700a000440001c57400d1008e0001c5bb007c005e0001c58e000f00d50001c5b5001c009d0001c5570084006c0001c51c007300760001c59b007500d70001c580004c00260001c5cc0012000e0001c5420066000e0001c5e400ca00d40001c5bb00dd00f70001c59100d300500001c528005900000001c505003400860001c541006500330001c53f003a00830001c530003400c20001c53e0020003b0001c5d10078005f0001c5aa008b001e0001c5d4004500160001c5b3007600280001c55100e800bb0001c5f500a2005d0001c57400b500890001c5c2005f00c00001c58700b4001c0001c53800e900d30001c521002a004e0001c55600ef006c0001c535002b003f0001c58f00c400a90001c58d00ae005c0001c53000ae00380001c52b001000390001c52e0061008f0001c5f6005d00ef0001c5fe006b002a0001c5d10014007e0001c530001e00fe0001c52b0098005a0001c5d500f7002b0001c5cb00a300570001c5a6007c005f0001c568006900ee0001c5e000e0009a0001c5de0000004a0001c511007300cc0001c59c002e00710001c5ee00f200b70001c503000400650001c5aa007100500001c508000b00670001c5d7005500120001c5cc00df00ad0001c5fe004c007f0001c5de007600620001c58b00fb00750001c512002b00330001c55e004800ce0001c5d6001d00a20001c5c8002d001d0001c565007000680001c53d00c600a70001c5c5001c00ea0001c5ec003c001d0001c5d0007f00f40001c5fa001d00180001c511002b00ac0001c5a10077005f0001c53c00ec004b0001c5ad00d900240001c56c00e100bd0001c5a300ed00f80001c52a003200940001c50900e700ec0001c5df00b200450001c50a008f00bb0001c5d800a500180001c51f007c00e60001c54700ac00260001c59f008100bd0001c575000600410001c5cb004c001a0001c585006000820001c5a200da00b90001c59d001d00460001c53f00b900d60001c56e001900970001c5a400ae00130001c507006a00510001c58c00a300020001c54b009f00210001c5bf00b5005d0001c55300fe00400001c50300ae00230001c56a005600960001c5d8007e00ef0001c5e700eb006b0001c542003d00a90001c58900cb00d20001c51b00f6007b0001c5040020008b0001c56100ea00e90001c59e008d008b0001c5bb00ad00dd0001c52d000f00c50001c569009c000f0001c586009700d20001c58200fb00a20001c56c0043000f0001c56100c200390001c5ce0094002c0001c55d003800c10001c5b4005800dd0001c56300d700910001c53900fb00500001c5af002300640001c587008d00fe0001c51500f500240001c5d2002200450001c55900e000b20001c5f3001000940001c57700e8007d0001c5a600f600100001c54d00c900f30001c59800f200380001c5ea006400cd0001c56100e300c20001c5e1004b00cc0001c5f30093006b0001c5f600d200960001c50400fb00c70001c533004c00570001c58100a000a70001c54600f700e90001c51800f800da0001c53d003c00420001c5b200e800a00001c507007200ea0001c52e0080002f0001c5f9006000470001c55f008600550001c54c00f7003d0001c5e6003e00490001c54c00aa004e0001c5300058004a0001c594005500340001c5be005400ab0001c54700e300100001c58100ad009a0001c5a2007a00140001c59f0010004e0001c543004c00180001c587007f00700001c5b5001700390001c5b0006e00ca0001c509002a00370001c57000b600100001c5b3009800890001c526002000f90001c5c1003300330001c5cf00a600e80001c5df00be00660001c57c00be00840001c5a900c400390001c57500d400f80001c5d000fa00920001c5aa000f00c30001c56500da00540001c525001000920001c50200fd00a90001c598004b005c0001c567003b00180001c534001b005b0001c566000d00800001c5ca00ec00570001c5fe00ae00110001c5f3007300c70001c5fc00af003a0001c5e4005100b00001c548003a00e50001c500002300d70001c5f300b0009c0001c5be001e00cc0001c5d4009500900001c50c001900180001c54a00ea00bf0001c5e100e200e00001c55b000600840001c5c5000000110001c50b00d0003d0001c50f00ce00fc0001c5670057000e0001c571005f00690001c54900ec00550001c56100e300300001c5a8007400960001c54a005700820001c553007d00c30001c5d5005c00740001c5d40051006a0001c5c900fe008c0001c563001000590001c5a1008800f20001c5fa000700020001c52d0070006e0001c5b70082005e0001c5c600d400440001c5b7005200f80001c5b7001e004f0001c5f200e700da0001c52a005d007f0001c51b000e00930001c58200df003e0001c5ba007700b00001c5a4005f00490001c52900c3002f0001c515005500c90001c530004900470001c585004a00f40001c526000500930001c536006d00600001c5bc0094004a0001c5f1007a00b90001c50f00d000690001c56a009700590001c576004500d10001c5f80004005c0001c51f002a00460001c5f8007000d50001c5a800a2004f0001c506003000e80001c5fc002400cb0001c5cb00f300e10001c562006800db0001c5ec009b000a0001c526007500030001c5f600c200fa0001c5c300f700d00001c51400d8001e0001c518007b00420001c57f004f00b90001c58a004c00bf0001c54e005200c60001c590001a00eb0001c56a008500040001c53b00d500480001c58f00ac00410001c56d007300120001c515007d00e30001c53a004000850001c5e7008b00900001c5d6009200130001c596008d00da0001c522002200540001c5cc001300e20001c555001900fb0001c581008700660001c573001e00100001c577007b007e0001c5e0006400ba0001c592001700340001c5c9006000100001c5d6004f00400001c5f8000200030001c5c70008001e0001c55b00ba00010001c562008b00800001c503000a00330001c58a00f800c70001c512005e00db0001c5fa0033007f0001c505006600380001c5d600e900120001c5f1006d005c0001c5e3005900e30001c589001a00440001c55f004900270001c543002d00190001c5b700f100630001c505001c00550001c5c100e1001f0001c5b6009600bb0001c546005200300001c5cc008c00610001c5f400ee006a0001c53a001400aa0001c56f003300f50001c50d0047001d0001c507000b00b40001c587004800fd0001c51c00fd00b20001c54b001a006f0001c59400bc00610001c5f500a2009a0001c54200e100400001c580005e002d0001c5d600ea00200001c5100093000e0001c5fb009f00630001c54b005a00400001c58a00b200ed0001c5e4000700750001c5d70060008f0001c56d005c00ce0001c5f200ed004e0001c5fb009700bf0001c5b0006c00c40001c509009300c30001c5b9002600840001c557002500230001c5f20005003a0001c51d007600b90001c5bc00f000fc0001c531006600e40001c5d3006900c40001c5310018005e0001c5fa00ee00190001c54000df00930001c5a300d500480001c59b003100990001c53500f100540001c5f0003500950001c595004b00480001c5cf003200c90001c5cd008300490001c55d000000220001c5df000700290001c563005600110001c5620017000e0001c55800be002b0001c568000a00f10001c5eb00a300030001c517005a001b0001c50300de00710001c548008d00ca0001c5a2005300440001c59f00a000040001c5fe00e3000c0001c5ed001600740001c5e8006f00730001c55e00c800160001c52000e5006b0001c54e003c00f80001c543006400580001c53f00e8007f0001c5ac0036009c0001c5ae002d00660001c58e004000280001c57e002b00300001c57700a500160001c5b5008100500001c5f0003e00640001c53d008700270001c530000500900001c563003f00830001c502005700af0001c5ba00ea00ef0001c530004e00150001c5a500fc000e0001c5f500b3007e0001c5b300f600de0001c5c1003300510001c5b4002000190001c5fc00f500b90001c57800e500770001c59e009200950001c523005700c90001c5b9007800c50001c5d800a400a00001c5f100af009d0001c533002200940001c5d2001b006e0001c5e7009900160001c5dc000c00000001c5dd002a00eb0001c5f900cd00a50001c58c0050006d0001c52d00d000060001c503003700540001c56e0044000b0001c54200b300900001c58300db00c20001c52a00d9003e0001c585004100d10001c5d300a1003e0001c548008a00090001c563005f00920001c54a004200b70001c52d004b00910001c584002600a80001c5ef00a000b60001c5e6002000480001c5a100d9006e0001c5c9007b00dd0001c5c10086002a0001c5300012003b0001c510000b009a0001c5be003d006b0001c565009800810001c59300e100f30001c5bf00b600ce0001c54e0050007e0001c5af006500530001c53400ec002e0001c5ad008900390001c544005100210001c59a006a00bf0001c5b9005200550001c5e9007c00c70001c57f002600470001c5ce00bf00770001c578000e00190001c5b6000d004a0001c552009f00a80001c56d000400990001c5a100c200590001c5d6003900ea0001c59600e900180001c56200c200300001c5f900cc00570001c5f7009e00600001c5da009d00d20001c5d000a100c80001c5fc007c00700001c5520097005d0001c53700d700810001c512007900140001c5fe00bc00230001c5c800b6002e0001c5fe008700f90001c5d80081000d0001c5f500c600350001c56e005500310001c59d000800df0001c59c006100300001c56c006100140001c539007600730001c593002300000001c5c300dd00a40001c5b5000100ba0001c560004400880001c59000e800aa0001c507002b00f70001c54100e9009e0001c5c3000200800001c557004500770001c567004e00780001c542005b00730001c505001e00880001c562005e00260001c537007800b50001c59a00cc00130001c5c000c500a00001c5d000c200210001c59b00b800a00001c50c006900c40001c5fd00a3002c0001c5ec00d2006a0001c50b00bb00080001c593001e008d0001c586004700a10001c5e4007e00130001c57c007d005e0001c5ca004100d50001c5d200b900c10001c5c5006c004c0001c56200c200690001c5bf00a900720001c58c00ba00d80001c549000a00630001c56d003e00bf0001c5df00a400100001c548001f00bd0001c54b005e00880001c5fd00d800700001c56000bb00e60001c57600e900d70001c51a004400630001c5c5001000450001c58c001e00900001c51100f600c00001c5e4006f00a80001c58a002600890001c503007c00f30001c5ac005d00ad0001c56800fb00090001c50900fb00050001c541005400050001c52400ad00430001c591005d003c0001c5dc00cc00b10001c5cb003800c10001c51f0018008d0001c52200e100290001c5bb001200af0001c5f70022009d0001c5f8005f00220001c56f00df00220001c597004400f70001c55100b700ea0001c58b0030002c0001c5c1002a00790001c591002800700001c59f00ef00380001c525004000440001c50d007a00370001c51e0021007d0001c550000a00d50001c5490088000e0001c5ae00aa00970001c5e3004c00990001c56800e300fa0001c5e5005e00db0001c5b000c400eb0001c5df00eb00360001c59400af00b50001c51b004100710001c5ac0028005d0001c59d0056000e0001c5ce003300350001c530005200540001c5fd003400000001c5c2003200f00001c54b00f1002a0001c53e004600c10001c5b700bf00800001c5b0002300730001c5c400a000f10001c5880095002a0001c59b004500c40001c59000b200030001c53c00c400370001c5a7001500940001c534006d004c0001c5f500a000040001c592000a00610001c52d00f300590001c518004300a50001c5c400d9004f0001c5ed00aa00430001c5de002f00490001c56600fa00410001c59700d800a30001c564004500c80001c53700cb00b80001c55800d0009a0001c552009700700001c5c70010004d0001c5a700df00a60001c505006f00d40001c5f0001c00780001c5f7003800fa0001c55d008700f20001c50700c000ec0001c5c1007f00180001c55d005d00050001c5e7001100fc0001c56500a000a00001c5b4003c006b0001c5550077002f0001c55200ea00570001c535006500f10001c5ea00e300ae0001c531008400980001c57700bf007d0001c5ca006e00ae0001c574004a00a20001c521001f00f80001c522006a00ca0001c5b8001c00e10001c523001400f00001c50f008e00410001c525000100ca0001c55000d100170001c5c0000900d60001c56c001600ee0001c51900b1009e0001c5a600d000c90001c5ce00f700190001c54100c300a40001c5b5007400590001c52600ce00cd0001c583002000b60001c587001b008e0001c52f000a001d0001c5aa00b500ba0001c5c600ce00ba0001c503007f00680001c5f200d900fa0001c573003800740001c5a20067008e0001c5ea00db00820001c52e00d400d30001c58b000900280001c5fb002700fb0001c5a400c6000d0001c51b001800b50001c5a80067004c0001c588000200f80001c58d000a00ca0001c58400bf000e0001c52b000f00ad0001c554003a00810001c585000d001c0001c563003900990001c514000800e90001c57e00e000660001c54c005100200001c50e000200800001c5bd001800e60001c58d008d00ae0001c594001e004e0001c552004000b80001c5be008400c70001c54000c700650001c5c5008200be0001c50c0093002e0001c5e400e400820001c54c005a005a0001c5f200c700270001c5f80026004e0001c586007d00720001c520000200ee0001c51f000000f10001c5e500a1006b0001c55e005600ae0001c54a00bf00aa0001c581002400580001c57f00e700760001c5f9003600360001c520009f00d40001c5b800b800100001c5fc000e00920001c5c90041003a0001c5b1002100a90001c59a006e00af0001c58100ee009d0001c56e006c00270001c5440037006e0001c5b2007c00430001c59300bf00ec0001c5d600fb00580001c58c002b00860001c547006a007f0001c51200a9008b0001c5be0050005b0001c5c5006300410001c54500a900280001c52a00ea00690001c55500f200130001c558005900c70001c5b1002e00be0001c5a700a400790001c54e001f00000001c51d002b00850001c5ee00b6007e0001c50e001c00040001c5430032004d0001c56f001d00530001c5a800e100bb0001c5a300df00980001c532003700d90001c5b700fe006a0001c51a0077000d0001c5b0004f00120001c5fd007700950001c566001f00730001c5c4001c00d90001c55c000b00110001c5f9005a00910001c5bb002900d10001c588006b003d0001c5b5009e00770001c5eb001b00310001c548006d00c10001c54a002600460001c57c000400e70001c5af00f3003e0001c5b8005b008e0001c50000ad00370001c5d000aa00e80001c5290061007a0001c506009600080001c545003f00340001c5d800a800c10001c5ef000f000f0001c59b005000680001c548001800f90001c58900ec00a60001c5aa00a500a70001c582008000b10001c529002d00fd0001c52b00f3009b0001c52f006700720001c52100d9008b0001c5d0006100980001c56d004800d00001c56c00d3009e0001c5e500b4000c0001c518005800d50001c51f00f3008f0001c553004500330001c5e300bc00f80001c53f009000290001c5f3006f00a50001c52900fd00c10001c517003400520001c5af004600ae0001c520006300620001c526006a00980001c5dc00d900710001c532005c000b0001c5a3001200fe0001c5b4009000bd0001c5d5005800e80001c5be005300460001c5b0002b00c90001c59500f300b70001c506003900610001c523002c008a0001c580002a00460001c5ea002900aa0001c59100e400850001c5ca0021007f0001c5e6002e00c10001c53300da00870001c5fc008c005e0001c53400ba00f60001c5a8008500760001c57600f0005e0001c5870017005b0001c5e4000300440001c5b500ad007f0001c52600de00ce0001c5150019000b0001c5bc0019004f0001c5cf008500440001c59200fb00830001c5340044000f0001c50f009e00cc0001c5bc009f00310001c5c5001500d90001c599001c00910001c5ee00be00a40001c55400a000170001c53d002100c00001c5e7007100750001c5510023000b0001c52200cf00360001c5f4009b00ab0001c589008000af0001c54c003600bf0001c59c0004009c0001c5a80025000d0001c5b70063009d0001c5d000fa003b0001c5e0003000b30001c54b00d5009c0001c5b6004b002f0001c51500de00ba0001c533008c00880001c53900c400c30001c5930071005a0001c5db00b400c40001c5db00bb001e0001c552007500980001c560007500620001c59b007200590001c596002400920001c55d00ec00b60001c57900f800970001c5a900a400e80001c5c700a000fd0001c517002000fb0001c5ea0022007a0001c50400c300a00001c5c500ed00ab0001c5bc00e200510001c5c200ba002b0001c56700ad00140001c5dd00e700ea0001c5c200bc00080001c51b005100700001c54d008400850001c556004600390001c518006700750001c53d00e700510001c570004700f70001c5a7002a006c0001c52f007800360001c5ef009800680001c5c5002e00df0001c5f0005b00440001c529000000a70001c518005c006f0001c5e700ae00030001c58600eb00770001c5de001300dd0001c58700c200f10001c501006900860001c5c700e300550001c53f004500590001c59600e600ab0001c57e00cc006c0001c5a1005100d30001c50a003800b40001c524004500e40001c5c7008200f60001c5e2001d004f0001c5db00be00e80001c5dc00dc00ea0001c5d1005b00920001c5a000b100d20001c5af008700cd0001c5fd00b0008c0001c5840043002f0001c5d100df00480001c561007d00c40001c54f005500aa0001c5d8002500a90001c56a00b700e60001c57300b600230001c59c002200b50001c54d00a500f80001c53f00d000150001c5f500ca00670001c5e0001f00880001c592001c00280001c52500ca003c0001c58d00b200500001c510006200e00001c58200e800b60001c5f3002700f60001c5af00fa006a0001c58f002a00990001c58c004900270001c5f700f500710001c579000c00910001c5f7009400810001c5cb005500300001c530000300650001c51d00ab007f0001c5d6008500f30001c5dc00a900f70001c5cc000300520001c5e8000500700001c52d00af001b0001c545000f00cf0001c5b2006d001b0001c58c00e800460001c593001000d90001c54b001700cb0001c5900035005e0001c57d007e00050001c5c100f7006b0001c5d600b100a60001c5b4001100e80001c50200f100d30001c54a00f000480001c5dc0037006e0001c540007e00800001c52e002300800001c5de009800a50001c540004300b40001c5d500e400de0001c55f002c00e80001c5d2000100a60001c598001a00860001c57d00e3004b0001c5da00c100b30001c58100da00da0001c5fe004600fe0001c551004500b10001c5da0099002b0001c593008b00e10001c52d00d400cf0001c50200f9004e0001c54c000c00fb0001c5c6006b00180001c5ca00e300970001c53b00d100160001c522006900230001c554001b003e0001c5fc007900660001c5e90071009e0001c516002900910001c55f009800b00001c54300b000820001c5b9002200520001c52200cd00900001c54f001b00520001c5df002b009b0001c5f6001a00ad0001c5e0004100e50001c57300f500980001c56600e700ab0001c569003700ce0001c587002d00280001c596002400550001c5ea0077001f0001c5e400de00110001c5c200b0002e0001c54e00c000eb0001c5c0003b00270001c51b0080006b0001c51d004800a20001c51e003f00e20001c5b1001e00850001c5d700d800900001c51c00b6007b0001c54c00b6009a0001c5dd009e00e40001c53c006400270001c54600d3007f0001c57e006d005f0001c5e0008e001a0001c52f003d006c0001c5bd000800180001c5c300ef00fc0001c5920088009f0001c502007000dd0001c5ab00a500940001c50e003200da0001c533002b00320001c5de001600af0001c57000a200e00001c5d400a700a80001c54e009b00fa0001c5710054000c0001c5ab008600260001c5fb000500af0001c55c001900480001c5a2000200730001c51a00bd00d00001c548008200ef0001c59f008300ee0001c56d002e00fe0001c51f00a300d80001c59700bf003d0001c5e700ab008b0001c5a3009700d20001c5f200c2005d0001c580004600d00001c52700f900840001c50400e000090001c519008e00750001c530000300450001c53100de00540001c5770030008e0001c52900b9004f0001c53b00d100170001c574007e00b70001c52500d600260001c5b10042007b0001c59900a800310001c58500c900fc0001c5a4003c00d20001c59900ab00a30001c5e6003600dd0001c58e008700310001c5c7004f00af0001c5a5007600810001c52000fa00c10001c555005f00870001c54400fd00590001c5f60094005b0001c5e4009300210001c54600d100900001c598004900cc0001c503004c007d0001c5ad00d5005f0001c5fb008700a10001c5ee00d8005b0001c5f9003b00720001c512005b00c80001c533009700040001c59a001a00740001c579000f00450001c57e000c00df0001c52f002000d50001c5d900eb007d0001c5e6000c00270001c55100b200b80001c591004e007b0001c544009500e60001c5f8008000f00001c52000fb00d50001c5b6003b004c0001c58500fe00b80001c526008b00b40001c5c0008e006d0001c58a009b00ed0001c5fa001e00800001c5bd009800b90001c577002000b60001c5fe00ac003d0001c5a700b1007f0001c595005f00e50001c545000c00b90001c5f7003b00ab0001c5fb00e200a10001c5d30069001a0001c57c00f200bf0001c59a004000240001c57400ad00930001c5d400c500f60001c5ab000f00710001c508004f00480001c57500b500c90001c51600f800110001c51b00c600db0001c526004b00020001c53100c800830001c5f7005900000001c5ce00d900820001c54900fa006c0001c562002900ba0001c52700b200580001c5a2003c00af0001c55100bf00a00001c56a001400b50001c5e8005300aa0001c51e000c00350001c5ca00c100540001c58c001e00990001c5c600ae00360001c50400d400a40001c5c100a000c60001c5860054002d0001c5ea007d00ce0001c53d0063009e0001c549003f00390001c5c100b300f90001c524000f00890001c5e0001b00df0001c59700df00750001c52800dd006d0001c56a00fa00fd0001c5be000600aa0001c5ab00f4004b0001c5e4000900160001c55100f600db0001c54400d300f90001c57b000d00630001c53d00f300c60001c51800e4008c0001c550007f00bf0001c5cd00bb00290001c59400cc00da0001c50400c100c20001c57d00ba00d20001c556005400660001c55a002b00eb0001c5d5009600f30001c59e009e003f0001c5c600df00790001c55a00f700300001c51f000900530001c5f7009b00060001c5de007200360001c56300ef003c0001c5bf00ab00340001c53c00dd003c0001c5d10016000b0001c5c5009a004d0001c516004b00240001c58400e800500001c5d400fd00de0001c5c700b5007e0001c539001e00110001c5fe00de00130001c56100e800080001c5c6003c00330001c54e00a700910001c54e004d00090001c567006e00bd0001c57f000500f70001c509001900230001c59a003800de0001c54a006a00df0001c58d002c00270001c5bc00ec00330001c58e007900660001c5b4006800ba0001c56a007e00ab0001c540007300850001c534003300a10001c576006800ce0001c567006900820001c5e6005000cb0001c5d5003700f30001c517006900540001c5a9007e00780001c594001300ac0001c55c002a00e70001c5d5002c002d0001c5ed0011004d0001c5aa00e900a00001c53400d800b60001c523004700b30001c5a200ab00db0001c550007000240001c5e100a400040001c56000ab00260001c54b0017008f0001c57d0069009f0001c528008600e30001c53d00d400600001c51f00a800250001c58400fe00b50001c58e0002001d0001c521005800280001c5cd0003001b0001c55f008600320001c53b006900160001c5440001003d0001c5d600aa00720001c52b001900550001c5a600d800dd0001c516003700340001c5e2003800360001c59c008c00010001c5bf0084000e0001c5dd00ee008e0001c591006f008b0001c59800ed00760001c591005a00cf0001c5b1002700c50001c5ae000000b30001c55c006c00f50001c5fe000b00220001c5c9004600240001c53e005300260001c5c3001500400001c557006b00f80001c5b600f9000a0001c5fa005700fd0001c5b9004d00c00001c5a7006d00390001c5b600e600a70001c5bf00fc003d0001c55e005e00ec0001c53600c100310001c5f2009f00050001c5dc0094004c0001c555004100dd0001c5a8009100350001c5450024007b0001c524007400670001c52c00ae00c60001c59c00d1004d0001c5e3006e00690001c56b00a400910001c5e4003700f90001c53000ca00a60001c51c006800d90001c5e9006500820001c59300d300ed0001c58100be00830001c5080026004b0001c5e700dc00890001c52b00fc00820001c5ba002000920001c55700a500b50001c55700ca00660001c58f00eb00320001c53e0046009f0001c580008200fe0001c5b4009600850001c505002e009b0001c5a9005c00aa0001c55300f000770001c5d700e600e20001c53f0079008d0001c566009b00650001c5a0008e00900001c515007b00fc0001c559009900910001c5b900d1002f0001c5d400ac00f10001c584006e003d0001c522000200d90001c59200c500f80001c5dd007000980001c518007e00dc0001c5dd004b00580001c5d200e5008c0001c588002f00de0001c55a004c00740001c5e1009400870001c55a00fd00070001c586004500020001c5d1009f00060001c5950094006c0001c5b90065007e0001c52a0056000c0001c5d2006200af0001c59c00c9000b0001c57900c800450001c580000300e60001c5d50006004a0001c551004600b60001c5f9009600590001c531003100c80001c57a007600dd0001c532007900660001c5a20011009c0001c5550003003c0001c57c003400dc0001c5c4003500e00001c5e400d800c60001c579000100700001c5a600c700910001c53a001800af0001c5f5008900830001c5a300c800b80001c57a003a00bb0001c5f5004300e30001c5b400c700230001c519001a006a0001c557004100690001c54c00f100880001c561009b00bf0001c5ae004d00940001c581000400a00001c57f005a002d0001c58400bc00580001c5b100aa00970001c5c0007e008d0001c544000100ee0001c5a300e500680001c502008f00df0001c53900bc008c0001c57400e800380001c5e300a100c50001c572008900490001c57300af00050001c5740016001f0001c53a008400590001c5b400bc00b00001c502007d004a0001c5bd009e00ea0001c5d700e700150001c51900f000ad0001c563002700e90001c58e00a700060001c54e008500e40001c5d0003400000001c5c100f300110001c535004800e00001c55f006900980001c564003800460001c5e7005300940001c53600ec00130001c52900f500340001c58900a400730001c519008e00f40001c5a2008600300001c504002a00f70001c5fa00f600fe0001c54000be00fe0001c5bb00c7006b0001c5f900eb00a30001c5e8002f00810001c577001b00bf0001c51a007100a40001c52a00cd00870001c59500d200070001c5b500e800940001c5bb002200920001c54a00a100ad0001c5bd00d400cc0001c532001c00230001c50400da00030001c5c500fb005d0001c56f00f500cd0001c57600b200f30001c513001500090001c5b300aa00250001c5a500ea006e0001c5d100ee00150001c581006d00190001c5cc003000ea0001c54d00ac008c0001c51a007700a20001c5f4004400970001c54700e000940001c58d001f00b60001c52b0073000e0001c564004b001d0001c56b002a009d0001c58c001500cc0001c59c004400d60001c57f003400d20001c5fa005c004c0001c5af00ac00bb0001c5c9004c00410001c52d001e00210001c505001100150001c56d004800ee0001c538006a00870001c575002f005f0001c5bd007800c90001c5e4007e00700001c5d3001f00670001c584002500370001c5430086007d0001c5bb00a0004d0001c545009d00cf0001c51d00ed00e90001c5b60064005a0001c5e8002100eb0001c5f4000a002a0001c57f0021004b0001c5d400e6009c0001c5d100b200f50001c585000800150001c500005000db0001c5df001900e70001c5c5009600960001c54200c200800001c548007c00690001c569004400db0001c53200c300b90001c57000e100ad0001c53d006200940001c573000b00e30001c5e5002100a50001c58200ea005f0001c586001c00b30001c50800e4003e0001c500007f00460001c57100da00010001c59b00e000ac0001c5fc00e600b00001c5b5001a00aa0001c5f600ce00ad0001c58f006c00260001c590004300e30001c561002700020001c59e000b00960001c5050029009b0001c536009200bf0001c5b900a200af0001c5f500d7004c0001c507000b00fd0001c50c009200720001c55c001000710001c56600f800150001c582005a002b0001c572004b00910001c57d00cb00a90001c5160048000e0001c59d0095003b0001c5dd00bd00730001c5bf000f00ca0001c55c007e001a0001c56c008800420001c51d00bd001a0001c5f0001300cc0001c5c500c300b50001c56b00db00520001c5d3009400000001c56c00fb008a0001c5eb004800c10001c579003500e10001c5a8000700ac0001c532003700c50001c5170080001f0001c52e001500970001c505007c00da0001c5be004e00910001c596005a000c0001c54c000100620001c5d400b2009c0001c5b600e700b50001c5d9007e00aa0001c52300a300ea0001c5ba00a200a10001c5b800f700270001c5a4000a00420001c51a00e100390001c51f00b200bb0001c50b009e00f80001c50000c800c50001c5c5000c00550001c5bf00b800e30001c582003b00fb0001c58a001000af0001c57c008200aa0001c5ce005200750001c5da000900fb0001c57a00db00ba0001c5df00a600510001c538008200d40001c548005500eb0001c549006900a20001c56c007700530001c543004700430001c54600b300ac0001c54c001b00840001c5e6006600f40001c587009e001a0001c5250088005d0001c50d00e200d00001c5ab001200ae0001c57a00d500040001c5c60017002c0001c533000e00200001c5990005007f0001c51a0082001c0001c51700f600750001c5af001d00f70001c54e00f200880001c5cd0073007f0001c50e006b00540001c572005400760001c51c008e00a10001c549007700b10001c50e007b00a80001c5540082007f0001c5fb001b00450001c59d009e004a0001c55c001800050001c595001f00470001c575004500970001c59e002b00e80001c5fd006100bf0001c59500c300950001c59a003700bf0001c5e30033004e0001c554006f00170001c5d60095003d0001c55b006a002f0001c59600a100370001c5fc00f900c60001c576000100110001c5a1001100970001c55b003300a20001c5e4005500910001c54600bb00860001c50c004300080001c5d5002800870001c501001100010001c54b00f9000a0001c52d009c00e00001c56b009400970001c584004f00da0001c5a8005900940001c5b000dc00340001c596005300c60001c5bc009d00d80001c5c600aa00570001c54400c700450001c525008300430001c5b3002600600001c50d0097008d0001c51b0042008e0001c5dd001c00070001c54e006000d20001c5ee003000990001c5a000d000350001c54300d700dc0001c51500f6003f0001c522000c003c0001c588003e00760001c5da006a00420001c51900e400090001c5c200ad00f50001c59f0009009f0001c515002600050001c5fd002400540001c52800fa00930001c5cc00f200c40001c51600be00b70001c5ea002b00080001c58400c8002e0001c54600d2005e0001c5870083004e0001c55a00db00b30001c5db005c00510001c5ab00eb00430001c5fa001a00bb0001c5e6009b00880001c5190035002d0001c589009200270001c5f5007f00340001c578003a00540001c5d60025000d0001c55800d000000001c5f7003e00e60001c587001f00a60001c5cb005e00560001c5e5007000790001c5d6004f00840001c576007500a80001c5ea000a00e70001c55d0029000f0001c50d001c00c40001c580004100890001c55100ec00f20001c52d00be004d0001c5ea004d001c0001c57100df00830001c5e9004400d60001c548001000a90001c5ee00ba00af0001c568005600d20001c53b0048002f0001c55700a700420001c568004e00f20001c57000ee00d20001c57500ca00dc0001c50d002c00190001c54d000800650001c56b008500d50001c5be00c600010001c524006e008a0001c578008b00ab0001c53300c2000c0001c5f500a500490001c543002100ac0001c5db007b005e0001c5bc00bf00ab0001c5c4002a00490001c578001600ad0001c55600f900180001c5e4006100cb0001c5d500ac00490001c595002300330001c5a900ab00130001c59a003000b10001c58800da00840001c57800ab00730001c59000fb002d0001c537003c00080001c5de000200690001c5bc009c004d0001c5ef00e3000b0001c57e005700040001c547008b00020001c5af007000420001c500001c007c0001c5a4006d00830001c52c008700a70001c56200de00900001c5e300ed009a0001c5c5005f00220001c563005b00350001c5bd001600260001c5b000e600b00001c51d001c006c0001c5fd00dd00b40001c58e007000990001c53c007700b30001c5e4008a00680001c56e007200280001c50800d700b50001c57200c200700001c57f005f00020001c562009a00c70001c5d3005f001a0001c53c002a001b0001c5db005c00a30001c55100af00aa0001c5a000d400780001c51f00cc00780001c5400077005a0001c571001600880001c5190089000f0001c595006700550001c5c4001c002d0001c51d0017005d0001c59000c4004b0001c52400c500820001c58200b0007f0001c58c004000e90001c50700b3000b0001c511008e00750001c5470023000b0001c5e8001900020001c542009b00330001c5b900dc00d10001c5fc000500b30001c577001e00790001c50a000100f70001c56b003e003d0001c57e00e100cb0001c515006b00100001c5b800b600500001c51e00cd002c0001c58a009900ca0001c5bc00a400c40001c5fa00d500590001c5f7007000020001c5c6006a00330001c5ba0007002d0001c5c2004100840001c5d7004a00590001c5ab00d400fe0001c5d100d100190001c5cd007700600001c5de008000b10001c592009600770001c5950053006f0001c51d000a00580001c589009000ce0001c50d001d007a0001c52500ab00570001c5a800c900160001c54400d600220001c50f007700680001c52700b800c40001c5d000e500540001c56000be00540001c5b600bf000a0001c588009a00c40001c5eb006000aa0001c557000400a50001c568005e00780001c561007d00240001c584002b00440001c54000d000c60001c5f300aa00b70001c580009300f90001c56000b600180001c5960029007d0001c5fc00c300b50001c57e000c008f0001c55f0018009e0001c596000700bf0001c5bd007e00090001c55c004f00630001c55d00bf002a0001c56f000a00ee0001c5720082006a0001c58f007f00ab0001c599002a00c80001c59f00a200180001c508002a00cc0001c57e007c00e40001c5c7002500500001c589003d00760001c52300b300030001c5d2009a00320001c56b00bb00320001c5a20038007e0001c540003300460001c55b00de00fd0001c56000c100f40001c5970082005d0001c5e000fb00d20001c5b4006e00980001c5db008600390001c50a005e00110001c51b004f00080001c590000f001f0001c5dd00b7001a0001c5d5004000010001c53800de00f60001c551006200f50001c5b10016007f0001c52500da005e0001c5e6004700420001c56e008a00c40001c517001500d80001c5e0008800b60001c5b000bb00fe0001c5df006800f60001c5fb00d000260001c58200df00dc0001c5b9003000410001c5a0007c00a30001c514004e00b00001c5ba007000ae0001c59800e600500001c58b00d300450001c57e0093009d0001c58500f700f10001c53100db00c10001c57c00be00a10001c56e009700750001c5d100d7009c0001c55500c700a80001c5c5002000cd0001c50600e1008e0001c5e1009800eb0001c543002a00440001c5f8006f00a00001c54c009800930001c53e008800c10001c5aa008700c00001c57d00b700210001c58900bf00d60001c51c008100a80001c593003c00860001c59200f500700001c5e0008600540001c5d4005b003a0001c52200f900340001c573008200370001c527002e00730001c52600f000cb0001c53a00ba00050001c52c00ce00400001c5a400ef00980001c55a005f00620001c5d4008a002e0001c57b00e500960001c526009d00f90001c58d004300980001c53000bf00010001c55b007500330001c5a9005400d30001c5ac007100cf0001c5070093008e0001c5be0064004d0001c536002f00d10001c5a500e500fa0001c59700a800850001c54e002400a10001c510002e00b70001c5ce007100a60001c524009600850001c5a600bd00970001c5590015000a0001c572002a00230001c59c0041006b0001c54200e900890001c5e20075000c0001c534003a00c70001c50c009700c10001c52f00a000d30001c55b00e7004e0001c56c00d800f90001c51700ba00550001c556001f003b0001c56f00b400ea0001c59d006700900001c50400d200090001c5ac009000d90001c5e100e200910001c5d1001a00f40001c580005900690001c5c0003100e30001c518007400530001c539002f00680001c5fa00df00060001c57300c900ef0001c5e7004c00dc0001c512004f00d60001c58b004a00600001c55200d9006c0001c5db00a6005d0001c56000e600370001c587006700e70001c5cf003500bc0001c5dd002c00330001c593008300a10001c5bb006f003a0001c5a80029004e0001c564001700190001c58f00c100290001c523005400870001c5b8007700d80001c55500f000340001c56b003500110001c525002c00350001c5df009200a00001c57f004300520001c544001900a20001c541002c00360001c56f0023009d0001c56c002800330001c550003700030001c5fa005600890001c54b002b007e0001c505007000b00001c50500aa00460001c5ea0075001b0001c5550098002c0001c583008a00510001c52900e000c20001c508006b00100001c59300b700130001c504002c004e0001c547008300b70001c56f00d2007d0001c519000e007c0001c57b0095001e0001c502008a00820001c5d80003001a0001c59b00f400710001c58000f400190001c5d8001000f70001c533000300160001c5be00a3008d0001c5b70020000a0001c5a100c100320001c5650087004f0001c54800bd00990001c560009f00270001c5e100de00700001c5e500c8008a0001c51000c0003c0001c56f002800da0001c5060071002e0001c5aa001000b50001c5d700f4005d0001c5b300e400f60001c566007a00430001c5e1007000e40001c5aa00cc009d0001c52a002100170001c5f000a100540001c54b00b600990001c5be008600b90001c5ae00e200500001c5920095008f0001c5dd00f900ec0001c5c6007000fa0001c5e900ef00330001c53600e900200001c58f0034001f0001c52d008300350001c5a4000600e20001c56500db00820001c5bd00b000340001c545004f00a20001c5f400b400340001c57a004f000f0001c56400b300de0001c52800cd00100001c520001300ba0001c5c40047008f0001c504009e00dd0001c59a0068003d0001c55e008300b90001c52e00e5004e0001c58000ec00070001c5f8009b00930001c56b007a00aa0001c58b00a2003b0001c5df0099000d0001c5b900e2005f0001c5ab001d00530001c5650083001a0001c57300c6001c0001c570007300b80001c52a009600f60001c5df0058006d0001c598002600050001c596003300a90001c5880095002e0001c5b300ad009e0001c520005100730001c578005700920001c5c6004400880001c5a5009b00110001c585007c004a0001c59900ec002a0001c584005900870001c520008d00bd0001c57e003e00dc0001c5b0003c00e40001c5a00095000f0001c5e7005600040001c59800ca00520001c5c100f900ed0001c582008500b60001c515001f00730001c516001b00440001c54300ac00ec0001c546005b00ac0001c5100022003e0001c58c004400c00001c5bb00c600600001c59800bc008a0001c57d000500450001c562002000930001c570002d00f00001c5c7002800520001c5d8005100e10001c548009300b10001c53d00f800270001c563007700a20001c5d3004800a20001c58e000c005d0001c54900f800080001c543000b00d00001c57000f500840001c575005600d00001c567009900310001c5690018002c0001c51a00cb00d10001c5d4002100a30001c5f6004500e60001c5a8002300480001c50500ce00ad0001c56f009000520001c5ef00f700ce0001c56100dc00030001c5210012002d0001c541004300cb0001c56900a300610001c51400a9000a0001c5a3002f00f90001c55100a400010001c554006800960001c5ab00c400e90001c59f00c100ca0001c56c006400080001c56100e200480001c5c1008100fd0001c5a0007100a90001c57c00d300d90001c50e0033000b0001c546008f008a0001c58e006f005d0001c59a002700c40001c5470063000a0001c58f00c600d90001c5fc006a009e0001c563001900ce0001c5cb007500a50001c5130075000c0001c5d2004d005c0001c591002e00360001c50c00d700680001c516001700d30001c529000b00de0001c57f005600c70001c5ac003e00d90001c56b003a006a0001c59800a5000f0001c56e002500370001c50f00eb00840001c580008900de0001c556005700d20001c50a004700150001c503000500d50001c55a0007007e0001c5990095006b0001c5a100c900cb0001c52900ba00480001c598009a00100001c545004f006d0001c504007c00440001c5870092004c0001c51000e400b80001c582004800810001c5da00d600ec0001c5c1006100e60001c55b0052000b0001c50200eb007f0001c535001800230001c517002c00540001c5fa0054003a0001c50500e000930001c5ac00ec00b20001c54a00fc00a40001c53e006300b90001c5580067003d0001c5d5003600f30001c514005000190001c562004000410001c517006b00930001c56500a100d10001c563008e004f0001c508003f00c70001c5d600a400ac0001c5f8001b00fd0001c54f009400590001c55e001300b80001c559005e004a0001c5ba00b1007b0001c501004e00140001c528003500010001c55900fe00570001c5d60031006d0001c544003000c40001c575000d00070001c564007c00d40001c59500210055000161010060006000c16102006000f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : [ + "" + ], + "gasLimit" : [ + "0x3b9aca00" + ], + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "to" : "0xbe7c43a580000000000000000000000000000001", + "value" : [ + "0x00" + ] + } + } +} \ No newline at end of file diff --git a/test/evmmax-precompiles/evmmax-mulmodx-bench-vec.json b/test/evmmax-precompiles/evmmax-mulmodx-bench-vec.json new file mode 100644 index 0000000000..b6252e9a24 --- /dev/null +++ b/test/evmmax-precompiles/evmmax-mulmodx-bench-vec.json @@ -0,0 +1,73 @@ +{ + "mulmodx-bench-vec" : { + "_info" : { + "comment" : "", + "filling-rpc-server" : "evm version 1.10.25-stable-69568c55", + "filling-tool-version" : "retesteth-0.2.2-testinfo+commit.766b4629.Linux.g++", + "generatedTestHash" : "682d204267cf3a3909bf22c063f2c9cde06a917d56f3666bad7ff4c724b3676b", + "labels" : { + "0" : "empty" + }, + "lllcversion" : "Error getting LLLC Version", + "solidity" : "Error getting solc Version", + "source" : "tmp/micro/jump_aroundFiller.yml", + "sourceHash" : "cadfd8a7ee22cbefac3a420cc4c762ca1a3a38ae3346407bd31694acff16c78e" + }, + "env" : { + "currentBaseFee" : "0x01", + "currentCoinbase" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "0x01", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x01", + "currentRandom" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "currentTimestamp" : "0x61a8d289", + "previousHash" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "post" : { + "Experimental" : [ + { + "hash" : "0x51a20eb8dbdec5af48eeecca9e38acb6006fe28733f8649500092464fe6a6364", + "indexes" : { + "data" : 0, + "gas" : 0, + "value" : 0 + }, + "logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "txbytes" : "0xf8618001843b9aca0094be7c43a58000000000000000000000000000000180801ca0999ee855b1d5325fe79efbc40ad560f9ebabbbb97e72e1a4e9cf7e4b8ba34765a06392df208ed06b901f2997995c138bfa06ae8b1a26c15e8aff52cad68f913e85" + } + ] + }, + "pre" : { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x3b9aca00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "0xbe7c43a580000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "ef00010100040200015e3704000000008000037f00000000000000000000000000000000000000000000000000000000000000306000537f0000000000000000000000000000000000000000000000000000000000003001600153610100600e6000c0608460005360aa600153600160006000c2c3010100000101fec57406b003a90414c5f700ac03cd0218c5123b3d300d3c04c5d4025e08590814c542bd857ab34c01c57604d9014e061dc53a0665051e071dc5b603080dc20313c58b17691eef0305c5be04a20605110ec564084a0a130d12c5480bd9029c0610c5bb04b40577090ec59a073d0d380e0ec5b602a60372051ac58005d901060a17c5aa03ed00b20319c5cd027207e60114c55e05f800c4021dc5aa032508d8011ac56e06f600fd0015c57b049c033b071bc58b0b2b15c1060ac5aa07e1025b0d0cc5b80726152e140ac508096005c5021bc506005e00090000c5ec00f700fb0019c50f09aa03db0119c5560b110f81080fc59209740be4020cc5a7062e0e86080ec52e08b30244071ac51111aa06720a0ec51900d700170000c5f800400fd9030cc5aa11cb0ac50b05c5271e8a10c70807c5340a4009a50414c5ea0063052c061fc5d90150070e0a18c55b0ad102db0210c55c51ad29d31602c57f07370bbb0312c5ae002c007d0000c5c403100e170e10c54f23781b432505c5fa008c10cc0707c51817750dfb000ac5050bd801010c15c59608d80312120dc5ad1bbc163e4003c56b08d2020e0e11c50d10320df7000fc53e201e25591b06c5c4081221b40a07c5de02420c7c080fc5c50b5621272b05c5b104d702600813c5da073827dc0705c585051d0a6a0715c5d8027e08f10010c5f800c407fc0008c512274c1d0d2806c57b040d0884041bc5c7098f12f60106c58d07bf043e0c10c53a08d1028f0417c53307cf01c4021dc5ec001308aa021dc5bc021f09d70118c5070ab403050a18c527131715b6060bc5202cf9013a2705c5c803040e000f11c55b07d401090a17c5cd02de015b0911c536086b054a0719c5d401c10272051ac58804a503b7021bc5bb092f1de90307c58e046306f90019c50c18c106fb000ac59a04f8006d0618c5c2076912f80008c53300ea00430000c55e0ab704a80510c55905530595031dc5b2083316401509c55c098206ad0412c5cc02d901360915c51d2d0a31951505c5650846090f0c13c527085c06ef001bc5c20a19262f2206c5f8002a0ef8000fc56812970d9b0c08c57407e101ca0213c5047d067c8e3802c5a905400b0c0e11c558075b072d0917c5e901300ba30512c58f034b05ed001fc59205ad040a0c14c584149411691906c5f000fe00ae0317c59f0cad0af30108c5120b0f0c790614c5f200fa004b0a11c52a35801f153a04c5f8008c00380000c5320816094d0718c500090c0917081bc51a0e260d200d10c5de03c405d8030ac59705a204650813c59304b203340818c5df02e30204110ec50423cf06521807c5d5035d0cb9050dc5e701d502fd0010c50d119d072a0f0ec53f401e4bae1b03c54b073908370817c57e04b602e5001ec5650618098a0419c5661e1e2d931505c5230a230a770616c5bd085c147b1008c52f0a7307250b13c5604f226efa0202c5130c66086f0713c5ce0cfb012b3504c5f007e60c356502c5440eea01e3020dc583057005750518c598005f00160000c56305e9003e061cc58100ee00340000c56c041507e3001ec50f1a840dd90409c5070d480a360b12c526074f0551051fc5470e1112eb010dc5420b270c450a11c523129c081f120cc5ee00bc038c0613c5af05190e7f0810c58e056107390916c5063efe00602704c5e500ea00e1011bc54e08eb014d0814c5080abf02da0117c51a08b902e3011ac57a062f0af50014c50c3c0b3d343204c5f4001209e60118c53b0a4e09fc0012c57d08d003e5010fc5ab089e09630f0ac5510f570fc6050bc5ef00a303500718c5ae066d0c420f0cc5d32c0ff0cc3301c5b6058e08630b0ec5af08910cac0909c51d09a703ae0319c50d180019fd000ac5570ad5027c0810c5272bb70ee80405c594049d04fa0017c5f400b902ed0019c5dc02650a98060fc5720cc605580f0bc54e085b075f0716c560359f20e90703c511155a0f530f0bc5d2026e07220b13c51a72873c396302c5ee00bc03890514c58e03e001c7011ec55f285b29e90504c5b403e001840419c51a4cef05da0c03c59b64936ccf3001c5415ff306903702c5e50183055c0717c5b309101d591408c58b05f300010c14c500128608a3060ec5a904a804200b13c5b3024307cc011ac5d20b901bd80904c5411beb02132107c5cd04790b500e0cc56f09500a1a0e10c5f8005115451708c5c305a00796080cc580150f28b30c06c5a716073efd0004c5770ac9044f0d0dc5cd005d009f0000c526489b21ce1003c56f00f400630000c5cc086b18182606c5770ad50399070dc5140ae9015b0716c5c802f900f5001ac569159e0de30407c564099d06e70110c54909b1044e0913c57407400adb0113c50c11a806e4010ec57707490a1f0c12c5d602fb00f5000fc5bd024b0616081dc5ab54a9561ae501c5fd005a1b102706c59b055b09ef0011c5a31eb11a5a3703c5361c451adb0507c54b0c4a0cf9000fc5ca022a0aa80415c5160d290ccf0211c5dc01d401490816c57705db01be0218c544006400b10000c5123b093d7f2004c52c2ac90a102f05c54506e101a2031cc5240d580aad0510c52c088105840518c557155914be0808c5699636c96d9201c55e350752035403c5690ff900da030ac5730f740f191909c57d2b8528d10f03c51575f8037f4002c5921bac14482d04c5810fe403c60708c5e500380619071ec55008f8003a0914c5b904590a140e10c5ba0b8d13ad0d06c5190d6b08c00311c56c047f0437061ec5bb113a31b01304c5bc023407f8001cc51213ca04550e0cc55608c603c10313c56806f600360916c51b1c9f0c900d08c5fd00d305ab0a08c5ea010f15530f0bc509160d16500f0bc54506de01ec001cc513159e084f100bc5020be900e10117c578135917f70107c58603a103a2031fc598068d06080e11c564112318291709c59a146e1d532205c5ad037a04c1021bc58e053909540815c5e0041a209f0d07c5b2024a065b051dc5ac06710a0b120dc58a0ad20410150bc5120d7e07d50211c54e0a000f6f0811c560054b060a091bc5aa04c502730714c51507cd0152051fc56f14c108f30107c5c81b5256dc1102c58a07480b750810c5e305272bef0305c5841e133bc80d04c5c9048d09d6030cc531096c07ab0415c51608a803ae021cc5ca014d058d031ec5cc028e05bf0216c5dd02ce03a1060fc55f16bf09b60a07c56609c103ae0411c53d0a330bd70212c5d301f9005d051fc517151a142c130bc5950dc107241b08c57c08030f6f0910c54d095e08ab0412c5272b7e19d90705c5e700cc017c051ac55d089505a50413c5ad07e902790c0bc5510dc0045a0c0dc5eb01a906600c0dc5ce09e106e60505c53e400653b31903c51f09c702900417c5a302f20037061fc5cc081f25941106c5d7027507860613c56a08b304910612c59403c302ad021ec5c702370a7e0613c5770089008c0000c5730b630dee010cc59f00ec00b30000c5f3024325751b05c5433ea01f254803c59f03dc01a7021fc58917f801e80405c59c6332cdc73801c52cd3ca354cb301c5581b0a28162606c5aa0243065a051ec50354712ff80203c57c2b6932742e03c5fd0056387f2a03c5830419086e051cc55d124015f50109c55e054a06ce011dc5400a5409990513c59604da01f3001ac5440681045e051bc5c00634149d090ac58d04fe005f051bc5300be801890612c55011890b980a0ac59e057a07520912c56d08240c3f0a12c52f14a009860c0ac5a003c50101081ec53a06a4036b051dc54307c502110919c5c60b741b5a2105c5ec002907e1011dc506294f1de20406c5650e1415660d0bc53806b10249061ec5ae03dc01b10315c59a03aa02d1011dc5a6084113dd030ac57e08110ec20310c58e0b3c1315170ac55113a8096e1009c5e1040f22e50307c50d1600175f0e0bc5280aed00c80214c5c7025908b90313c50929d606d70606c50529c509821406c59006c7034e0b10c5b704290ce00111c52c0ab9033c0914c5e001610569051ec58311fe00c40807c529110614f2010cc50309de01fc001cc5b80499069e0610c51308df01aa021dc51f25f601d60606c55705e001d0011dc5f3004c0b8a070fc58f0e071f161d08c5c905dc0329150ac5460be401630910c5c904410faa070cc5c50412121d110dc51e0c050df70012c5e001d702040e11c516079603a2031ec5af02b402c2021bc5204a0952932403c5a60816150c160bc54b3ca21f742e03c550067e0481041bc52208150978051ac5d9045715a70b08c5ac146d24532b04c5502bdd08762204c5df019c042c0a15c50714cd04d6030cc57d0048002e0000c53b08110a390817c50f3ca815b21304c52f08be0232071ac53728142ff60105c58b10ea035b1707c562059003b6021cc51608290702091bc54a06680547071ac5d302d302a40512c5bf03210de10111c5e1011c0800091bc58d031907ab021fc50610a605be040fc5a61d96236f3003c52137cb0df90104c58a08c704330e0ec56a00e300850000c5ce02b203650716c57e04f700ab021fc5450ca605f1000fc506166d0d690d0bc5cf031212350f0dc5a704a704e00115c5790eca059d0a09c5241b1f1cc80608c5620580041b081bc5a604f600d00216c50f0c2c0a2a0a14c59f044b08720616c5c404bb0589090cc51c0be001180b14c55c061209ae0319c5ee009c03540619c5f3030f3c702304c5e701090f1b0e10c5c015fb01a31e03c5a905c403f90010c57711061f431708c5a80c481a221f07c56005f000db011ec593246633693203c51f0a3c096d0615c5cd08002ae90306c5c3024407890418c50e079f0306081fc53f26bb0ddb0705c5b903e601f20012c5fa00e501880613c545142d172a1709c5a408650e17150bc54a0c6f09290e0fc57a0745092c0b13c55905e70009081cc59007530c77090ec542112613850b0bc52806700454051fc54f06b502dd011ac5050f7c089d0610c549060c0877041cc50553ba17de0b03c58406310abd0313c5e50d4e58654d02c5521ccd08d50706c5760f5712700f09c51f0899037c041bc5f1040752d10f03c5290af6007b0615c5e201bd029e031cc57e0453060e081bc5a05ff50a877801c5d50a9b19632704c569075c07d00215c54d0bcf032c0e0fc5ae04d402380b12c585188618392705c57e104317bb0808c51c095b075b0717c5fd00270c640911c58a06320a9c0513c547061908cb011bc5c93648b7f20d01c51c0c5f087a0712c5e7019d04ee0015c52e458e25e60803c51527e304eb0306c5f306c01f704702c5f400280a540814c57705ad03f7001ac5d6037c0ad5030dc5410bb904690811c5d40a7e204d2c04c55f05620502081ec58d0ad0043a110bc5bd090d22ec0207c50109e6001d081ac5600cd7032e100dc59b044b08c40216c56b94c23d807f01c54d0537062b061fc5820a660c27120cc55b08c6038a0613c5b0030b0bd80116c5b748dd22d82701c51b0e230d1b0e10c552085108440914c581058f049d0417c5eb0a286bf30602c57304de018d031fc57c128e10701407c5b9073e138d0b0ac58e04a80384041bc5af050b0fc20310c55f16d2063d1b07c54e084408bb0315c5e50030060a081ec57b046905c9021bc56e062309b80218c575098408e5010fc5eb01e002420f0cc5df031917c3060ac593036405eb001cc58005cf028b0516c5e601420cb5040fc5a50f541c2b2306c58d044207ed0019c5c409601a0a2806c52f076d05fa001cc5b3035b07c50217c54f06f600ad021dc57404b702d6011ec50f0f560ab90410c503129e06ad050ec567088707820711c50a0dd502230c12c5483d95234b3c03c518080e084e061cc59e03e800e9001bc59a032507e3001dc5a803fd00e9001dc5b80ee0066b1d05c5f4008a06070d13c516098804300818c5c601c60129061fc5e805e207dd0804c5aa118f16661e05c5ed003208e30118c5490fea01d6030cc51f08d90158061ac5ed00a60372051bc567006300a40000c5fa00fa002f120bc5d8012a0607081fc590081a1119110dc59706be03820711c5b80edb075a2105c55508ee00620813c508319714e40505c5e3021a111d110dc5f6001308a9021dc54a0a040e9d0511c5070ab303810517c5c0020409c3021ac5cd0376091c100ec5481e3b20062906c57809280f3f0d0ec5501de105871406c5dc02c204a2060ec5470f8e09b6060cc589058605d70116c58f03b50258051ec57616401f0d2806c52a0942088c0516c54b07e401b90317c5580b500be1020fc52a1e07230c2207c50a51bc169b2103c59e0d0423581707c5e70051068d041bc5190b1e0bf20014c5b518154e2b4603c59907de0293070ec574047804bb021cc592056d06fc0015c55b00cb00fa0000c5ca029a05ac0412c5490d9307cd030ec59d06580bbb040fc5010cd9015a0715c54d1002175e0e0bc56713201b371908c5e300ac02d4011fc57506ea01b30314c51a4c6234e50803c5e9022418311609c5050b0c0b7e0516c56611fc00b30809c5e3020e18cb050ac5160c78075b0813c56709eb01eb0110c57a089806c6030fc52b2ab20fb50e05c5ab084a12cf040ac50609a3036d051bc55809070d0b0d12c5463d8728533903c50309be0240061cc5a50a151a6f1009c543060e078b031fc5e401ca02660715c5c73821de40bf01c50e0bf4008b0515c55709470a290b12c540076206360819c5d2011e09cd0217c53407b002a7031bc5a307650cb9050cc5fb00391cf90007c5aa030f0a890516c5ad0a900d711108c53b13e003950a0ac5ca05950a690f0ac551187c122f1d07c5e5022112630d0cc5da01d801eb001dc5b5037506c50214c53019be086f1208c5660c001532110cc57b0bcb041e120cc513279012e00506c5041f9e0c291a08c5f7006206f80019c58a080212420d0ec51109d20178051ac50e0aa103b20318c594031f0736061fc5140f7509d2030fc52007410695031ec55f06e8008e0419c59a03680556061cc59e05b7041d0d11c51409b2033e0818c53f15f2013c1509c5d708651e392705c5d0024a09320a13c5430728083d071ac5a50ad3045e1109c51077d515e90b02c54525ab10212c05c5d202fe005c0814c5f50049054c051fc5c204360e1d100ec51e12750bfa000cc5e204211fc00907c5a1059c05640812c5ea045b20751b05c51410d003f6000ec51f097705d20118c59b044e07850517c5d705f2019f0c08c5510c640b1d100ec56d05f800d1011bc52c69813f5c5102c5cd02310c860711c569054f0647061dc52d46f802bd1603c5ac103a27023205c5bd0240072a071bc5b9035109670813c546b93ac550af01c5a7038e04bc021ac5590a9c06da0210c55d20a911851805c51b26b40c1c2506c5ef05782dcb1103c5190ab503bf0315c5124ff503513a03c55c09df015e0911c5d308be0d1d2d05c56108380a530913c5a902e80098031fc5d22d906fac5301c5da032713f1010bc5bd040811e7010ec5ce042b13fa000bc5e006d0096d1d05c57b06c9026e0615c5dc034011d9030bc53e0a170cc50313c5aa02530537061dc5910bf201b4070ac57517ba0b8d1306c5f0002806b9021fc593035d0523071ec55738c912722f03c5f0010d1ee60308c5b904aa05c2040fc5df03d5045d100ac5ac04f700380914c5360c230d440b10c55011990a3d130ac5600a540ba3060fc51112c504b2050dc55f05d8016d041ec5b6028c042c0819c5f7000e0856051dc56c05770421071dc50911400d5d0b0ec5ea00aa0301091cc5ac056e0991070fc54824d807ce0905c51213ec01f4000cc56b1d292af10205c5c8022e08f4001ac51de2ef10ce3101c506312b2abf0c05c59803a80326081bc5f7001b142f120bc54f098f06ce0212c5521c6f182a2306c59c05230c3d0b11c5060f470b650910c54708b2033c0817c5eb146e910ef101c5e3099d20902503c5590729099a0417c5e605d6087e1905c506299611c60906c5be07021ca10a09c514090d0a360818c5ec01640e0b160bc57304b00230061fc5400a8e05a80413c55e0a690af8000fc55d20202cda0705c53621eb03212506c51f079903a5021fc5581433194d1608c56311920c441409c59105d402da0113c50e18251544120ac5441a6a154a1907c53606d00145061ec51e07af0214081dc54e2cba11ac1404c58f16de06bd0d05c5790df401da030ac51e08870448061cc55507b2034a0816c5e901b2041a0d11c5c803d70281090ec55853017f137602c51be47887c23d01c5c604650b6b0a0ec5200bfe001f0b14c585075b094b0a11c5e20055050a071fc5d302070e900611c5c9027e06e80114c5ee02f002d00607c5b226d5158b3a02c56506c402c90219c527d809f6e81701c5d62931ce3fc001c5ad062412bb050cc5ca04a3088d0a0bc53606e2017f041dc58c0ad80303160bc59c052b0b7c0712c5e405112fdc0705c59f08e702c4050bc5e201e8019b0514c572119f0cc10708c577093c0d630a0fc5e0015a09f10012c5b105640bb0050ec5c70218085b051cc55e073a086c0616c584056e06100a16c5db01bc021c081ac5772d513a244903c5b504490b7e0810c59206c2035e0812c5b5027b04af021ec5f4012214740c0bc5700ecc05ea020ac58905f6006c0617c5d5014d057b041ec559085808ca0213c524074f0624071dc5f1008503fa001fc5b90576093e0d0ec565260a3d512b04c5cd03660a98070ec59b06d702dd0210c586036f0440061fc5ce04900b9d090ac51e25ea03631a06c57f100a1e860f08c5ea027511fe0008c5220f5f0b17100ec52418f7001f1809c5630d810a1c120cc555065a0665051bc553055f0583041fc5e70014092d081ac5ad29027ed21602c59a08780b7b0b0cc5050cfd00550814c5b905360ed0030ec5480668056a051cc5e700ba0291031dc5e301c202850516c595046307ba0316c5f300d60137071bc517269d10b90b06c5340e840882080ec50918e003a9080ac5af108817611f05c58e055008870515c5d80286078a0710c5af0004003f0000c5f6000e0cd30213c5490eb305a0070dc5f900e803022407c5d9029c070e110ec514131a13a7070cc54607c7022f081ac5840d3a15980b09c5ce091d2d432505c5c5023407be021ac572088e06270c11c5920d3019451708c5f801701c801905c556055e05e8001dc59e0d6f14f20107c57c04380606081ec5c0028903de011fc51e0c5a098a0612c573463f60be2002c5d9038d0998080cc5500d370fe2020dc56205da01c8011ec5a70b70116b1208c529080009e3011ac5f7012025202506c5c903b005320d0fc560066a0599031ac5f400460de9010ec565080c0d120d12c52e00aa00f10000c54b141e19211809c5a60be003c90608c5e9018f05b90315c53b0abd035a0912c5d10b173ad90904c500095f0522081bc50315a207ba050cc5aa04220c870612c55b08d202d30214c51709b103870419c5916ed629966901c5f0017b0bbd050cc51c25bf0a322206c587045b0548061dc5e9017e09da020dc58229af1ac51303c5dc01f200d7011ac58a0026004c0000c51407c1020f081ec5700d9509d8030bc5680a9f0600120ec51b20421b421b07c5cf03e201d5020fc531229e108d1306c5e9001009590618c5a52def08177402c5e0017f05150a17c5f300d10170041ec5b502810489041cc5d801b003860518c5910c151a191909c58704bd0205081dc54006710471041dc582093c0f03130dc54c0ab404350b11c5f800b504360b12c5ce03fa001f100ec51127f701521c06c55909470a4b0a12c5f6011f25302206c59e03b802a1031bc589059b048c0516c5a10322088e041ac504291527b30c06c59c04210b2b0a14c5ca0d841e203704c5dd0b7c2bbb1603c5fa0047065b061bc54308e0011c0a16c5ea0031073e061dc5bf025406270819c58718fd00c30c05c5c203070f770810c5c504ef0174090ec58009d80387090dc5f100d601bd0219c5ad033a08810517c5e2014809170c13c5f6008807ee0110c53107bc0272051cc547063c0608081ec515120c1288090dc54706270777041ec50109350734071bc5bf0cd109d00905c5c30f552a871e04c5f4033a41ae1b03c54908e4013d0915c5a505e101520a11c5e601f60099070dc5e708513a4b3c03c513082c07cd011cc56f0d2d13cf040bc55c07100b9d0415c5fe00fb002e0e0ec55508100c510913c5880e930d481608c5bc024d067a041cc55007f400400816c547171d1c9b0c08c54a1eb00dd60606c53f0b520af10011c568088706fc0012c5ed023918511508c5450f4b0f650c0cc5f3003a0b130d11c58c03ea00fc001ec574063009890517c5c8028f05980415c58404d301a6021ec55f06eb00290818c5a013af10e60505c5e600fe0055051ec5f700b900090000c57b068b05750615c59a149615172e05c54924631f402605c57f098608240f0ec58706370aef0013c5e5058a17ba0d05c5d903ca0496080cc59e067108470b10c5a80c3b1c451a07c58c047a05f9001ac5de011b0792031fc59107c603100f0fc57c0e101afd0009c5020c310a390914c5450caa05170f0fc5f000510661051bc54ab5de2157a801c58b0c5b129a0b09c53c113f117a0c0bc53d10670cdf020cc53f2014277d1506c5e800e3014f061cc58d72d827857a01c5990e1f201d2007c5fa0097038d041cc5c103340a4c0913c58c13631ad20706c5b60a3d1ba00d07c599333465a52d02c5d0020c0f970610c577166b18c20a06c509f6ce31ca3501c5bc091022cc0707c5ad035408340915c5d2003600a10000c5a608b306d2040bc5f7009b05260b13c5d9014d0631071bc51111ab06600b0ec53632e207ef0404c5421bca073d1b07c57b21d00b861e04c5b6180055722f03c54b06bb0298031bc5ac023e0699031dc59f040c0a800517c59707710a0a110ec5ea000909820519c57b21e406462e04c564190529ac0d06c54d065406ea001cc5214a9c214a3c03c508087904cf011dc55b00ef005b0000c582053b094a0815c511137a0b97080cc56d00b500f10000c555088e05460913c50b12930886090dc55215a50ba80a08c56605930398031dc58c04ba02c00219c56a0629080e0a18c5e105a10fa90e06c5d0010d081c071ec52c694b5a644d02c55807e901d70116c5c738a857e71801c5d702d202870613c58d057306630715c5c103b8047f0711c5d9022e0bb10413c505195a10d8030ac5e0017f056e0618c55c0ed004f2010bc5b20b2f1dc80707c50f086005ce011bc5020c180b570815c5130bbb03070b15c5830915121a110dc58e030c0765041fc59803e300af021ec57800d8005b0000c553088905720714c53116d005980b09c55a06ee00d5011bc5050852051a071fc5a604c903ad0412c5ee01600a0a100fc53e0c5c0a75090fc55311f900a7080ac5210ee601c1040fc5c5027705660617c52b0b310b790712c59500ea00030000c59f04c9021b0a16c5f0005308bd0314c5c106c505a0090ac5c5029403de011bc5f1017e0ecd0509c5ad038005270917c5e701480b570a10c55e28c20ff70204c50c099004df011ac5a606ef01a9060dc5857a7e81708f01c55a21152e5c2005c5114f493cdd0b03c51fe0be41fe0101c5150b020c8a0514c5b503e501890517c56f10b008a90909c50e18d4048b0b0ac5fc00c406bb0709c5c0027d05ec0018c5be035b076c0715c5063ef602f20304c5c2022f06ec001ec56b066f068e0418c5ad03d5017b041bc5a703be02820517c50b0cfc00460913c56a08a705ef0011c5a20d5b172e1d07c52f1ace068d0e08c5580b061195070ec53732c90d113b04c552061c080a091ac570075009770712c5f2002d0a370a14c50a0ba9043e0915c55608260b670813c5800af60004140cc59904c502400718c5de01d401df0119c5bc06261514170ac5f4002e0734071dc56409d9028c0710c5f700570f750c0bc5a803bb02d5011dc5bc08f001b20908c5f900bc035d0911c5d12e43bcb64901c516119b07320f0dc5bf00d900c40000c5ca023f09290a15c5a3032c086e0618c5f5005d0c9c070dc54f05cb0113071fc5a6093716621109c53908f700930418c56a05830485041bc5350bbe035f0812c5c7049c072c0f0ec5483d712f623403c57a16af0d132706c57c0766085b0912c5e8024510c4050bc5f001ce0438120bc58d04130845061bc5910adb03e9020bc5cf09ad10122f05c5422f9a19e70604c57b068d05770615c54a00a100a20000c52b1e9b0e052307c5e600d60163051cc55413840db50809c5f90659a6cb3401c50d0eba04390b11c5e70c5853197302c5c60285043e0719c58606e7014a0913c56f48236e197302c52708aa0301091ac5f0000e08f4001dc5821957215d2005c59a07610cd8030dc55d07b903530716c5cc02f4004f0717c5e30069054b061ec5d701e900ae0319c537065c0561051fc531085e06350818c50f07e2005e051fc59a049304260918c58a0ddb04dc0309c590033c06ef001fc5ce186e48246d02c5fe005f054c061cc55b05e3002f061ec5c6035209ed0112c54c093d0a400a13c59904c1026f0616c5c905e90206180ac5b4026305fc001dc54108db016e0616c5180961067c0518c577443664e50d02c55f053c0786041bc57105150825081bc51d08da01f2001ac57907f6007e0711c5093daa15383104c50cf328d7dc2301c59611d507dd0506c5e302171333110cc54a066205f4001bc5e606fe007c2004c51a0c6c08a00512c56706fb00ba0317c50af5cd32a25d01c5a0177023bb1104c53b0d6b09a9050fc5bb0234089d0417c50a28ec03d00706c501172c139d080bc50912d203b8050dc56807d102180b14c56e09150f03100fc506230224be0907c5790b2811ef010cc547075b06c7021ac5cd042d11f2010cc5de01af02ce011ec5310666059b031ec586043708a50319c5e301ac04190b14c5d601b903b30317c5c907b60a811207c524132c13ad070bc599047305d20119c585083e0cc7030fc58e0b2815e7020ac5270fe601b3050ec51908f30028071bc53921521c002a06c5e0018804f80018c5f4022835fc0004c52107e300e7001dc5ad052d0d820710c5d52a09f6cc3301c53f0e6c0b6c0b0dc5d105ef02a30b08c57105290818081ac5060a5e069b0418c5e80032073c061dc56a062f08c90218c5080fa705e80110c53b0fd703be050dc558a72fd09b6401c58a1d4a2d4c2c04c58805a504d40116c58a751fe035ca01c52216770d960a0ac577226726e60604c5a7048b06570912c57200da00d30000c5280afa00420914c5c602f400810518c5ac04e4014f0912c55c10f001610f0ac5c2011f070b071fc55508d7012a0a15c5614f077c2c6902c54c0a320c7f0711c57e047305a1031ac503090609d0011ac5f6003300420000c50c0ae9004b0718c53b1ce004082307c58905a603280917c58b05d901f20015c5e3030a1e3d1808c5c809a60ea10f06c5ca023809080b15c5d3024808790615c53bc48778966901c54e053a06f3001ec5500b4e0ba0060fc58d08d203e7010ec51510f700210f0ec588038a0338061fc58606b304c60313c5b6030f0ca80414c5e501a406400c0fc5251fa60c371c07c5440b230daa0510c59607160fe0020fc57204690406081fc5f0012f1a8c0e08c59b0e8211f00207c599049f04500815c5f700f9009a031dc5800cc20628150ac5f90089068a0612c5370d3e0cdb020fc55808260b2e0b13c5b606b406700d0bc5c41d5e50276c02c58e08b805b8050dc50f0ab9031a0a16c5080afa00380818c5601fc40b5e2005c5220da8059e0511c5ec01a508be050bc56f004a008c0000c50c79873cb62402c530290232152e05c509090209bf021ac5070aa303290818c55853e50da02f02c5cd054d139b0b09c5310a69072a0a14c5660a8908cf030ec5a50a3316311609c55e065c061f0819c5e201f0009c0417c53b078a04fe0019c5ee00b600880000c58b04b802d2011ac582061e0b5b0814c5c302b102c6011ec5ee00e401880612c58c0b4512f6000ac5cb0a4625482405c5690bc70490080dc5c903550a870710c5b2269833187302c5330e0611b8050ec5e9013a08520716c5ed008304b6021fc5593736439c2103c511072e06f1001fc59037a72cf80302c572171d255a1b06c51d08eb008e041ac5d402110d8f0612c5ae04150d270c12c5340b240c240c12c53408c302c40219c52f10740ae1020dc51e705e50565402c50d3c3f30f70204c554065c0561051cc584035605ef001fc5b104d902e50113c57f04f7001d071fc5b305140fe8010fc52c466e30a01f03c5050a6d06210918c54517b109b00908c51f12ad06bd050cc547094b09160b14c5e001f5003a0c10c59c03240779041fc523093b089a0418c56606b602d50119c51f0c9206290b12c51e0e9806150e10c5b34c06f9ba4501c5210f340e18100ec5c2149f20812a03c5890bc5056d0e0ac5cf098518aa1105c5df02a506bb050dc5050caa04920514c59e06b204700810c58f06240cc80311c5de02790aef010dc5cb02e900070a18c53827232cf00305c5b103d801030a17c55c17241f511807c5f102dd04092307c53906380653051ec5bb050a1434100cc51417960ad1040ac5c801700483041ec5f0003b08a70416c5570a310cac0510c5110a7206b80317c57e405256704702c5ce01a60312081dc579043607a0031cc5c405870a1a140bc58800fd00680000c5ef01850ac2050cc5fd00bc031e0b13c52d0b0c0d260c12c52fd06f9021de01c5250e8008530b0fc56600ab00050000c5c80254083d0914c5cc087d15d60606c58105cf024d0816c5c5027304bf021dc58d05f300c90214c5236e1276b52502c58904560502081dc50723b50ac60807c53407d801ac031bc54026cf09d20905c58405f000e30115c51de2af50cb3401c5f403cf10d80d03c5ba02450632071dc54507f8007a0519c55e09da02670811c5930a3a136b0e0ac506001100f30000c58f07060ffd0010c5c80031001d0000c5220a9005c30215c50a09150944071ac5740a24101e110dc53206cc0164051ec585112f1dc60807c583065d08140c13c5ae0205082d071cc5db016d05530619c5b40ce903172606c504009800810000c56611121aea0209c5bb4477880df201c554069004af021bc59108790a8b080dc5a90e1a26901206c534092a0a2c0a15c5ae28e60c1b7202c5a01f2349c61303c5711c6c1d2d2a05c5c4038b06a80413c58c030508bf021fc558099e05c00311c5300b7207ab0412c571006700280000c5e601a404ee0013c5a8039105a90316c5de0172045b051ec5fe00280b0a0c13c5490de8018e080ec5fa00fe00100d12c58208cb0394070fc58f04410765051bc57e07f000270c11c57f0638092a0a14c5060a7f05d90117c57e0528099a0417c53609140b160b15c56a062f08310818c5fa007605030a17c5180a4008f70016c5320a2c0a610714c57c063f0a2f0a13c53a0df10088070fc5fb002513d0040bc56c10d704421509c575092b0fa4060ec5ad10eb04dc0705c5fb000419bd060ac5da0cdc0bfe0003c5f903654d4b5a02c5320c330cb10410c5120a5607690617c530072e07e8001bc5512b21374a2d04c5d201080925081bc5cc018604e6001ec54f068404c4021dc55c1b09293d2006c5f5000810c0040fc5c5002900d30000c54f19c208e50307c5c9124b3c2e4503c5ad05d9025c0b0ec51e0dab04b90411c5c705bf06970a0ac5090815071c071ec5ce0ccb0ddd0804c58605b303d00215c5e605db078c1705c5e5064f2c5c2804c555072c08410718c5801f7a216f2404c5fe00bc053e0e0dc52815660f00190ac5420ee502d1030dc53e306a253e3004c549142f173b1509c5d303390e9d070ec5c603370ca00510c5b649966915ea01c5d807b50e2d2a05c50829571cf80106c5d201050885041cc5500a9e06910610c561060009bf021ac5e702690f02190ac55b0745083c0817c5639cac53a65901c55d078805040b15c5200cef00dc0112c5031fd804e30308c5611a2125352106c5a92b9236bb2202c5d60d8a270f5003c5da045912f70009c53612500f21140bc5dd01a0059e0513c51108510665051dc5ab06c304dc020ec5930a8e0bda030ac5200b260bda0113c5aa056009180e10c52f0d300cfd0010c54307000914091ac5a41ee508df0a03c5b2027e041a081cc5260976066d0616c5b009a80a471708c5936c01feb74801c5740d1d1649120ac5cf0433144e110ac5b307720ee2020ac5473d0852bb1603c5eb009f04a40415c50b0a5407160918c551158c0e5f1408c5bb223c61714702c588041a08bd021cc5930a690fa8080ac5ad0b4b19f90007c584116516261f07c58318b10f991405c547b850afbd4201c5d30e0c51cf1003c5aa030909ca021ac53d262c2a452505c52a23bd0b9b1006c5e8035618cc0707c5194c6f30992203c51f0e810803100fc5ef00c802780518c5d5008c009d0000c53f3029354d2c04c54108030a8a0517c5403f772d782d03c5e3019005d10214c5490e2310c9040dc5e8017006360817c5012ad107d60606c5ce02170dc80311c5f70075042a071ec5cc065f14df0408c51e0c150d930612c54c19e503741307c5a9034507100918c55d053d06c8011fc5f900d30175051bc52913550fec010bc51510ca0392070ec53a07fc00ae0319c5c9029704dd0118c5122fe505cc0a05c58804f6009a0419c53017a8099a0b09c58a06da023c0b11c5d9035c0d0d140cc55f0682052e0818c52c175712b40809c51613a307cb040cc5206f7147465c02c51510620b410d0ec533112a111b130cc5fa00d701840515c573176619451f06c51913790bef010cc5190e6d09f50010c5b10d5b1b531c06c56f08d502d80211c55907b5030c0b15c5510bb305b9040fc58f255d36284703c5ad0a6313ce0608c5236edd11f70402c53807c202cb011cc56c07bb03260a15c5ac53db24798601c5c9063616321609c5c00fc70e293504c52d0ab1037c0614c5b3044b0ae60111c5ad0a8a0eab0a08c5071b950b970b09c59306560a140e10c51b00f400c80000c5dc01d301b30317c56b05aa03910419c5d002a904c40214c5a5056508890612c5490a8a06b80411c5470a100e140d11c55800c200950000c5870dc506251809c5e101b603c80214c5ee05f104902503c57a06fc009c0414c559065f06bc0218c56d14c9073d1b07c5920f6416b20b07c5e901cd03740a0dc582057406510717c5550e480f410f0cc5c6026306800519c574051c0868051bc5d00180046b041fc5220d2a0cd80211c5960dba08c20708c54f0bac05460c0fc5730405084e061dc52b09e601300916c50a18bd06820c0ac57904300739071bc538185515d00508c5960ada03f4010ac5f500d201bb021bc50c16aa078d0a0bc53f203f20b30c06c55609090ea30511c54108cf02f40017c5c302040b640716c570477445396302c5ea070055e20903c59f0c9d0c691208c5fd00190b260a14c57f04620554051fc56e918778ec1301c5ab04bb03e90112c51c10b2050b110ec54506ed00c9011cc58e71b847ae5101c5012a441fbe0a06c5250c8d06460a11c573233831c30f04c53b10f00111130cc52b2ae305651e05c5fe0078095b0a0fc53c067604fc001cc5d3169634b92302c5cd02cc02740712c5a3008000540000c5e501df01e20114c5f600070b150b15c5d7024f0a900611c5cb0265085d0912c5cb0402170f150bc58e05ad04660714c56f088c066b0812c5cc0c1e38642604c54f10780c4a100bc50e105b0a2f0d0fc5f500a506500b0fc5173a5c28732304c56c0cbe0503150cc5bb02bd028a041cc5621a0b28242406c59933e90b535602c52f0d330dd7020fc53a07ef0077051bc59c035405f3001dc5ba02f0003b061dc5060d3e0a8e0513c54b002300260000c52a6aaf28cf1802c5ec014d0d400e0dc5db015a0549051fc5ce041e148a0a0bc5b905d203a3070dc55b07b703de0117c5220cfa00250c12c5a703e900b8021bc5dd0118086a051bc59a04d201840517c5fd00530dec010dc5030a7805970419c5860bb606b6060bc557006d006f0000c597042f09b90316c5b604ec01bf0311c58704ca0157051dc545bad8272bd401c5490fa2079b080cc54d075507720617c59c047006860516c5da046910ed0209c505085f052c071dc53d18920db90808c56533174d742e03c5fa00a60220071fc5b9029204a1031bc5e6011609d10119c5dc02db03c7040cc56e12201b8a0e08c56808ad04010e12c54207ea0006091ac56205b40259051fc57e090213ea010dc58406b803c70312c5192e132fb40f05c59e06db02b00410c54f0bba04ed010fc5bb02aa03ed001cc5f0019c08a0070cc5600c0e122a100dc5c9028b040a091bc5f800c703660812c5e309b01a742e03c56705ea007d041cc51b20b60a561807c5260a090b3b0915c5a7002900a10000c57f0492048d041bc5c6024607a40319c5850fe802b80808c570176c188e1206c5c10a1d25cd0806c5580b7e08e5010fc51c0960060a0a17c53c081c096a0617c52408c70268051ac5a5043b09050c14c5b0030e0a910418c5a7043a0a120d12c5e90040071d081bc579134d196e1407c51ce307f821de01c56d05ab0349061cc59b03df01ee001dc5340756062a081ac597061a0f6c090fc56a0a400dac050ec5e30169066b0617c5140fab051d0f0fc5fe007d09d1030ec59d06ba04e00110c5a606da025f0b0ec58a03d101a0031fc5c33c9d62857a01c557126710ed0209c52c11b905b7060cc5c60bdd06102f05c5c8067111021f08c5cb024308cc0216c5455da12fa32e02c5060a6806290818c5d30e6932264803c5b0029f0328071bc590076c0a730a0ec5d402dc01860612c51e161217d2040ac52b087505720518c5eb00a003570718c52112b406de020cc5830439072c071bc5c602030b690616c5fa007406fc0016c584087d08a5060fc5470a490acb0212c5f0032d2a222c05c54706070889031ec5a50f8115222406c56810d4042c1709c52d342b35b61204c5d705b80ad50607c52b0790036a051cc59b044a07bd0218c5540a6b08a60511c51b091009ce0218c5460c690a91070fc5c61c803fb62402c56405b702c9021bc5d30bfc003f3004c5522b073ed50a04c51911c904ea010dc58614591bf20206c540095608240a15c500153e1018130cc59904de01a80319c5c103e0013a0a12c5ee01b80400110fc5410bdc02350c10c5c6098913dc0506c5e900ca0227081ac56405d5013e071bc5a611a312083105c5d501460659061bc5e800c602570718c5bf062016960a0ac554008400930000c5570cf3005a0c0dc52512ab074a0f0cc554abda257d8201c529098905c50217c53366a22e595302c5857acd3201fe01c5d0013f0689031ec587054c08dd0116c5db023a0b860711c551089905e50114c58418212c572105c5c402cb017a041cc5f400fa00610b0ec54916271b0d1e08c5e300e500a0031ec5470ac0039c0512c53f083808fd0018c58f048204fd001ac50d50da0c7a2c03c557059b03ef001ec5b9236d498f3802c575056c05c4021bc5d12e817e24db01c536084d07a30319c5ec005107390818c5d5019704e9001ac53a08e201000a18c5f20291167f1905c5ac05510c580b0ec59706f800200e0fc5ab03bb020c0a17c52d082709b10318c5e202540dfd000dc5fb00e001af0411c52e0cf600af0411c5ee03202c641f05c5fa00e201830517c511006f00260000c59505f900810613c54a07c8020a0919c5d102ca02c10216c5111dc7076b1208c5c8051415f9000bc58108380d420c0fc57704410677041cc5321de703221f07c5f503f5030b5103c5be02ce02670616c5f9067b845da201c50a2817263d2006c52b0ab7032b0a15c53307cf01a7031bc5020a0e0ae50118c5465c6e48d31602c58c06320bfa0012c52b0b7707c80312c5a62cb425c71c02c51919760f361609c5883b7843336602c59e09e10321160ac5590a060ffe0010c576059404a30319c5d0032e0ded010fc5e3048311172107c5f101ac0a041f08c53d0a65084b0a12c56a0d7c0b910a0bc5680ad802650a0fc53608fc00250917c562165d17681507c5381c900fa70c07c57f04650518071dc5b1027b04ef001dc59f03550504081dc59507240e280e0fc5485b674caa2a02c54c0bb804430c0fc5e606fa01183904c57910e203031f08c5bb02a00368051ac505105f0ad5020fc537323732d90904c5170b7007b20314c5d02f13ec827d01c5ba04b6055e0b0ec518091c09e70019c5230862061a081ac54c08b003a10416c5bd04080fa00510c5f8008d0c1f1809c5b425c21e306702c59f0dd4062f1d07c5bb0b2224122706c5010ae501970419c5f100dd012d0a14c531191e1ce70308c5a208690db8060bc53a186413511508c5d1016a05fa001dc54c0af9008d0611c57006110a580716c53a076705a0031ac54a0a8f06b00412c50e146a0cf5000cc5130865057f041cc5d604a808740d0ac563167114fa0007c59805350a2e0a14c57f048c0421071cc57608eb01dc0211c5893bc61c4a5a02c597043007db011ac5cb0a282b232c05c5c70e093deb0504c5b3050113d9020dc55107b2030a0b16c552224425821905c5b505a007b6050dc57506a904400914c5c903dd027d0711c5db01460510071fc58e06af04820711c58c031907f4001ec5b402550502081fc5d32c817e897601c57305080a370818c58e0c800e521309c59a061e0f0d100fc5dd017606000c15c5003f432f652604c531075c06ec001ac5a605ad043f0b11c5a8031b09240819c530456a31e10a03c54a166013d00508c5ba06f301d3040bc52f0d7308ef0110c588030c0763051fc5d2034e0b540b0fc50d14860adf020cc5a903090810081cc58a13e7043d2006c5c9041b1198070dc5103bfd007f2004c5ac05440d470d0ec55007a004bc0217c55006a903a2031ac5bc028c038c031dc5ab0a6413411708c5b309f301561508c55a08cd02670813c5a30dfc005b1707c54b5ada129c3102c53107ed0030071bc5cb02d3021a0c12c52112d7032d110cc5c203f100b20412c5c802310705091bc5c11452390c5103c5860cdb03d4040ac50a0865058f031dc57d07020e7a0711c50f228c10211f07c5910f0823471a07c5e801120d7d0712c589077708500a10c5d3027706030c15c5621ae604511d06c590255d36a11f03c5c80d442e672604c5f200700a640b0ec5ad047706880514c5f202a00f631a06c535072c0741071bc5b34cf20d7c8301c5ca050d1826150ac5c8012d0700081ec50f11d103d2030ec5a808970a0a180ac51d0b9205580813c5851ea416373204c5cc0ccd0cce0c04c5e401500694041ac5da01ac0227071ec5dc237c83ea1501c53b06f60099031ec5aa1149244b2405c52b0f480d82080ec5c314204a244903c5f10e758a9c6301c5629d8679bf4001c5020bf600230917c5fb01fe00373204c55305070891031ec54b0712090d0a18c54910141524130bc5ca01fa002f071dc59a043b08080b16c52c0bd902ee0013c59d039903b7021ec5433e5d36dd0b03c5e002820882080ec5d601a204c30215c5e303c506930c09c56b059503a5031bc5cf03a407f3000dc57406a8042c0a15c59a054c08830614c52b2af801d70805c5710ab8051f110dc56a069f042d0917c5d608d109ee0305c5a502f100d9011fc5dc032418a10a09c533127f0b680d0bc54506d80186041bc59504a803b90316c56f07f7003b0914c5f40241269d1305c5b0095f142d1a08c5b50346081e0a15c5cc0412130a140cc5fb00ea0104130dc51e080c09a7031ac5120dec010b0e11c5040ac902840517c5d503ae06b1060dc5c2024e0580041ec56107180bf70014c564093f0c880710c5561c591b681906c5d501850493031dc5bf02570619081ac5060ab903830517c50608df017e041ec5fd00e8019a0513c5200b43095e0814c53e09f100b20315c5c604d603ec010dc55600a3009a0000c5a3000e006b0000c5e502101726150ac5164de10aaa1c03c52715670f4f110ac56c05f5002f0819c541073207c5021ac5634e823e047d02c5ab04b503820614c5c803f40006100fc52d2a3428542205c56a252d34b81104c5fa00d10303130dc5e6012d0c370b11c531062e067f041ec5b902a303c20219c50d002300db0000c51c12dc0200150cc50d22b80adc0507c5e500a5030e081bc57307330b8d0612c574097409500b0fc569251f38831f04c5391cb90a192007c5661ee3059e1305c5bb04dc02e2020ec5ad032308360819c55908a804c40214c5c202b40204091bc57f405e50734602c5502b931bdf0804c5b20b1b20731407c52a1a9a0cfc0008c5184d503a164d03c5e00171073e0914c54507ba02370819c5c7052214790c0bc5e7014c09fb0013c5f10079088f0710c5c9022b07b9021bc5480618081d081cc50a14840ae1020cc57108150eb30410c5a0042509490816c57b05b1032b0917c51b098505eb0017c5112f262b252b05c5502b0d3cf20304c5c805f501be060ac59c04d002ec0014c50e078d0349051fc5140dd802b80411c5fe005507d50118c5e602c1067f0c0ac58f162f29d20905c53a0a440ad10212c56c9354ab7f8001c5ac29057d9f3002c57208f600180d11c532111013560e0cc5d00ffc01264803c56c106611ca0509c5bd04290dc20310c5450b9206a80510c5ea01ba0479080fc5450ae001600812c5190a7906300915c50312990777090ec53112f00100170bc59b09a60830120bc51f08fa00dd011ac5270751069f031cc5a35ce01fc43b01c5dc027c07950611c5de035e11830d09c55c0c071383090dc515eaee11dc2301c5d30775177f1506c5e50d823e306702c5a0035f0680041ac56b18591bd10706c5f701421b022407c56c1d112fe80405c587089d061b0f0fc549243927be0d05c5ef006306d70119c55f063e08ae0318c53d40194c852803c55e08f700f80012c5d502df01f10012c5fe00af05bb0410c5ab038704a7031ac52d0b310b290b12c54c0ce2029f060ec5130ff300a5060fc5d6021910bf040ec5425e6f48be2002c5fe00ea002c071ec54207a103cb0218c54c0d430eea010dc50631e804831805c59407c7042b0f0ec54011740c5a0f0bc5bd04a405860710c5f600d701ab0319c5d5025409a10413c5a3043b08b30316c53007790590041ac5f8022b46344303c5ba04e901b1050ec549092f0a820613c525097806c90216c5c7022d08450718c51de28f70aa5501c5ad05f3008d0710c5ab03d30171051bc5820b151516150bc59d034f07880419c5a80a3818f60108c5380a020d680713c52e07e80010081cc5a9034907c10218c590164d23901605c5f90132224a1e06c5e801d302dc0112c5fb00cb00880000c5fa00820d900c09c512099e04340818c57706ee00240916c5e80b1a726f4802c5720f5013da0409c5d2068811301d07c577046f048a041dc5ce043f13b6070ac5320769055b051dc5040a4f073d0818c5c40b701c9b1405c55c060e09e7001ac5ef00bf023b061ec58704dc016b051ac54a3c5b365d3603c58d082510bb050dc55c364d3be50803c52f0d440c85080fc5ae07590f42110bc58009df02b8050ec5a3036006890419c53b209c10531c06c51100d400810000c51527bf0a042906c5f405276c9b3202c5e201fc00a8031cc54807d601a50319c5260c8a06790712c5e9023a15251809c56c00ec00ce0000c58a078608570b0fc5bd098211ad0b07c5200dfa00460b10c5ef0078044a061dc57e007500d30000c5d5011e0a1d0a16c52618a809141a09c590043009e10117c5f8010723501907c5120bce02960515c54306940306081fc59c09970ae8020ac5194ca61dae1b03c5181c9a0c5b1408c55a52445d6b4a02c5e1014e097e0712c5ca03a505d30211c5ab100931d00905c5a703b502e5011ac5c7050d1808180ac55b520c79415f02c5460a310ccb0311c52c07b1028f041bc58e0aa1087b0c0bc57306e501c10216c5d3062a1e092307c5be02260898031ac5d2018204b6021cc53742cb11a81d03c5aa153133193904c57d069b05f70013c525093109b70316c5a013a412442505c53b416035ac1b03c5f100a804a00512c5c102bf02c7011dc5930ced021f1809c502002a00670000c58e091513fa000cc56719b30cb80b06c5bb44db2401fe01c5a9065c0ce7010dc5e307bb11c80d04c5b503210b200b13c57311b009940d08c5b109f800d40508c55f070c0b800516c5d805c408661507c5de014e09d10213c504fb2ed1df2001c581048b0377041ec50e0b3709cf0215c5c40292030c081dc5102206237e1207c5bb4448b7f30c01c58e04fe0062051cc5a80360067c0517c53f07270859061ac52e10720a4f0d0dc58c39ab2a515702c535065e0528071dc51907d601a0031fc5da01db0158061ac58015f4011a2606c5290bc603ba0313c50b11fe00730a0ec59a047306e00117c5c7022708dd0119c549b6d12ea55a01c515093a08180918c587044806fb001ec57c06a2045a0813c55f06ee00790519c5e5082e45324403c53600b4001a0000c59005a803860516c5c6022d09660616c5610a8f07ef010fc50c08c0029e031ec50e0d3a0af50012c54d0bbf0484080fc5fd00c102310819c5d304d104b7060bc50616031632120bc55805110775041ec554077106810517c51d2083110e2207c5ca071721231f07c5011f7f10451708c5b2038405700616c5280d8e07810710c5f800e50048061ec55d06020a0a0919c5e4047217761606c5110a5907180a17c5af0a7211b20908c5db01070864051dc59f18931b9d1804c5be047f08c7030fc55a109d09ea020ac5cf0173045f051dc50f0a3709ae0316c590031e0876041cc56207d601dc0115c5c303f7002f0d10c52a1af201771108c56407eb00110b15c557077a05c00217c5670a240e87080fc5d502cc02490815c5d801db01ce0217c5ab07440f420f0cc50a097105a80319c5b109d605ab0a08c5270a4408840515c5e301130a9c0416c52b08b5034d0718c50132701cf20205c50c0e530af80011c5c104390f1f110dc5b8025c05b6021dc5b7189b21ac1b03c59435d4159f3002c5e7007105a1031cc5030e120d4d0a11c56e05dd01ef0019c5a703d5013c0817c596047f055f0619c54c0a8807610911c50d091e09a10319c58809480e560d0dc5220991043e0818c5b4028d04d6011ac5a2056208120d12c52907bd0278041ec5a6032009450718c529061e079d031fc520166f0e800c0ac55a09ce02820612c584044907c90219c5d301b8022d071cc5ad038204f2001bc5bb023208320818c50a08cf01d8011dc5619e38c77a8501c5d7011f09e80018c51b07280759051dc58a03fa009a031fc5bc06530f03160bc56713bb087b1008c5eb0012003f0000c5e9007a059c0418c52f687843e20e02c5710b460fb5060cc51c084d06d0011bc5741b0332053205c55806e5019a0418c585054d07420718c56905eb00e6001dc5c0026f04ec001ec57305ba0206081cc5110ef100400b11c5240ba104c30313c5d1012a071b081bc56c070d0cb10413c5c3027c05860516c5d0014d06a9031bc506082c07c1021cc5c504ba04e0020ec56009070f650910c54714e303ee0109c59903220781041ec5220dba04ad0510c50909520694031bc58e078e07aa0510c5050f8107710810c59e0afb00db0409c57f040e0852051ec5a81dc114583703c54b0a010efd0011c5780c2513c9040bc54f0624080a091ac52b6a9137575402c50319a009b2070ac55c0e910a910a0bc55d1bcd08042906c5f100270b120c13c5ad02af0296031dc5f400cc0159051fc56005fe0026071dc536c9cc33b34c01c5d8018e05b70314c5ab03cc02090a17c503138109e6010dc5c3044f0d06130dc522118d0894080dc5ab2a027e445d02c54609f9007d0613c5e101c6026c051cc58408d30399070ec59a0328078a041dc59c09860c3b130ac57b0efe00970b09c53407a20376041dc53a08c102c40218c519096f06e30118c596032307df011dc5521ccb08172606c56e05e9008f041bc56c09260eac050fc5590f620ec9040bc5c403cc02460913c5e2073b31522b04c561068e04b00317c5480be901b80410c58d0ba808620f0ac5673237428c2603c5ea010814ae060cc5857a916ed02f01c576006000da0000c5e9000e08b1021cc538077a0506091ac5d105a9097d0e09c51e2da212ba0d05c59d04020a3a0818c514099204310819c5181ce303ad0a08c58406bb03e40112c5c404860a3a100cc50f2823240a2806c57e07db02d20212c52f1027100d120dc53a0a1b0cb70412c589046805ab031ac52a2a3029a81105c58d055f08050c14c5ad03c202dd0115c5f7084db245ba01c5d3028707740810c53b624d59cb1a02c59c137c1a302905c5520673058d041ac5ab07ec01e7020cc50807f300de011fc5861ed20b8e1c04c567062108f20019c53c0a4e097f0613c5bc21e70ce70c02c50410b4053d0c0fc512ed0af5936c01c551069c03cc011bc5153a2536283504c5f902de0bb61803c55d0cf500f3000dc59b0beb02281709c5630fb1077b0d0ac58e006a00d00000c5d1029205c90214c5a81d23499a2103c5840448068b041dc5eb000e0a1e0918c568104a14c10609c5c604de02530c0ec5df06cf09053205c5860fd405b00908c5a25df50a45ba01c571054b07ae0319c5873c7e40256d02c5cb080a28b60c06c553186915990e07c53e0a270ce30112c5d2060723082307c5ce01e001d7011cc5da09d20b9b1904c52c09ed004a0717c52c11750bce040cc59e0305083f061ec5320aad04250b13c57c040a089e031cc543114910700d0bc53831b612313304c5df044916e90208c51b0ada018b0515c55f055a0558051fc5738c15eae31c01c5ef01a1085e0e0bc5e7002d0895041ac575007200220000c5c6025a07630617c5060d7007f20013c5650b9407600b0ec5ed01240cc10312c5cc193067e20e02c54507a503f10019c55411750d5d100ac5be04d40284080fc5f200b604500a10c51022fb00a40d07c551ae55aadf2001c59504cd02270916c535080b0a100a17c5a108d403510f0bc504085005d6011ec59706280c260c11c5ed001e00ac0000c59f07a407c3040dc5341d7813451a07c50f0c210b4b0913c56f004b008b0000c5ed04c00fae1404c5fc000f0e720811c5df04be093c1b07c56b0b8709d5030dc57f0cc70501190ac57609240e79080fc5e60052060a081cc5db017605f00017c56910b907b50809c5bb039405540912c57d101f1c0f1e08c57708c403740810c5020a2c08c80219c51b0d6109ee0111c5d7010108ac021fc506313d26122f05c5fe00dc01ce011bc57e088807d3020fc59f033e063a061fc5d017e40dcc1902c53c004500fc0000c520070c08d6011dc5ca1a3465cd1902c52b0b8007030e12c54a069703f6001ec50923b30ae40307c5f200ec01f5000ec5b308f8002f1709c5ad052c0f2c0f0ec5f500c002a9021dc53e07d1013d071bc5e505d0099d1305c55a218917eb0405c5fd011e70803f02c5d202a2043f0816c54506530543061ec5600cb4057c0a0dc5f900cf018c031ec5ec00a60374051ac55157d117d91302c5a006fe005d0a0fc55315bd088e0e08c5b80b8115591b06c5bd0d8d160c3005c5b1023a06e0011dc51907b40271041fc5cb028a04690618c57a1a8518582105c51a0a0a0b310916c5c60274055b061bc53409100aca0216c543177b103d1808c5c301a90281041fc56f90b54ae01f01c56c18521c681906c50a18bd069b0a0ac5d7018a04f70019c5443e204ab41903c5ea0194055f0813c5360a52089f0414c51b72e70c5b5202c56e056305d3011bc5fa015837204a03c5dd01190784041dc583048604f2001cc5d0039e07b4050dc52915e502940a0ac577065b07f80015c5e9048817312905c5a5043409e90115c5dd064924013205c57306e801c40216c544119909710c0bc528174514990b09c5480747089e0417c59a0b021c541309c5b005df0286080ec5fc00660a4b0c0fc5fe00ec01e0020cc5b40f242b641f05c58108330db9040fc5ca05c805670f0ac5c70b262beb0405c5cd014f0574041fc5da078a17661e05c5a000e300060000c59704c202aa0318c5dc015f0517071fc582056106cb0219c530224f1d6d1806c5300a7b06100b14c53528c60b6e1d05c564059b030f081bc56607a704970514c58d038a03bf021fc55b0d1713f1010cc5c104151211120dc588059105690715c5f5006b054f061cc5758aea15b34c01c58f0b0019ae080ac5ea008d03ec001fc57b003c003f0000c50d00a100280000c509099a0358061ac560008500260000c5dd017d05eb0018c5111a6311fc0009c5eb01d602b8050ec5510b4e0b250e0fc547088605900417c5053e39316f2404c51817b3071b160ac5de028308410d0ec58e07de02d80210c5a206d90289070fc505088b0494031dc511096406480718c5920c5712d30409c52d692e682e6802c54106a1032f061fc52a2ac40bee0305c50808d8013d061ec50908ed00e3011cc535085d071a0917c5fe003d0a930513c57b0ca20817150bc51ce30bf451ae01c5250b390af80013c5cc022809550717c58329473d593703c57906060c3f0914c5132ffd00aa1105c5720ccb0411150bc53d09070cd40214c5141a6211f90009c5722366267e2004c5b2099b0cc70708c57806d202490816c506f9b44b2bd401c56a0caa07b4060cc5fe009e20384203c597082911770b0cc534104a0f89090cc5bf40b847e91601c50af526d9867901c58b05a104420816c5ef01d904890d09c544082509fb0016c5900c5b12ca0509c58100ca00000000c532149a0abc060ac5cf30b44bf40b01c56f08af04bd0311c5bb0262064b0717c546105b0ed9030bc54a1e8e125f1a06c5231b3e18de0408c5ad030e0822081bc5214a5c368a2703c53e30522b981904c5b103b103a00415c5bb0b0429631a06c56e10d404fb0009c5ab07630e4c100bc5af086810ad0909c592004900b50000c594071f10370e0ec5c21e0a7a027e02c59d04300a8f0514c55207f900970418c5c2020c0b9d0416c5f801013fca0d04c5511da80ec50906c5700e7f0cf8000ac5492dcc0cb01304c5f200e801190c13c5ee013414bf060ac5df01160ac20216c5d10228093f0817c55d052d07e3001dc5a0061f104c0c0ec5580c340fea010dc510096306770519c5e8017206550717c5dd036d10d80409c579051009410719c5cd0174056c051bc51973e20e634e02c50e22b30a591707c575041e07d4011fc5c6033a0a1b0c12c59a6526d9679801c55c09270c4f0912c54f05ee0020071ec51911d803df020dc59e03ac03e9001bc593046d055d061ac5df056419c00a06c57f056e06a00416c57a21402f692504c57d06ba03e00113c50807580575041fc5f800e50288090cc51d07f7000c081ec5120eb104c10310c5400015000f0000c59a07f300a3060ec570049003d2011fc57f0986082c0f0ec54f0b300ca70510c530064f059c031fc53807440632071cc5fa002e10380f0dc5420e2910610c0dc58a04070887041dc5b0058f0779080fc5ca03c5048f080ec54a10da03fb000bc51b0aa104930515c55b070c0b540815c57047af28d71402c59b089d0837100cc596233244d60d03c5550c370e350e0ec5f203841e373204c59606050e860711c5550f4610dd030bc510079e0307081ec54b0cdd02230f0ec58b0b1a16a0090ac51c099d03390719c5cb11d00f2d4603c5c8023909f30014c5fc00cb022d0b12c5db0133093a0816c54b125311ea020ac5600e540fb4060bc52708ab03d3011ac5840bf7001e140bc5dd019904380817c50a12a207e6010dc5a506e002d3020fc5f600f001180f0fc57809a905e2010fc59c049a04e20117c5bc061a1412150bc5ed007706710616c5da01d901560718c5cc01c502cc011cc59f138019462505c59d0c2e1a081e08c5ac048b06250b13c571065c07460817c5ae000300a30000c51e10c70488080ec5de03780ce8020bc5023f811f502b04c5619e24dbaa5501c5ef01760ad9020dc51509480790041ac50d12e0020f120dc56e00fa008e0000c5f200e600f9001ec56006cf01770519c5cc023709620716c559065d06060919c515758c39ac2902c5d7010a090e081bc5500c310e88080ec5060aa104db0117c54e23af104b2405c5d8014207aa0318c5790ea40a351609c57843d3162a6a02c5445d3664913702c50019fb00f8000ac564056905de011ac5ba023608530718c5184d2748653303c5c407850f820f08c56b0592039b031dc540263528cc0a05c57a0636099e0416c5fa00110827081bc5d307461ee80306c5aa2a1774415f02c5bf08930d661308c5ae04df01e90112c5b50e0d30073105c599032208e3011ac516119d07df020dc5ce02c503e00113c52507380770051cc5c00c38271f2c05c5a55a35ca738c01c5cc022808580619c5d1007600f10000c593006700f50000c52935911b6c2404c521087205a3031ac5b003140b990514c57445d415ac2902c5ed012e0df0010fc50c18960a840c0ac5db010a0a270918c51313830afa000cc571067306f70017c5e403d505f00108c5f802473de40903c5771609296a1806c573057e05540718c560074108d00216c5140d89069f0512c50215e3026d0c0cc522097105630618c53f183c18810f08c59b06d50208100fc5380b1d0d810711c5fa003608d70118c50a0aed00350818c507088503fe001fc5b004020e370b11c5ab1c144e9a2103c5ba09ad0bc60807c5c60b1b2d6c1d05c5720629090e0a17c5af039c04e50116c59105ae03750615c57e057505e80019c5db022d0b9e0512c5956a718e946b01c5d5020b0b4f0815c506093f07a5031bc5fb005306fc001bc5ba06cc0423140bc5d60198045a0618c572072c0a340a14c5cf01920346061cc5d10096005f0000c5f50070052d081ac5480696031f081bc5e5002607d3011dc5b9033e0a7d0712c56a15301d301d07c58329f6038e2503c5b0038805c10314c5bd062d1551110ac59705bf03990513c572050a0808081cc556071a09500718c5bc03120d970611c5ba039405470914c58f049e03220819c59509720c0a160bc5a603780516081ac5f101dc02b3050dc5f0008706c00313c56c09210eda020fc5270ce1012c0c11c5250a72067e0615c5cb0a9515083105c5b4074312aa080ac5120b62074f0815c57d04090731061fc52e45423f2c4603c5422f2b35752204c5e9011b0ed10210c5610bab068f080ec561063e08810517c5a7035206d0011cc5b608f501730f09c5f000f70094031bc5ed019607610b0ec58703970333061fc56900c300670000c5e4021212620c0dc53a31851e113b04c5032a6c180f2806c5da01a6049f0513c5f4019a0cc20708c5fd00f700300000c51b08a70324081ac55206fa00070919c581199a14ac1005c54306850446061dc58a179f13552205c599048e05c90215c5cf01e30072041ec57445017f326602c5d0024b0a8f0611c5f003c00c352805c5f80037086b0519c593030b0871051cc5bd02240868051bc50b1e7e10860f08c5f500a30304091bc52f34f901742204c54908f300ab0316c53f134113c9050ac5bf0289055e0717c5f5002f1117130cc519e6fa0529d601c5660b2910fe000dc50013670b590c0dc50e0bc702f20015c57306090b460815c50af54cb335ca01c5490fab07ca040cc5d106fc00fd0007c5920c780f990b09c563061809290818c52518ed02591209c59504b902a50319c513097f04a6031ac5b60463088e0612c54a088d05d80115c58a07bd047a080fc508138209a3070dc53e09d502cd0215c5e0020616af070bc5530ab104680811c5b6047809b7040fc569192e221c2506c53e10430f820a0cc5f701b80ec50b05c527137c0bbd060bc5ed010f140b140cc5e4012d0a940515c55313021c5e1109c5a1032a06c2011fc5100ec703610910c5d0055a141c1c08c5ee01890bba060ac5840a7c0a0f140cc55d05dc0164051ec57f2a2f45972203c57986f10e26d901c55e055d059b031dc5e301d3025d0912c5033f1c38b01304c5ca045c0de8010cc55409b704130d12c51ae521def40b01c5440c7e08270e0fc5fe00a403c70219c53510d8039e080cc5ed125ba4b04f01c59804030c950515c5240da0057a0810c507082907d3011ec59814a512f90105c50909fa0053061bc5b20f0332252b05c53927ec03d10905c5744511773b6202c56007170b820614c59a093712630e0bc52b074e0610081cc52ed131ce02fd01c53707050902091bc5f7010c28092906c5201b8e0eed0208c5d8271be41be401c5f400a806730a0dc5c903600a110f0fc5da032c15810c0ac56f04ef0075041ec5f0009d0351051fc5fe00d602ad0414c5d0012608af021bc52b17850dcc0509c5c7034a0a160d11c5ac057b096e0a0ec5412f69253c3004c51f0796033c061dc52a063106fa001fc50c0f8407400b10c58a06d702310b12c555086e07550814c56a06f800dd0117c5300762062d081ac5c503d6025e0a0fc5830f4717c10708c5dd02400f840a0cc5460e550d20110dc51e205118311d07c59b0599055f0814c5aa04d702b10412c5ec00b1030f0a18c51a395b29bf1004c556101a16df030ac5e201d3013d061cc5ac051c0e1f0e10c59e0921166e0e0ac5cd197a42654d02c5de00f300d70000c59f0d431aca0707c51100a300360000c56e0a630b08110ec5ea0a7943177402c589003b003f0000c58308a40605100fc5b2064a0f7c0a0cc5e8051939522b04c5a104f800980514c548b70ef1ae5101c598041d09db0118c55109300afd0013c5c603dc02c4030fc5c202680529071ec5e002af05720a0ec5010aab038b0419c5ca0d9b19b21304c50b51e608d10f03c5061bb108f10109c52207550551051ec56c0b5f0c5b0c0dc5c303d702af0412c51b0780048a031ec51421970e411b07c50f0a5806350818c5031cbf070a1b09c51b0ad901ba0316c5a107da02dd020dc53109a504c60215c5650695041c0917c5c707930d571508c53d13b807690f0ac541157c0e581209c5d20f9e20ce1003c5b8040b0ea40511c5040c000c420914c56904040868041fc5ed00040819071ec55e112318860d09c5c6054312be060ac5060dd402f70012c5fa00800c6b0e0ac5023fd809213704c585068a05990514c5fb006f0a230f0ec5ba03280a620714c51d0d8207570911c55e05db0199031dc5610dcd045a0d0cc5c303270c6c0812c59b109f10af0d06c5f50ac83720df01c5af04000cef0014c5111a41157b0e09c52c1e71142d1e07c545063b0657051ec55005430664051ec5b0026a0488031fc51e387223243604c5f400c702d8011ac5ee0012078a031ec59f04260acf0214c57c05e001b70318c5c002760516081bc57b04630516071fc51911ea01e3020dc51c0706082f061f61010060006000c16102006000f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : [ + "" + ], + "gasLimit" : [ + "0x3b9aca00" + ], + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "to" : "0xbe7c43a580000000000000000000000000000001", + "value" : [ + "0x00" + ] + } + } +} \ No newline at end of file diff --git a/test/evmmax-precompiles/evmmax-submodx-bench-single.json b/test/evmmax-precompiles/evmmax-submodx-bench-single.json new file mode 100644 index 0000000000..3941584526 --- /dev/null +++ b/test/evmmax-precompiles/evmmax-submodx-bench-single.json @@ -0,0 +1,73 @@ +{ + "submodx-bench-single" : { + "_info" : { + "comment" : "", + "filling-rpc-server" : "evm version 1.10.25-stable-69568c55", + "filling-tool-version" : "retesteth-0.2.2-testinfo+commit.766b4629.Linux.g++", + "generatedTestHash" : "682d204267cf3a3909bf22c063f2c9cde06a917d56f3666bad7ff4c724b3676b", + "labels" : { + "0" : "empty" + }, + "lllcversion" : "Error getting LLLC Version", + "solidity" : "Error getting solc Version", + "source" : "tmp/micro/jump_aroundFiller.yml", + "sourceHash" : "cadfd8a7ee22cbefac3a420cc4c762ca1a3a38ae3346407bd31694acff16c78e" + }, + "env" : { + "currentBaseFee" : "0x01", + "currentCoinbase" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "0x01", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x01", + "currentRandom" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "currentTimestamp" : "0x61a8d289", + "previousHash" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "post" : { + "Experimental" : [ + { + "hash" : "0x51a20eb8dbdec5af48eeecca9e38acb6006fe28733f8649500092464fe6a6364", + "indexes" : { + "data" : 0, + "gas" : 0, + "value" : 0 + }, + "logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "txbytes" : "0xf8618001843b9aca0094be7c43a58000000000000000000000000000000180801ca0999ee855b1d5325fe79efbc40ad560f9ebabbbb97e72e1a4e9cf7e4b8ba34765a06392df208ed06b901f2997995c138bfa06ae8b1a26c15e8aff52cad68f913e85" + } + ] + }, + "pre" : { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x3b9aca00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "0xbe7c43a580000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "ef00010100040200015e3704000000008000037f00000000000000000000000000000000000000000000000000000000000000306000537f0000000000000000000000000000000000000000000000000000000000003001600153610100600e6000c060b26000536045600153600160006000c2c3010100000101fec4000070006c0001c4e1006a00c30001c4d60090006e0001c47c00d7007f0001c49d00a900ec0001c422004700740001c469002800c00001c48f008c00a90001c43900ae00f20001c4b6001100e10001c4fd009c00ca0001c43d00e100010001c4fc005200640001c43600bf00fc0001c48b009f00850001c41e0026005e0001c4d200a700c10001c46000f300770001c49a001100230001c480003f00fe0001c48900dc00ef0001c4c5004e00950001c435009700bf0001c46500d900e50001c4ab0084000d0001c4c600b6006e0001c418003a006a0001c444006d00530001c4b3002a00400001c401007b00030001c46800f3005e0001c4e30019007f0001c4430017000d0001c49f005b00300001c40200a700a90001c46f00a600740001c45a007000720001c4ac0086005d0001c427004000d10001c4e5004d00780001c407009500ba0001c46500de00f80001c417002000780001c46e003500740001c4aa00c500f20001c42800ab002f0001c42700f600e70001c467007000a90001c4e0007200fb0001c466005c008f0001c483009f00580001c4ab00dd00220001c4d300b000f90001c49700e200260001c42200c400390001c41700b600380001c49b004800f70001c4de00c1005a0001c424001a00c50001c4750074000e0001c4c00028005f0001c42200d300780001c44a00a100190001c4b8003800420001c4b400f9000a0001c49a007500260001c4b20034007e0001c40e004900f20001c4fe000f00970001c4b0003a00f40001c4ce00aa00fe0001c42c00fe00440001c4ed003100470001c4f300c700440001c40000f200210001c427001100730001c4f9006a00b70001c43b00e3008c0001c4ef00d000d10001c4dc005d00810001c4550094007a0001c4d80039003a0001c404003300190001c47500cb00d80001c4f1007800100001c441009800270001c48a004100be0001c46f003e00f10001c4b3000a00ca0001c44700de00520001c49c003c00fa0001c44d003e00740001c471000b00ec0001c47400f2004a0001c4db002b00a40001c4f6005300710001c4fe008000e80001c460001e007c0001c474007d00360001c44b00c500eb0001c4920031003f0001c404001f00740001c46e00e600f30001c487006c00960001c472004800460001c48f000d00d90001c46000b300b70001c45e004d00530001c46600b700dc0001c4ce001e00d00001c43800b300940001c40c00f900b50001c4f3007a003b0001c42a00d100df0001c40d00ce00830001c47f003600930001c4dc008f00df0001c4ba007d00fc0001c4aa00be00c50001c419001e00470001c42b009d00230001c48d009200740001c41e00ea00e70001c48c000f00af0001c44300e000890001c48400ab003e0001c4a7001f00bb0001c4c20038002c0001c40a00e400fe0001c459009e00350001c41b00f600dc0001c41e00f200ec0001c4fe004200510001c4340002007a0001c410001f000c0001c4d8004600c20001c46f008c002c0001c474009e00bb0001c46c006500000001c4ec002900000001c44a003600030001c4df0072004b0001c4e1002800a20001c42f00c200440001c45300df00340001c4ad005a000f0001c41e00af00550001c4e600f2004f0001c4f8008b00520001c412008c008c0001c475000b00ed0001c48700a200e30001c42f00e1004f0001c43500ec00a00001c453001e00040001c407009900100001c41600a4003b0001c49a004f00fb0001c45500d100f80001c4be003700310001c4e7006300c50001c4a7004300640001c4f200fe009a0001c4d7004f00730001c4dd00cc00990001c4b2002600170001c428001500040001c476007800d70001c46c002800c40001c447000900de0001c42800c800120001c4d400f700f10001c446004500160001c43a00e1003e0001c413006a00060001c4a500eb00370001c46e0098008f0001c4dd00da00440001c4fe002000980001c4de00ea001a0001c4ce00a0007b0001c42900e600540001c4e9003f003c0001c478004100e10001c42d008c00f40001c45b007000ba0001c461004500420001c46500d700060001c4cb00ac00020001c41d00f000cf0001c4dc00ab00c30001c4f3001e00830001c466009f00060001c457006a00890001c43f001e005c0001c4a100f700e30001c407004100410001c453000700780001c4e6003400900001c4cb00c5002a0001c44b0042007e0001c417007700110001c4b300c800f20001c4fe005500540001c44f009300460001c4bd00ba007d0001c477000a00d60001c41d00e000f20001c4f700e8006c0001c4e000ce006a0001c420006800bd0001c466000700f70001c427002500c80001c4380008008e0001c49a008900a30001c438003800320001c4c000d500650001c45c00a000ae0001c4a300d000b40001c484004700c70001c43700f600a00001c4cb005200fa0001c4f0006f00780001c462005000740001c449009600670001c44b008d00770001c47e00bc003c0001c46a00e000d60001c45f00c800840001c4bb00d800500001c48d004e00ad0001c49a001400b60001c480005500540001c47800bd00010001c4140057001a0001c4a4005a005b0001c402008100610001c4ac00b400670001c46a008e00520001c40600e000bf0001c49d006e00570001c48f006700f60001c4da00f800050001c4ca003a00bc0001c4dc00bf008d0001c41d003700980001c46e005100160001c41000ca00450001c4c800cb00eb0001c44c004e00030001c4b6009500750001c46300c900ab0001c4c9005600340001c4cf004700e90001c472002000b00001c4b1000b00c80001c4a8004b00520001c49800f900fd0001c48200fa00080001c4930055007f0001c43b00d6007b0001c46700a200100001c44c00e100220001c4f9003400cb0001c459009400240001c43300c600d00001c4f800c500de0001c4ae00b6008b0001c41e007900e10001c4c600ae00b20001c48a004800600001c4140003002c0001c42600cc00000001c40f00e700db0001c486005a00a30001c4aa007600500001c460000900690001c486007b00080001c400005400c20001c417006600770001c497001e00150001c4bd00f2002c0001c478005b006d0001c4c200fe00f30001c42200f300000001c4d9004300de0001c4a1001000530001c4d000cb00eb0001c4a600e700610001c40a001d001a0001c41a006d007f0001c40d006a00de0001c41b000d00a30001c4f4006c00790001c4cf00ab00e40001c4bf007d00070001c45600f2000e0001c417002f00900001c41500cd00520001c45700b200460001c493009900f70001c4ce007000020001c4c1001500aa0001c4c2002000790001c40300d600e40001c43900c800380001c47300a1007e0001c4b80094006d0001c42300d200440001c43e00c100100001c43e00f000a20001c43c002e00970001c441009d000b0001c448005d00d10001c4c6003400e90001c4dd00ac00cb0001c48300fa00270001c4a0000000850001c48c00ad00640001c4b0002900f30001c45a00fa00e00001c48500cd00740001c4060084006e0001c4f800b9005a0001c4ad007b000c0001c47900ee00a30001c424008b00730001c4d600b0001a0001c4e7008500a70001c47200f900270001c459002400530001c44b006e00dc0001c4ab00f800fc0001c49a005e00510001c4b70047002d0001c4e400a300660001c4a3004d00130001c42300a800080001c4ca00cb00480001c44d001b000c0001c41a009e003a0001c4fb003100b20001c427003b00550001c40e001a000b0001c48100f100a40001c417009a007c0001c41b002c00a70001c4af00b500490001c433007100300001c4fa00fc00de0001c41f008800520001c40d00f200e40001c41600bf00140001c40f009900c90001c4e100bd001a0001c410009d006e0001c447004600ca0001c47700a4000f0001c4be004a00250001c4cd009d00de0001c4d5000e00f90001c480004200d90001c46000a800540001c4d800cc007c0001c4c600d700eb0001c44d005000220001c448009f00780001c4c9006f00c80001c493008d00e70001c44a0065003f0001c431001200060001c42a0054008f0001c46600b200420001c49a001500960001c42a001b00400001c412000400ac0001c44f00e200430001c4bc002f00f60001c4ba00ae00a00001c40a0097005d0001c48d00a000320001c477006f00900001c4d3003f00960001c449000300200001c4cc0084004d0001c499002b00170001c45a006700cb0001c4790002006b0001c44b0008009e0001c49d00f000450001c469004600670001c4c9007000df0001c4bc00fb00980001c43900d700ab0001c4cb004d00ef0001c4b7009800490001c4440079006b0001c47300f600b50001c407009900ec0001c427004e00540001c4a200e900330001c4d7003700ed0001c44f008e00430001c4e2004600130001c4b800f200340001c4b500e600140001c441001300cb0001c4310084005b0001c4db006f00140001c415005700c30001c4cd00dd00be0001c45f003400740001c41000a5006d0001c48700ea000f0001c4f7005200680001c43200c900230001c40700a700f80001c4d5001400780001c4c600fd004e0001c4bb009d00550001c4df00d000b90001c4c4000b00b40001c441005e00de0001c42c003700460001c455001e004c0001c4d4007c00950001c42e00e100d20001c4b1007c00810001c40f00dd00ce0001c4810000008c0001c4ec00d600e00001c48f000300020001c48a00d5004e0001c422004b00590001c47000fc00250001c41f00c600d70001c421004e00900001c46b00dd00430001c482001e00250001c471004400440001c4f5000500090001c4e6008700ed0001c45b008e00350001c423009400850001c4f00027006d0001c47300a800380001c4a1001e00790001c45e00d4000d0001c40700f500690001c4a9007a00e10001c454007500b70001c4aa001300c50001c4d4001d00aa0001c4c30060009b0001c49a005600b00001c4e90032007d0001c4a000c700d80001c47a00cf00c20001c431004c00980001c45000a700fa0001c406001c001c0001c493005f005e0001c434001700d40001c406007b00a40001c49000d200a80001c4e800c500dc0001c46c000000790001c48b0074008d0001c496006f00100001c47b007f00600001c471001600740001c4f100ed008e0001c4e900f100a90001c4ec0060008f0001c4160062008f0001c48a00b2006c0001c4cb006e00680001c448009800340001c40b007400000001c46f0052003d0001c4bd00b700b20001c429003800300001c42c007c001b0001c4a6006b00d00001c4a100dc008e0001c4f700f8003b0001c495001800420001c4e4002900630001c40900db00060001c46400c300980001c4c9002100960001c4d100aa00da0001c451008a00e90001c46f009b00220001c4de000000d50001c413009600bc0001c4a10038000b0001c41600c500300001c46900fa003f0001c49f002c00980001c44600de004d0001c49600a300ba0001c4cc009b00130001c4e4003d00a00001c46900a200b00001c4df000e00420001c467001c007c0001c4b7009d00590001c466004b00f70001c42e009a00940001c4c000cd00070001c456003100ca0001c42200b0002e0001c49c0013008e0001c425001a00ba0001c4ac00c4005d0001c46200af001a0001c4cc002000ca0001c42c006100e90001c4820021000b0001c40e007500870001c4d400dc00360001c4bd002b00890001c40800d100850001c47c009500bb0001c4db004100e70001c481008100a90001c4e300b200ab0001c4630030000e0001c40100c400220001c406003c00220001c4b60068002d0001c48200a400700001c4bd00bd00ec0001c446004500ea0001c4170012005b0001c42e004e00860001c4f3001e00a90001c40e002f00910001c4e800b900f10001c4fa00cf00200001c404008f00130001c43a0086002a0001c42e007a003c0001c403005900220001c4f8009400b50001c42f005800400001c4790087001b0001c46b003200850001c4f10066001a0001c45e0062007a0001c47c00bd00dc0001c48500d200830001c45a00ea00ee0001c456008b00b50001c47200d800d70001c47500be00010001c4cc007000080001c4bd005c00290001c4bd008400b60001c426009900620001c482006a00130001c4e3007c00320001c45a004400d20001c486007300f30001c4d90047003b0001c44a0019004a0001c484005e00be0001c4b4003500060001c43d0058001e0001c444000200cd0001c42c003d00d90001c4b9000800980001c47e009a00db0001c4b9007400500001c4a700ec005f0001c495002100590001c430003c007f0001c48c006a004c0001c497003e001a0001c404009b008c0001c431008d002a0001c4c100d700820001c4430058009b0001c4b800c600f60001c40100af00860001c4b500c900c10001c4bb004e00270001c4ef002800a30001c4e9009a000b0001c461008000300001c41700a300190001c43200ae00910001c4f3005a00100001c4b7006b00ce0001c43e00c0001d0001c46d007300820001c43c00c7004a0001c47e005900780001c433005d00b80001c41e008a00120001c47100fb002f0001c4de00b200680001c419006400800001c4ab00bd00830001c4b2001500340001c42100ad00e20001c435006900c00001c47e00f300310001c4a200fd00ef0001c475007600b90001c4d3001600370001c467000a00590001c4e4004900c20001c4ee00a100fd0001c45600ea00a30001c4e300dd008c0001c43000a4005d0001c4b200b200a30001c47900bc00fc0001c44900ea008d0001c4d500a4006d0001c4ef00f7003b0001c42f000e00570001c4f000af00ac0001c496003600940001c4a600bc00ac0001c4660097003a0001c4c9004800c90001c494009b00290001c44e001600aa0001c4b600ca00840001c430008a00220001c4b2006400de0001c494001e00550001c43100b800550001c42100dc003a0001c4c1004000910001c4de002e00360001c40100ee00d20001c4570052002e0001c4de0067006f0001c4f100b3001f0001c43700e8000b0001c49800f9003c0001c4f500f300480001c40300a600900001c448002900f40001c419004f008b0001c4b9009600e20001c45d00d000e00001c456009700470001c47e00ed00a00001c49d00f300da0001c42300af00bd0001c4ce00cb00710001c45b001e00ef0001c474006800970001c4960017009d0001c42d005500d30001c4bf00e700860001c4c7009c007f0001c45900d700b40001c49500cd00060001c4a9000f00a00001c4a400d500650001c447003400f90001c424000100380001c44d00b6007c0001c41400a900af0001c43c00dc00520001c452004c008f0001c4ba007c00090001c4810022002f0001c491008800930001c41d004c002e0001c4bf000c00890001c46a004700c90001c4cf00f300160001c45400a9000b0001c41a000900f80001c4bb00eb00cb0001c44d00f500250001c455000200750001c42000fc00ef0001c4fb006e00020001c44c00e500830001c49900b3001d0001c4bf00fe00a00001c48800ca00b50001c42c009500500001c42200d400c90001c47800e200d20001c4e8002800910001c42f001e00310001c4d8001e00ac0001c490003900a10001c400000100040001c46b0034008f0001c4bd009e00e50001c41300cc00080001c4ed000100060001c4c3003b00c80001c42500d1004e0001c44d002d002c0001c4d800d6008a0001c46800bb004e0001c492009d00a00001c43100ef00640001c424002a00f30001c40400bb00440001c48700dd00ac0001c48d009800880001c4be004e002d0001c47c008300570001c4d2003800980001c4dd0017004b0001c43c004c00600001c4f500d900f40001c448001900510001c4b7004900c10001c404006e00eb0001c43c000000fd0001c41f008f008e0001c4b5006f007e0001c464006800280001c471004b000e0001c47f003800140001c4f500c400f50001c433001100480001c4dc004f005c0001c42500a400920001c40b008900c10001c4a6004e009b0001c4f0007b00df0001c467009100ae0001c4c2005000840001c48e00cf00fd0001c439008600900001c429003d00800001c4b20068006f0001c404000100410001c45b00d4007b0001c49d00a2009b0001c41b002900c70001c4fb005000dc0001c4ac001c00ab0001c4c300cb00470001c428008200330001c458006b00ea0001c49c009e00c20001c44800d0006d0001c4df00b500810001c4df000c00ac0001c4a200d900eb0001c42400c600f00001c4e6005500570001c481009300650001c445002500970001c49f0060004c0001c40d00a300070001c41e00fe00620001c4d0001d00ac0001c407008f00250001c422006100ab0001c4b100f700d70001c494002500a00001c47e000c00120001c4c8004d004f0001c40b0078004e0001c46600a500920001c4ac002700630001c42f00d700900001c437007300540001c46500f300d00001c4fc0085008e0001c4ee0023007c0001c475001100890001c4cb008400710001c49c001600bd0001c4e900a700c70001c44d00b500400001c46500c4007c0001c431004f00760001c446009800a60001c49c00ee00740001c43b00c600580001c4c6001000010001c4e600bf00350001c4d3009300620001c482003800880001c40000fa00080001c4ae00fc00e90001c424000700e40001c4d5004100230001c464002b00270001c495006b00f20001c4f8007d00b80001c43d00cf00bb0001c4a5006e00130001c40600a700690001c457002500f90001c443000a00df0001c4a8001900670001c47100f700f90001c49d004b00c20001c4be006b00ac0001c42100cb001a0001c456002a004c0001c415006c004e0001c4c300ce00430001c4b80085004f0001c4a7009000ba0001c457002500e50001c475008b007e0001c4c70039008b0001c4c7004d008d0001c4b1000600a60001c4d900e200d50001c46b0052000d0001c41800ec00d90001c43100d2006b0001c46500e200700001c47300a400730001c4e400e000a80001c45e00cf000b0001c400003f00e20001c4290015009f0001c4f1006b00dd0001c4d8003800b60001c45f00ab00ac0001c40200f000290001c4b400c100330001c472004400b70001c47c007000000001c44f0061000f0001c408006f00910001c4c800fd00bd0001c480004a00150001c4e500cb00f90001c4aa00a200360001c4bd004c00220001c40a005900db0001c4d9003d00780001c40400ee007b0001c42600e900440001c464004b00af0001c43900da000a0001c4aa0038002a0001c48900bf00680001c46d00fc002c0001c497008600290001c48a008b00070001c4ab00d200790001c491006200c20001c462004900770001c4dd0089009b0001c45f004100b10001c42900da00130001c44b000900d70001c47400ca00820001c432002300510001c40100ee000e0001c41000f700490001c4570000004a0001c486003d00470001c4b1004c004f0001c47400fe000e0001c4ea000300110001c4ae006a00d10001c4ec005b00650001c480003900970001c45e00df00790001c4c800cb00ea0001c4a800d200050001c4b8002600890001c4e5000a00640001c40b001500b00001c45900f000a60001c4ec00c500dc0001c4840027007d0001c42c004100c90001c4ae00f800f40001c4ae003600c80001c43600e900090001c4500065000b0001c4f3007a00750001c49c0018003a0001c49300cf00560001c458002700000001c49b00ba00e10001c4e500b100400001c4ef00b500890001c48700de00190001c4cb003b00110001c4fe00c400270001c4f00078001e0001c434002f00980001c40000a100ab0001c44400e0005f0001c4aa00e800d80001c4d00050000e0001c43f00d200d00001c456005400dc0001c49d008100430001c440006f009a0001c40200ae00bf0001c4e3005d00ae0001c4b70026003f0001c4da005600050001c4ee002400cb0001c4d900de003a0001c40300e100570001c415006b00040001c4a7002c00510001c4d00089004d0001c47200fd000e0001c45f000a00dd0001c4a600e800040001c4c7008a00a30001c45f002c005a0001c48d00e900330001c481000d00f60001c48c008100db0001c4bd002900ee0001c4ae005400bf0001c45e00ac00a30001c4f700f0002b0001c452009600510001c42100b600fa0001c45a00d200de0001c45f00c500800001c42700af006a0001c43f00df00c70001c47600d4007d0001c40f002f00240001c48a00d9004c0001c41500e700de0001c4b900cb00cf0001c48f004e00520001c43c002000300001c40500a600e20001c4e900fe00e90001c47600a100e50001c48a0009004e0001c4e5004900860001c40500d400f70001c48d003e00c60001c446001800e20001c474005c00920001c4e500d000c30001c49e001c00440001c41c00bf009e0001c44400b200720001c422003900920001c44b003900fe0001c43d00f8007e0001c4ed001300620001c468003f00c10001c4f100d600a40001c4bf005b00cc0001c406009a00cd0001c4a6004200610001c43500cf00890001c41000d4000c0001c471001a00000001c47300ce00e30001c41c008400060001c49400ab00fa0001c433005900050001c47a007300110001c483006b00ef0001c409002c00f10001c4e400e000590001c4d10034007f0001c4f8007200e30001c469004100d50001c4c0002e00c90001c41600c500cf0001c4fd00d000430001c4e30048008f0001c4fe006900040001c425009100230001c401006000ab0001c4590091002e0001c4c70020005b0001c44b009100a40001c4ab003a00d70001c495000400be0001c4dd00c500cb0001c407005500300001c448003200200001c4f20016001e0001c4ba00f400f20001c40f00ec00460001c4d100ef003b0001c477005f00140001c41200dd00d80001c423001500b50001c4b90096008f0001c46c001000be0001c46800a0006d0001c4a10032000f0001c425009c00410001c46400a4007b0001c4fe005400bb0001c4af00c100c40001c4ee005f00a40001c474009d00ae0001c4540046002c0001c49100dd002b0001c4a0008b00930001c4f0000800400001c4a8006400f10001c480002100880001c4c00034005f0001c44e00be00f80001c4a20056003c0001c43000a800ad0001c4a4002300380001c46100ce00680001c42700ba00820001c4dd005500040001c415000d00940001c44f006800970001c43a003b00500001c45700d300fc0001c4b3003d00fc0001c47e00a700970001c42d00b5006f0001c4e90060007f0001c48c00b8009a0001c43b008400b70001c455009900bd0001c48c00f800aa0001c42000f500bd0001c4af00a600ac0001c439002f00ca0001c474009e00ea0001c4fd00d2002d0001c404007900bf0001c48000fb00d20001c4720044003a0001c46e009500b00001c4dd00b8009a0001c4a0003f00a90001c4c500e400950001c4af00af004b0001c4e8007500440001c49100dc00660001c42b00a700bd0001c43300b800c60001c45e006200370001c49900bd001e0001c49c0051008f0001c4ce00db00c40001c46700dd003e0001c435005b00b90001c497004a003e0001c4c6000f009a0001c49600ec00380001c4cd006300b00001c49f006c00920001c45900f1008b0001c482003200850001c46b00bd00f80001c42900ce00d30001c4ca00f700160001c41300ea005e0001c4a500b100fc0001c46600f400ea0001c41f004700390001c40f002f00d20001c4e500c400100001c414003500850001c46d006c00420001c488003900460001c43c000800620001c466000900770001c4cc00e4005f0001c4e5004800540001c43400b400290001c46a00e6009d0001c41700d800710001c4be00bc00550001c494005c009a0001c4b5003e00250001c40600ac00600001c438004e00210001c476008c008d0001c48000ea00530001c4da004600040001c49a007400120001c4e900d300170001c484000d002c0001c43e00d600100001c459005100820001c4100058007a0001c4f200da008c0001c401002000100001c42300ab00320001c409008200070001c4d0007c00790001c484004300840001c41d005300580001c4c1000100f10001c43400f100360001c43400b900060001c43200bd00c80001c4e2001000390001c44b00e100830001c4fe001200700001c44800c100f60001c4f2000a00fc0001c410001300e80001c4c40063006a0001c42b006e005a0001c40500c200a80001c4c9008c00720001c474005200760001c4a600fb008c0001c44b0044008e0001c41900d500080001c4da001a00cd0001c44c00f100b20001c41600d600360001c412001400150001c461008900f90001c4d90077008b0001c4410016004d0001c44d003c00550001c49800a8008b0001c430003c009a0001c44400df00920001c464008600a40001c421004400e70001c452001600c70001c4a10029002b0001c41a005d00bc0001c49a0025005e0001c4a200bc00ea0001c4de00f500450001c49a007300810001c49f005d00030001c47700f200320001c425001400520001c46500b800400001c4a600ec00f50001c48c006600980001c4b600ae00780001c40d00cd00020001c474003e00d30001c44700f0004c0001c4c5005500bb0001c4a8004b00410001c4f8003600f80001c4b000f300100001c43600bc00090001c426006900160001c42a005400c20001c454006d00410001c409006f00830001c44d0007001b0001c47f002a008d0001c4b700f500550001c4f8009e00d70001c43e003e00050001c4e6007d00fd0001c4fe00cb00040001c4fc000700290001c449005200f10001c4b100fa00590001c49a005500d10001c4b8007f003a0001c4c700d200bb0001c47500f900c90001c4240035008e0001c4d0007c00580001c401007400c70001c492008c00d80001c4e6002c00d20001c49500ad00dd0001c4b1009700490001c48b0021000d0001c4c8007f00980001c4cb004100c50001c4730040007b0001c4d6000e000f0001c40d00c000b30001c45c0028001a0001c40800d600330001c42200ba00120001c477004500a20001c44f003c00b30001c4c200ea00f80001c4fc002200a90001c47800a200470001c4680058009d0001c4c1004200480001c44b002100930001c4b600d800f60001c4fa00a900af0001c4f4000d00fb0001c4a2009500940001c40b000900a20001c483004a006b0001c4f700d2005d0001c4e0006500fb0001c43100bd00760001c41e002b00460001c466001a00300001c4780049005d0001c449005100b10001c4a000f100600001c446003b000f0001c497004600170001c4fc00e0006b0001c4de006500c50001c4d1008e00460001c455002f000d0001c42400ee00aa0001c49d005100d90001c4d9001300290001c47d004800770001c4b3001c00e60001c44e000000460001c4e8000e00c30001c4b4007c001b0001c44800b100520001c4bf00a700690001c405003300ba0001c47800d800030001c4e5005900270001c491001d003a0001c4a400f600280001c43b004900c10001c4db00ed00d20001c49100e900180001c45b001c00230001c4e8006000ec0001c471007700200001c48e008e001f0001c4ef002e00aa0001c4d7002100890001c45c000e007d0001c4c700af005d0001c4d1002d00e30001c4a900a300f20001c4b600d1005f0001c4f500cf00c30001c4d9000800bb0001c49d00b100200001c457008200920001c4cb00d900590001c477009900eb0001c4b3007d00f20001c43600a400770001c401002400270001c409006f00390001c479008700540001c41a00bc00f90001c4a5008900e90001c495002000710001c476003600a90001c4ce006200220001c4a800c7004d0001c4aa005200b00001c49d001b001d0001c4ee003100a10001c4f10089004c0001c4f60063003c0001c4fa000400510001c4f6004800740001c44100f300f30001c47000dc00f50001c442003400d20001c4ae001c00250001c4a3009d005d0001c45e003e00ce0001c45000f100390001c41e003900bf0001c48700ab00820001c400004c00640001c455004500340001c4da00d100bf0001c47200fe00c90001c416009600780001c4c0003200490001c4a2006200b30001c496003500270001c406006800cc0001c4f300b100070001c4c5009200c50001c4d2007900e20001c4100046005f0001c4be002000260001c44200bf00810001c4ab0094003c0001c42c006100790001c4f0000a006f0001c415007300bc0001c46b005e001c0001c46b0014009b0001c4c500c1000d0001c41d003e00960001c4f1000a009d0001c43300bf00e70001c46e000a007d0001c443008100360001c49600da00640001c44f0027006a0001c4f8006f008a0001c4b5008e00f90001c4a300e3005b0001c4ce00be00680001c4e7002900da0001c492005e005f0001c465000e007a0001c46c0055006a0001c4510009004b0001c4aa003700580001c44d006600410001c474006f00540001c44a00fb00280001c48200f500190001c40000cb00340001c4f4002100f50001c47800b5001d0001c44100c600b90001c4c300a2001c0001c4dd004d00e70001c4a4008f00150001c4c1004a00910001c4990033003a0001c45600ef00510001c4e7001500800001c400008400ae0001c4a300d7008b0001c4d8008100150001c44c005400d10001c4ce001800470001c472003100ed0001c4dd00e100590001c484002f00930001c432002c00310001c495000400560001c42c00c200a40001c48b009400040001c43700d9007c0001c41b001c003e0001c4ba003700150001c452007a00750001c4ba008c00c30001c47d0041007f0001c43200bd00670001c4c300f1001c0001c4e6002500210001c4370054007d0001c4ac00d100950001c443006900970001c4aa003100b70001c4d400b2002b0001c42c004100f50001c41a002400260001c482009e00e10001c4aa009f00250001c4ef00a800c00001c407007100e50001c4aa00c9008e0001c410005000c60001c4a400d400d50001c45100e3001a0001c41500e6007c0001c488001500390001c45b006700d10001c4d400a200550001c4d1006500310001c4b10066008e0001c41c005f00150001c47300e300520001c4cd003e00260001c4ac00e2005e0001c41d002400070001c490000e00f40001c4ae001500420001c412000b002a0001c42500a000900001c4220039009e0001c47e00bf00ef0001c43e0097009b0001c4f50056009e0001c46d00f400940001c437006600cf0001c43700fa00fd0001c42800b600e30001c40d002800820001c4bf009700370001c4fd000c00080001c4a100df00b90001c45b004a00540001c4ac00ca009c0001c42200e9007f0001c417000200490001c476009a001e0001c43f00c400a80001c40f00fb003f0001c421007100100001c4cd00a700400001c4c8002a00b90001c44b00d400450001c423008300f10001c45100aa00a50001c422007c00a70001c40c00ce00040001c47200f400080001c4d1004e00c20001c44c00b700f70001c42d002f005e0001c4e90025002a0001c47b00cf006e0001c4e600b200b50001c4dd00fd000a0001c45300c400970001c44100d7005b0001c4a5009800ad0001c48c000000e70001c4cb003100a20001c4ce001c00fa0001c4a6000b00d70001c4be00e500570001c45f007600e30001c495009a00a00001c4d0009900130001c43a00c200c00001c4240059009c0001c40e006600000001c4a5001d003d0001c4b1002200e70001c423008e00b10001c4af0094000c0001c41d005a003d0001c4fb00bc00eb0001c45100c800d60001c4de001a00250001c497003e00ce0001c430006100a30001c4120003004f0001c40800df00d40001c421001900fc0001c442005500be0001c4e200ee00af0001c4c2005a00090001c472002b00c60001c45a006a00170001c4c0004600ab0001c40b000000230001c4d9007b00530001c452009600810001c4a300c300d70001c4e700a900090001c46b000100f70001c4e1008300a70001c4f900f200e10001c46600ec00270001c45f00ac00be0001c427007100ad0001c464001000fb0001c44c0023000c0001c4b7003800cf0001c42300ee00bb0001c4b6004e00e60001c4c8002600a00001c4eb0069005e0001c46100df001c0001c41100fc00e30001c4820080006e0001c450006700850001c4a400e100750001c49500b800ce0001c422000900ee0001c4e400ae00480001c4ca009500540001c41b004800e80001c4b3004500a10001c459003400cf0001c448002c00fb0001c4d600e4000e0001c456007f00db0001c41d00a900cc0001c40b004500f80001c45d005f00c60001c460007c00430001c4bc00af00220001c42100c400b70001c438006700210001c4b300bd001c0001c4b8009000420001c490007600510001c4bc006000640001c47f00aa00dd0001c4de00b5008d0001c42400a600670001c43c007700910001c4d20090006b0001c491006e00690001c4c400f700240001c4ca005600260001c495004700860001c43c00fe00870001c4fc009400de0001c4a4004400930001c462006100690001c4e700db00d10001c4fc0077000e0001c41f00cd00e30001c4e2004200af0001c43200b600a30001c447009c00bd0001c43100f100380001c4110057008e0001c472002200800001c4f6007200be0001c4f80093005d0001c4a000a0001d0001c4c2009a00b90001c4e4006100e50001c44d002e00d40001c49200e500b30001c4cb00a300740001c4da000d00320001c45200f900540001c460006d00570001c4ca00a5008b0001c45100ed00cd0001c48400d8007e0001c4ce00c600460001c40100d6001d0001c46d007c002e0001c43f00ba00280001c45d00e900bf0001c4df004f00e20001c42c00bc00bd0001c4a100ed00550001c42a00c100570001c45600a500370001c4ae00f600540001c4ac0030007c0001c445000c00610001c4d7001d00e60001c406000f00950001c45700d100230001c490002300f50001c44f004900110001c4dd003e00710001c480008e00010001c46000b900a30001c49c008700b10001c4c900a800970001c435008900da0001c41a006700530001c42000ab00a10001c4b500b3007d0001c4c9007800d90001c4c800ce00d30001c4de000b00940001c4c4002f00930001c4ea00e200680001c44d00fd00470001c45000e400b00001c49b001300610001c45f007200e10001c46900da004d0001c4f100f900540001c41f00f600670001c422002600490001c49300ac00750001c441000900160001c42b0062006e0001c4e3006100fd0001c4e40014002c0001c42200f900700001c428003700940001c4a700e0009b0001c405001700bd0001c4d9002400e70001c4b3000f00ab0001c48a0024005b0001c4fe008a00860001c494002100d00001c48e00c4004c0001c4cd003100db0001c47d00cf004a0001c41400b8007a0001c4d100c9002f0001c4cb006300e50001c482000700c50001c4d9001c00210001c4b700c7005f0001c4bd005400c40001c4d20048009a0001c48d00b800460001c40e00d900b00001c483007b00ab0001c4bc00b800a50001c4b8001e00ae0001c470000e007e0001c447001b00320001c42200fb00470001c462001f006f0001c4db00c600e70001c42a001600f20001c44000ef00e90001c4410039006b0001c4fa00b100e50001c4b4006800410001c4e1008d00590001c41400bb00070001c4d300e700eb0001c48a009c00500001c44c00a700b90001c4b800e300000001c47d009d00210001c4a30045005b0001c4860034000a0001c479007500740001c48100ef005d0001c41400c9007a0001c4d500a5003a0001c480003100330001c434007100200001c48d008c005f0001c43a000800a40001c45700e200120001c43400ab008d0001c42800de00e50001c4870062008f0001c4480070008d0001c4a4008e00880001c49800e800d40001c4cb00f400a60001c4a7008400880001c4c9003f002d0001c466003400c40001c4a000d800040001c465007d00b30001c48a00e6002f0001c4b0006c00900001c4e8002900a60001c44a001400ac0001c4b30016005b0001c48600ba003e0001c406002000090001c4990027007f0001c43c006600bf0001c4d600d800600001c4eb003100230001c427006500830001c4f3009a00250001c409009f00c50001c42000c800d20001c40b00a900cf0001c48b009000ac0001c462007700880001c4c6008200b70001c4e30083008c0001c434006d00790001c49800d300060001c400001c002c0001c44d0091000c0001c4d200fb00110001c407003e00760001c44f001700350001c4a3002200a80001c4c700a500e50001c47c007300770001c4f7001800f80001c45f005000ee0001c40b00c1005b0001c4e20043005b0001c40d006200040001c41b00eb00890001c47e001200720001c4bf005e00120001c4ce0077009a0001c403005300370001c421006300100001c4f7002c00910001c445003d006a0001c4eb0045005e0001c44e004400030001c492003100810001c4a30061008e0001c4dd009a00560001c46e00e300d00001c453008100370001c45f00cd00e30001c4d5006200bf0001c40300c3009f0001c450002b00f50001c419004b00f30001c43300c900720001c424005c00f10001c4e100f500e70001c49700f800b80001c4ec000600220001c426008700280001c4dc002500bc0001c414007600270001c4b700ab00900001c46f0036008e0001c44800e200590001c4f4003700830001c45a00cb00e20001c4c9009000980001c4580064001a0001c429009f00bc0001c47f00d200860001c441001100eb0001c4060019003d0001c46600d5004d0001c42100ea00220001c4a0006c00750001c46d00ea000d0001c44b003800670001c473003b00af0001c4b1003500840001c42d003200890001c4bf008c00010001c4ed00ec00a30001c43d00de00da0001c4c1006400870001c47f0005008e0001c411005e00210001c4e5008e00260001c42b002600ab0001c4c1003300eb0001c44c005e00700001c43d000500740001c426008b000f0001c4c400b900f50001c4c600a9007c0001c43d001f00350001c4dc006200f30001c42400fa00dd0001c4ed00bb00ec0001c466003400430001c43f0031005e0001c40300b600ae0001c49e006200b20001c4a100b100390001c449003a00070001c4a100ec00a80001c4ca009f00b80001c4f2002000170001c469001a00f20001c4cd004a008e0001c49300b100370001c47b005900f00001c4f1008a003b0001c431005d00200001c4ce003e00ab0001c4d600de006d0001c4da000400b20001c469004d00fc0001c4ce000200b20001c44d005600c50001c49d00b600b70001c46c004000df0001c4c3005e00ce0001c431001f00f50001c42f009b00650001c42b00b500800001c4e900d1001b0001c4e1005700d00001c4a900a600ad0001c48900d0005f0001c43b002100c10001c4ad00ee007a0001c405007b00240001c45c00eb00fe0001c455008200670001c42700f0002f0001c47f002a005a0001c479008800db0001c4a20002002c0001c4c0004000160001c421008d00a10001c436004900cb0001c41100f200460001c45300bd009d0001c48e006000940001c41d006b00240001c41e00c600b10001c4da007200f60001c4d100b0006b0001c4b20061009a0001c4ce009d00c50001c407000f003d0001c47400d400420001c446006d007f0001c47c008900240001c4d600f0009d0001c41e009500020001c41f00e800fa0001c43b007600430001c48000f100dc0001c48e00f900b80001c44900d600e50001c414002700720001c45e00bf00830001c4ec00ce00fb0001c463006b00d90001c4e10021004a0001c463005900080001c4d8007500ae0001c4a20030005b0001c401003200300001c48400af00960001c4290083001d0001c4c900e800ae0001c47b00eb00ee0001c4c2005e00e80001c4bc00e300480001c486000300460001c4e800e800900001c40b00f400c50001c4bd001600750001c48a005500f40001c4df00ca00170001c45a008900430001c45e00a000b20001c43a001800b90001c40d009700250001c4e8003f00670001c4e2005b005a0001c43d008700ae0001c4960036003a0001c421001300d70001c4860065000c0001c47d009300c70001c42800ed00a70001c428001e00050001c4fb004700a80001c4460073001a0001c48d00f100b40001c4e3003a00c70001c437005d008d0001c48300b800ca0001c498000900c30001c4f900df00fe0001c401002100190001c47e006a00450001c4ba004a00a40001c461003500f20001c4fc001700090001c464001a002e0001c4fa00a400d70001c4a700dc00270001c44c005c00cd0001c4ba004e00a50001c453008b006d0001c4c2002400bc0001c49a00f9005b0001c4a500fc004d0001c42700bc00330001c44d007500920001c48d004c00350001c4c0005000b70001c4a800d8001d0001c4c8005900af0001c410000a007c0001c471004d00ed0001c47e00ed00f90001c455009400b00001c44500f400e30001c4f2004800de0001c454008000d60001c4cd007b002e0001c4cb00c900060001c48800cf00150001c4f1009800280001c437009700420001c407004400470001c42a001b005d0001c435005b00f60001c4f7008b00290001c4510054000d0001c4ae002400be0001c4b900fb00420001c48300ee00380001c4fd00bd006e0001c4fa009a00330001c4e4004d00fb0001c4b3000300b40001c49b008b002e0001c4c8003400fe0001c4e2001800570001c4cc00e600800001c49000d400740001c4100060000e0001c469009a000f0001c4b5002f007b0001c49000fd009c0001c46a008900290001c46c006e006f0001c43200e4002d0001c485000f006e0001c42800f0005b0001c4e300a600090001c4df00b200120001c4a8000500b40001c49200dc001f0001c4d8009600720001c462009c00720001c458008a001b0001c406009a00a20001c476004200860001c4a800a100160001c481008100970001c408001b00540001c45d001100220001c44a0030004b0001c48b004b00a20001c41f0018007f0001c4af003500480001c4ac00ef00ae0001c4750015009f0001c4a2009d00380001c43b00dd004b0001c44b005d00550001c465005300b30001c476001c00560001c466008500aa0001c424004e00f70001c4f900b700f10001c445003200fa0001c40a007b00f30001c44c00fa00320001c47a00f600f70001c49000b0005a0001c4520048003f0001c45100c200a90001c43700f1008f0001c41900d2009d0001c4a0000100d70001c4b300ca00600001c4ac001400640001c4ab00d900a00001c4e10047002c0001c4c800b600bb0001c45600c000730001c4ad002300380001c40200f300ce0001c4090034004e0001c41200cf007e0001c40000c800ea0001c443004600c60001c406005f001d0001c47200ef000a0001c4a4008a00a70001c42e000f003b0001c49500ba00330001c424003200390001c45a007600da0001c492005100f80001c483002b00110001c427000100930001c49400ae00450001c43b004800660001c4000047000c0001c41a00a1008e0001c43f001500090001c4a900bb009d0001c458009000c50001c4e0000d00df0001c43000d500400001c4ac005a00770001c4e600f600940001c4da007600500001c42e008100320001c4640002005f0001c4b300c7004e0001c42300f000ae0001c42b008800dd0001c413006500bd0001c486003400350001c4a9000e00fd0001c4ce004f00f20001c4d300eb00f90001c468004900930001c44e0096007f0001c422004100fc0001c4c000ac00500001c400008700580001c4df007d002a0001c4af001f002c0001c417002100b60001c4e3009a001c0001c47900e6006e0001c4e2005000900001c44c001700780001c44900c700f20001c453008100170001c48500a500960001c4f1003b000c0001c487009a00530001c4d9005700330001c4b00076007c0001c49b00cb00cc0001c4dc00b400af0001c4d1006c00070001c44e002000260001c4750095008d0001c4e900d000740001c46800b500d90001c42200d200680001c4be003400c50001c461001f00e90001c4a1005800120001c4f800df00c40001c40000d200710001c41f001800d70001c470008a007c0001c42f007d000a0001c4e1002f00d90001c40a004e00be0001c4c200d400540001c435002a00290001c418002b00bd0001c4b1003300c80001c44000df00ec0001c49a00e600300001c4b20045003f0001c42e0040007c0001c41300f5002f0001c4ed00c000cb0001c4df002c00e80001c43a00ab00ee0001c4730093005b0001c4b900ed002a0001c4d300a600ee0001c42f004b003c0001c47f000000120001c4020022009d0001c4f2003800970001c436003000d10001c4a700b900b30001c4b60046004e0001c44b0027007e0001c45a007c009f0001c40c006c00250001c496000d00690001c49e004500620001c44b004b00bf0001c4eb00db00890001c409007700150001c44f000000d10001c42d001800f60001c4f4007700da0001c42f007b00e50001c4e7003600c90001c4c9002200920001c4a30036009b0001c4ae0083004d0001c47f006300640001c49200a800b70001c4c8008900450001c4cf003900b90001c47200d200ce0001c4e2002100ac0001c4b8008a00a20001c43800e300530001c47e005300c90001c4ab000300c50001c44e003200060001c43e00c200020001c41c00ed005c0001c463004200950001c4fe004a00ed0001c493002a003e0001c422002b009c0001c4de006900e60001c481004a00050001c4c5004600620001c4c1003600d50001c4d50063009f0001c470005d00080001c4e500d7003e0001c40d00c100e50001c46500a000a10001c49700fc00110001c416000e004a0001c4780021006c0001c40800f900bf0001c4ed00d900070001c45c001600d40001c4d200e800770001c46e006a00d10001c417004800a40001c4310052007e0001c4eb00ca00860001c40d005900240001c44b004800430001c4370075001e0001c4fb0094007b0001c448008800720001c4ea0041008f0001c44e004500180001c4dd00db00d20001c456006500dc0001c448003a00530001c4f2001500ac0001c46900dd00f60001c41200f400190001c47c00a9008e0001c40a000000ea0001c46900b900850001c42e007b00fc0001c41c00c400a30001c495000800a80001c44600c000cc0001c41d00b500db0001c462005300a90001c4f2005e005a0001c4f9009f00b80001c4f80089002f0001c4dd00f700190001c4dd008900340001c4c0004700590001c44f00db00580001c46a00a900c20001c42c003300520001c438003900380001c47800e2009c0001c4f60044007b0001c412005100df0001c496002c00640001c497005800740001c485009b00520001c4fd00db00e00001c4b2001e00170001c48000b500580001c42b0005003b0001c4db008700c90001c43e00b900090001c49c0084007b0001c4f800cd00d90001c486001400780001c4dd007500b30001c45d0095001e0001c4e3007900530001c4f000cf00980001c43c001700c10001c407006900520001c4b5009f00870001c43f0097009c0001c472008500c30001c4e600e4006c0001c42a0039008f0001c4c30064005e0001c4c8007f00190001c41b0012004b0001c45300c600460001c4fd001a00a00001c4f8001800000001c49100f100380001c41b007d00320001c4a900f2007b0001c4970011004a0001c4bf000800f60001c4b20066009c0001c4bd002000300001c49e004000e30001c4eb00a900000001c40900b100b40001c4ac003d00980001c4d400b7008a0001c459009d00ed0001c42f005000ad0001c45c004e00df0001c47e002000de0001c41f00d100070001c40c00bd00fc0001c434001e00230001c48c00a000b50001c49100de007f0001c4a100e300dd0001c490000b00c30001c49c007c005e0001c4f5009300a80001c45c00d700680001c4ac00a700b70001c42d003400650001c47000eb00ce0001c4eb005400a10001c443002b00080001c47b009a00c50001c4350091000d0001c4f800e200bc0001c426000e00e50001c410006e00ac0001c445001600fe0001c46200a900a90001c4f9001a00a30001c4db002f00d60001c426001b00460001c4b4006400e60001c46b00fa00da0001c446009b00240001c4e2005e00a20001c49f00d600360001c470006800a70001c4a100d300b30001c4fa006500fb0001c449009d00f80001c41d00f500100001c421001300f10001c42400c900f80001c4af004000f70001c49b005500d80001c4cd008b00d30001c42500dc00ef0001c40b005700f00001c44c0041003a0001c4df00b900070001c423003f00a70001c487006d005c0001c4ce0041008c0001c425003d001d0001c4d200ec00f70001c4b20008006b0001c4eb00d300c10001c4df00cb00e50001c4c700dd004b0001c43300fb00210001c4b6006900680001c404003800140001c417001800100001c49900c300030001c43c003500920001c46300c400c40001c40c00a3007a0001c41400c000580001c451003200350001c490000900420001c45200a500f10001c42f00fa00ca0001c46e003f00510001c4da00c600320001c412006300200001c45800fd002b0001c40d001e00b20001c44000f200ec0001c4ea001e00fc0001c44600c100330001c45500d3003c0001c47f004f00bf0001c4ea007400340001c4910012005a0001c4df0017000a0001c4d2009800000001c46000ee00f10001c47300f300570001c4ce005d00310001c410003500cc0001c46a0088006a0001c479001d00eb0001c489000100dc0001c4e8007100b20001c4db0042001f0001c4c700a2000b0001c4a8008700d40001c411007a00a40001c48b00ca00120001c4db00a100950001c4ea006900770001c472009c00590001c4b500f900d60001c41a00a300340001c4d000a3007d0001c49e0078001b0001c4b30038008d0001c433000200e20001c470002e00ba0001c4be009d00170001c42400dc00400001c494006600730001c40a00d300070001c4a0009500170001c4af00b500db0001c42d00d700d40001c4af006a00480001c4ed000c00ea0001c492003400050001c475005700930001c4eb0074002e0001c433007800c60001c4a2002b00be0001c49f008f004d0001c43a00b900760001c4550053005a0001c49900d300390001c4d100b900df0001c42b0037005d0001c4a5000600070001c45d001700490001c478000100ab0001c4140055000f0001c49000ef00040001c40100ac00050001c43b001800590001c40b00ea00bb0001c462002800f90001c49b00b000190001c42a005e00610001c42100eb008b0001c4f000a500ba0001c457004800150001c4c2003100410001c4ac006000820001c4410092002a0001c4d6001400f40001c4ec001e00cd0001c4f800a9000f0001c4c300f600db0001c4cb00b400ef0001c4e4009300600001c4ce007f00730001c490004b001c0001c40f006d00370001c471007a008b0001c46c008a00fb0001c45d003c004f0001c427006c00ce0001c42b003a00970001c4e400f800330001c48700ad00810001c49d0040001b0001c49e00ea00e00001c4dc00c2007c0001c4bc00f400c90001c44f00e000f80001c4be0025005d0001c4e0009b004c0001c4ab003500e80001c4af00f400ad0001c45500fa00c00001c479001600000001c400004a00ac0001c4b4009400700001c4b4000500710001c44c002700a70001c49200c4001f0001c4b8006d00570001c4f4008a00fb0001c49d00a800a00001c4a4002d00a20001c409009f00f40001c4b600fb005f0001c43100cc009f0001c4580075008d0001c452005e00080001c4b9002600410001c4aa00e4009c0001c498000300e40001c41d00c9003e0001c4d400a5009b0001c4f7002b00710001c436009b00b80001c402006500070001c41200fe000b0001c425002d00cf0001c4e2000a00940001c454000b00cf0001c4bd00bd00140001c4e60065009a0001c4ee0039007d0001c421000700b90001c414002200670001c4c7003400e70001c402006e00ec0001c49b005500120001c4f1007f00d00001c40f00bd00610001c49f00c0001a0001c401007e00cf0001c46b00b3006e0001c427000200fb0001c4a000e1005e0001c40a003e001a0001c454005500790001c44c0046002a0001c4f800cf008b0001c4dd008100c20001c4aa001a004e0001c401004300540001c4e0001800e50001c4080087007f0001c48200c7002c0001c49d0017007d0001c4e400a600b80001c4f8001a00a50001c467003a00ba0001c4a5007e009c0001c409005200070001c411002100620001c477009400d70001c40d00b600310001c4c7006b004c0001c409003600760001c4ed00ec00d30001c489008100fd0001c477006a003a0001c4b9006a00b30001c45b007000900001c44b0043006e0001c4ea002600b50001c4d100f5009f0001c4f000d000e70001c4e200b500460001c45f007500ca0001c441008100d70001c4df005000500001c41a007d00450001c4b600d700e30001c47f008200a50001c42a00a100010001c46c00b300380001c47a003500a50001c48000ab000a0001c4fc007700dc0001c45700ee00bc0001c4b5006000490001c4e3005c00960001c425006300a50001c4c200ce003f0001c47d0095004c0001c43900fa004e0001c4b5005500de0001c424003000080001c474003f00310001c45600f4005c0001c46200dd00130001c43100c7002b0001c45700ab00050001c4600009009c0001c44f000500d40001c4d7004500b70001c45300e200a60001c40d00b2004b0001c461003e00090001c4f6008f00350001c4de005a00220001c45d002c00d10001c4c7003700e70001c49e006b00c40001c49e007100c10001c465005900650001c4c6007e00fc0001c475002900ec0001c48b00f600500001c41900f300a50001c4d900e900570001c41e00ee00400001c4b700b000d70001c47300c900e30001c469003200d90001c44500dc00120001c44b002900290001c4ef000200a00001c472005800050001c44d006a00f90001c47a007100f40001c4e5005300530001c40a00a200380001c42b008500650001c4be007600c40001c4db00ee00350001c468004600280001c437004700c50001c47f00f6000f0001c4c700f700b60001c450000800d40001c4f8001e005f0001c47f009300fa0001c4c4009600020001c4d500f700110001c4de003e009e0001c4ab008e00280001c48500ef00cd0001c4cf002900f30001c4ef00a9009f0001c4bb00d100cd0001c488004b006c0001c46d00de00fe0001c44e00b7002b0001c47a006900400001c457005d00e60001c4840059000d0001c42000be00f60001c42a002f005c0001c483006a00630001c46400dc00260001c461008300100001c44b000400a90001c4010071002b0001c48f00e000b50001c4c4000800cb0001c4d5001500a90001c41f008d00f80001c418001d00c50001c4d7008900bb0001c4bc00be00e20001c48c0014001b0001c45600d3002e0001c46600d000a90001c420004000340001c4e8006d00e20001c46d009400590001c42b00d500ad0001c4d4009000690001c48200e700040001c49400f400960001c4fa001800230001c429002f00c00001c4f6002600a50001c476003300930001c42d002b00900001c4cf000700c10001c459006a00c30001c4d3008900ea0001c4fe00b400bf0001c49100e800d60001c4d700ec004c0001c4c8000f00610001c456003b00550001c41700fb00140001c4e100e100fe0001c495006300fc0001c4aa00bc00ed0001c45f002100c10001c4b000fe00890001c436007300f40001c45b00cb00bb0001c4fa008000940001c4cf00d100470001c44100ec00650001c40d007700210001c4d400c500250001c4ab006000880001c4be00d2008d0001c474007500b90001c4f000d1005e0001c48d00a000f50001c48a008600330001c4b300b100a50001c496004f00640001c4f9000c001a0001c4c8008f005b0001c4c3009900880001c454008f00720001c41e00a100c30001c4030004007b0001c468001700950001c4d3001e00ae0001c48f001c004a0001c4e8002800da0001c41a001e008d0001c4cb0025000e0001c40600df00d30001c4e7007f00000001c4f200da00730001c4cc00ee007c0001c4a800d600f90001c421004600ad0001c45d00cf000a0001c442005500e50001c4f1004c00760001c428008e00eb0001c460002300a00001c44b0003000c0001c499003e00c80001c45000d700520001c49900a800b80001c45d00b400b20001c4d5002800710001c40600b100410001c42a004000930001c4b400c600cb0001c494007b00160001c4a700b0007d0001c406007100680001c49f00b600d10001c48a005600430001c4c9009000b20001c45e007c00bb0001c4b10066002f0001c4d700b500900001c4ae004300b30001c4b2004900700001c4cb0015007d0001c48a006e00fc0001c48400a700730001c4980070009b0001c4fc003500e90001c435004300410001c47d00da00110001c4fe008200e40001c4e3004b00fa0001c489005200240001c47e00fd00f60001c4b800de000d0001c496001e00550001c4df003900830001c469007b00100001c417007000450001c495005e006e0001c42a004d00f60001c4db00c600410001c4d3007000550001c4d5004d00d90001c4cc002d009a0001c474007500aa0001c4bb001b005f0001c4e0004b00320001c46b00dd009a0001c4d9001200790001c47900af007a0001c491005200870001c4e50046005a0001c47700fe00be0001c4680099008f0001c47800b7002c0001c4e800e600dd0001c4cd00e2008f0001c40a000200580001c405008800990001c40a006f003d0001c46800d600cd0001c4ea00f100720001c415008100cf0001c4b4000700860001c42900b000a70001c41800ee005a0001c438003d002c0001c46f006300100001c4f7008300b60001c473009b00ed0001c487000500e50001c4a4007c00770001c42000f500220001c49a0000007e0001c4990056008f0001c4e300ae003a0001c47d006e00230001c45900bd00870001c45200b3002b0001c413002400580001c40700d600330001c4570048001b0001c4e700c300890001c46f009e003e0001c45d00cd006a0001c46500b500910001c49900e200a30001c422009500430001c43f002100010001c45c003b009a0001c493006c00210001c460002500ba0001c4cb0070002a0001c43e009e005c0001c47f001100840001c48200f500c70001c47c0068008b0001c4c8001600010001c40000ae00e00001c44b00a900480001c4e200d600560001c44b008700d20001c47a00a200bd0001c4f7005b00ce0001c48b004200290001c4ef003600180001c4e3003100720001c448005900a90001c4af00c900d80001c46d005b00b80001c47e00a100510001c44300dc00870001c4e800b300300001c4f2000500a60001c4c80057009e0001c4a1008500170001c45d00a400510001c4d200c6005c0001c463007f00600001c44b00be00fe0001c432000400cf0001c41e005f003b0001c43200ac009c0001c4b500d700910001c4bd00ea00a10001c468009a00890001c40e0001005b0001c47500de00cc0001c43900e000570001c4c6001c00ea0001c4810066007b0001c4a0007600af0001c4b400fe002c0001c4b7002b007f0001c464002b00300001c479008500f30001c495001c000e0001c4a4002800310001c44200d300140001c40500b000020001c48500e700a80001c4a4000000980001c4ef0089005f0001c409008d00840001c4f1004800bc0001c4f70001008f0001c45800d6009f0001c493002800660001c43c000b00320001c4d6002000f70001c45d00c600970001c4aa006a00790001c487002e00350001c435004d008b0001c4fc003600730001c4a500cd00cd0001c43b006b00f70001c4a2005d00770001c4fa002400bd0001c421001f005f0001c4b10057006d0001c43800a2006a0001c4e7006200900001c4e1008b00cf0001c48c0050009c0001c43d006100020001c43200b400830001c4f3001600930001c47f002600240001c4a3007e00e60001c4c8007800510001c44c00a300850001c47100e500130001c441002d00ba0001c469008700310001c41d00ec003b0001c4ce00a100390001c409009300550001c43600b600250001c4b500e700c20001c47300e200d10001c48700b5003b0001c4ae009300140001c4b7001400d80001c489008d001b0001c4170098004a0001c49e000e002c0001c44c00a700b60001c4a800d400ce0001c48500cc00220001c4c3008800360001c488000700610001c49800dd00b20001c4be00e400c90001c4a5008400c80001c412002c00cf0001c46000be00950001c4ee008500e10001c4e0009e007f0001c45b006f006a0001c474008a00160001c40e008d00770001c4e100dc00ec0001c4fe002f00f00001c4ae004d00960001c4c5009e00770001c46000fa004f0001c45a0048008f0001c49500fd00790001c49a0085000b0001c4bc001e00ec0001c48b004e004b0001c43a005100e80001c4f7008d00340001c4fb005900000001c4ba005e00a10001c45c009c00530001c42e00ce00320001c48200ac00050001c43e0096003e0001c48200b0004b0001c444003400450001c47200a8007f0001c4b7009500940001c43400f600b40001c4da005d00670001c416005a007b0001c44f00ec00bd0001c4fb007700a80001c4b7005b00dc0001c42300ec00a60001c4fd003e00250001c49a007a00430001c46600f400560001c45b0086003a0001c4a100e000220001c4c600c000220001c4b700f300950001c4ea00ca00b60001c463005c00050001c4d6002200bd0001c458002600c10001c498007100530001c4a9000e008a0001c469002700230001c4a200e800e50001c421008100a60001c4ae001f009a0001c4bf00c6000c0001c43c00aa00570001c462008a003d0001c4870035000e0001c4dd001700b50001c48d00fa00570001c4e80061003b0001c46c007600440001c4d300e800960001c4ad00da00cd0001c4ec006e00830001c40e00cf00a80001c4840016006d0001c41400ec00380001c4cd0081005c0001c44b0083001b0001c4bd00dd00e00001c453008b00300001c4f90004009b0001c4700049004e0001c46300d600c90001c40b00fe00f00001c41500bc00d90001c4d700b400100001c433002800630001c48d006900540001c42a00f700d20001c47e0022008e0001c4e6006400a60001c4bc00ac00e60001c47f000b00890001c41600a700630001c4cc009d00250001c471007d007f0001c42300f900930001c48e000000880001c4a400c500630001c45f002700730001c4db0085007c0001c46500dc00660001c495009200c40001c43900ca00e50001c44e002600c60001c4a60034002f0001c4a7006d00be0001c4f200c5003b0001c42c00a100370001c416001e00540001c47d009e00d40001c41c004900ee0001c4e500a400a70001c4a500b7002e0001c45100dc00210001c4b4005900c70001c4080052003e0001c45b0083008c0001c42b00ba00840001c472007f00e50001c412006f000a0001c419008700d20001c40f006b00af0001c44400a800df0001c48700de00c30001c4db006600710001c40800f300be0001c44300cf00510001c40e00bf00370001c405000500000001c45e0054006c0001c4bf00f500230001c49b0039006b0001c43700f100860001c407006900e40001c48f004900e00001c430003800cb0001c4b500db00a50001c486005c00ac0001c42f001e002c0001c405005a00370001c4d0002600d00001c495008500220001c496004d00060001c4bf004000ac0001c4c9007c00fe0001c4a50023000e0001c4ce00a000f70001c45a007d00e80001c47f00b700490001c4d60085005b0001c412008e00260001c4c7002d00d70001c4320062002a0001c4c1001000a20001c49000b900740001c47f00a000b00001c48f001b00380001c4ca001a00890001c4e0001100a10001c4d7003b00fb0001c4aa00c200950001c478002300240001c433004700570001c41600fa001f0001c441006c00370001c486005f002a0001c4d100f700680001c4d7004000c00001c4d000a500de0001c46500a300bd0001c46800f500910001c4bc000100120001c439006700f20001c4ce000e00720001c400005800000001c4cc00b700aa0001c4d2001c009e0001c4d100e900520001c46e00e400980001c43d002700950001c48300d4007c0001c44e00a100a40001c47e00bd004a0001c4a7002d00570001c457000500fc0001c4cd004300aa0001c42800f800600001c46500dc006d0001c4d30038003e0001c4d4003e00920001c4b0001e00e20001c44e008800b90001c475005e00340001c45b005f00a90001c41900ef00a40001c4900007005d0001c43a001000920001c4f10018005f0001c4ba00a1008e0001c45c005900610001c4c100cf00b30001c4e600b0003d0001c4e8009200d90001c4dc001400fa0001c4d300de00860001c49a002300340001c4d5007f00cc0001c4c7000d003f0001c477004200af0001c4ef007a004f0001c482007400d00001c40100d8001d0001c49e00e000050001c4e900ef00a40001c4dd008500000001c490000300650001c43300b200f80001c4b600cb00a60001c43c006b00800001c46f00d600740001c40b003600f30001c42e003100180001c48100f100d00001c433008d00560001c44f004000170001c42e002e00de0001c490008200c70001c410005100bb0001c4b6000f00c90001c42c00fa00050001c4f3006000f00001c41200d3000f0001c4c5006e008f0001c443002a00160001c48f00260052000161010060006000c16102006000f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : [ + "" + ], + "gasLimit" : [ + "0x3b9aca00" + ], + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "to" : "0xbe7c43a580000000000000000000000000000001", + "value" : [ + "0x00" + ] + } + } +} \ No newline at end of file diff --git a/test/evmmax-precompiles/evmmax-submodx-bench-vec.json b/test/evmmax-precompiles/evmmax-submodx-bench-vec.json new file mode 100644 index 0000000000..b5ac5f0cb1 --- /dev/null +++ b/test/evmmax-precompiles/evmmax-submodx-bench-vec.json @@ -0,0 +1,73 @@ +{ + "submodx-bench-vec" : { + "_info" : { + "comment" : "", + "filling-rpc-server" : "evm version 1.10.25-stable-69568c55", + "filling-tool-version" : "retesteth-0.2.2-testinfo+commit.766b4629.Linux.g++", + "generatedTestHash" : "682d204267cf3a3909bf22c063f2c9cde06a917d56f3666bad7ff4c724b3676b", + "labels" : { + "0" : "empty" + }, + "lllcversion" : "Error getting LLLC Version", + "solidity" : "Error getting solc Version", + "source" : "tmp/micro/jump_aroundFiller.yml", + "sourceHash" : "cadfd8a7ee22cbefac3a420cc4c762ca1a3a38ae3346407bd31694acff16c78e" + }, + "env" : { + "currentBaseFee" : "0x01", + "currentCoinbase" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "0x01", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x01", + "currentRandom" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "currentTimestamp" : "0x61a8d289", + "previousHash" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "post" : { + "Experimental" : [ + { + "hash" : "0x51a20eb8dbdec5af48eeecca9e38acb6006fe28733f8649500092464fe6a6364", + "indexes" : { + "data" : 0, + "gas" : 0, + "value" : 0 + }, + "logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "txbytes" : "0xf8618001843b9aca0094be7c43a58000000000000000000000000000000180801ca0999ee855b1d5325fe79efbc40ad560f9ebabbbb97e72e1a4e9cf7e4b8ba34765a06392df208ed06b901f2997995c138bfa06ae8b1a26c15e8aff52cad68f913e85" + } + ] + }, + "pre" : { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x3b9aca00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "0xbe7c43a580000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "ef00010100040200015e3704000000008000037f00000000000000000000000000000000000000000000000000000000000000306000537f0000000000000000000000000000000000000000000000000000000000003001600153610100600e6000c0600760005360d4600153600160006000c2c3010100000101fec4d4052b1a301908c4eb02790d2c150ac40c08e90098031dc40752d90cfd0003c477059604b90219c410087e0421071cc4b3097e10071f08c457065306ad021cc4dd02ec01d70211c4e9017106ce0216c40209560636071bc40a00e100c60000c46d079005700713c4ac020c07d3011fc4df032817bc0709c4a902ad024c061dc4410e2c109f070dc4857a0bf4ad5201c4550ab604780711c43e08f2001d0a16c4581bb40c471e06c4f400cc02ef0016c44306370606081fc4a0177323283504c4040e0c0eb70411c40908cb016d041ec4a1031809a80318c4b503f200320a14c43e06a7037f041dc46809560a380c10c4421fae0d362106c4b002310765051cc48c077a08110e10c49b05bd03800712c48607270c430b11c4280947080f0a16c49b049b04db0117c47c088608470c0fc4190dc0038e0611c49e06370cd10210c40b09d001ed001ac4b306410fc3050cc4f801b90b4c1d06c4b400c600550000c4df01fe00f4001ac419119b07c2040dc4de08d20b363204c4cf0c2436d10b04c42008af03e50119c44e13e9023c1509c4070b8305220a15c40813b3051b110dc44007e6000f081bc4a506920887090dc46c1872174d1d06c4c302f700720616c474130c22a40d07c4ce02fa00c00311c4ab2a7e404c5902c48c0cbc07820d09c4d0077f155b1b06c4b5059008ef010dc4420ab1040a0d12c49c001200610000c4bd02bd02cf0217c4e606113b5a2904c42a0b080d320b12c4e200a300af0000c4b3043e0b770811c4bc023408a20319c42f177c0ed20509c446094f08e40114c43f080b0ac70218c46d49d614575402c4e8005d0574041dc45b52ad29e00f02c4910fb70a3f1b07c4d5016904bf021fc4210708089e031dc43a07cf0119081ac40b0bcc02e80116c41873614fa22e02c4843dbe20b72402c4fd007a08ab0510c484077907060e11c4100e0d0feb0110c4fc00ce00a30000c46f04eb00d3011ec43506be029a031dc4d601a90365051ac45f10e50240130ac4820d3b15081b09c4a8039104480717c4121afe00cf0509c4060e140d690811c45b072f095e0717c40c0d8d06f10012c4110b6507e50114c4320c3d0b3c0b11c44e109e08870a0bc48904fb00c40218c4150e8e07a20510c4160c5209910513c42e29112f3a2705c44d0b400c2e0d0fc479089806730810c4db039f08a0070cc41122ec02192007c44c07bd022e0917c4af057309250e0fc44b10f301820b0bc47a06b603be0314c46915f701451a07c4032aa00f5b1b06c4a304ba03620715c4b8033209120b15c446122e14760d0ac41a1cc607dd0408c4c804e8018a090cc42108b9027d0519c4f002c208301d07c4940b2618a90909c46e0087008f0000c481056c06260916c42c062307cc011fc4cd32cb34768901c48a0a900a04160bc4c2026b06490816c49706c503240e0fc42fd043bc49b601c49f0a850d2c1709c43818fa00fa0008c4b5025905ac021fc448077106650617c4d201410662051cc415215e17d50607c40800a800450000c4782d503ad50e03c45c0e13157e0b0bc4a7044108d10216c455156313840f08c48509ca04ee010dc41e10a006520c0ec4b10deb039d1006c47106010c250a15c4a0065b0ab7040fc46306f6005b0619c4611153132b1709c4d728b6493ac501c4de04a70b651308c42f0e2d0f6d0a0ec4ce01ae0226071fc4c8030d0e380b11c4001c2518321609c48a13d906042906c43107330701081dc4f10e3ac526d901c49208ee01a0070dc4de027309630a0fc47a13e1049e0d07c46b07dd01450913c4ed02a10d8d1007c46f05c7026f051ac465330453bb1603c4ed00b7037d0613c44b0aab045e0812c4f50a25da906f01c4790e3916241809c4910b660f720e0ac4e801700bf4000cc45b0af100c0040fc40500f300680000c411779435bf2002c487049f0368051bc47c15bd0b5d1b06c45d09e501110e11c4ed02ec024f1907c4fb00a803960418c4970bdb04581209c4e2023111500e0cc4730477046b041fc4230ad002820515c47c06190b460914c49903200750051ec44d07ef00840419c4f9006706f50019c4d70dab1c5a3703c46305d90175051bc442077f05810519c443067304f0001dc4a806cc0380090ec4bb06790c46100bc45e06a90357061ac41d25f601e70406c4a902a503e4001dc4961a7e20213704c44406e5008f041cc45605190742061dc4dd0bcf10712f03c40e0dd202e00112c4320e87083f0d0ec4ed00bc00020000c4473d792cae1b03c43007bd0270051ac41c4bf702722f03c490046b05fd001bc4710c0b1618150bc4e0053821382106c4b01af4031a4c03c4731cf601b60e05c49a04c602dc0116c42b0dbb04d30210c40132611f941505c41808f300af031ac4c102d0014a0718c4da2549b6f10e01c4c3026c063b0816c4f0012718611109c4cf042016bf060ac434149e09e2020ac45f201c2dec0305c4d105b509b50908c48404c802b7021ac42e0e9a07720a0ec40c22ca07241f07c4cf025709360b11c40a0d3d0aca0212c4e0006300400000c4e401320b780712c48304200735071cc49306f600040f10c4ee008805370817c41b14d403810b0bc43ec1f609906f01c4b3036406f40017c4ae02f000da011fc4ce027f07620911c46005100867051bc48204b502bc021ec4847bf20d35ca01c4ec00d401aa021dc49703d70149061ec42c0037001a0000c4e103d704da030ac4880d8d0cc20609c4c303b903950513c46e086c089e0512c4830c0419ac080ac4bd216f480d7902c4a303d701780519c45e282536d30b04c42e0df400e60110c487282648ed0603c4170f76098c070fc42337971adc0804c4ea005c060c091ac43707df0147061bc44013da032c150ac4970360055f051ec482040e08ad021cc45b05980378041dc40c11290fca030ec41317f001c0060ac4e900e900a6031ac41f09bf02280917c44407f200140919c4b6058208e7010ec4639cf60934cb01c4aa082c15890b0ac4d703a0072d100dc479166819f00206c415079f0309071fc4c909521ccd0806c46b155817421b07c46e07a904950513c49a03690420071fc4731cc20cae1005c46807d402f90015c4f602f003502b04c4650ab2051b0f0fc47d06190b5f0814c4087b3d61d31602c48e05c303460914c42907650550061cc41508aa02ba021dc44e094709ab0413c4d201c5017d041fc445000e00de0000c416e91be437c801c4f3004308d40215c4ea028b0b35140ac48e06fc00380b11c4ed03f701631f05c43c0b160d340b11c4d702650b8b080ec40610aa055f0a0fc4d9013c09f90015c43d074607a0031ac49904c1028b0418c403085905d3011fc424152415680f0ac4840bac07a7080bc4b24d19e6df2001c49423b7186d3003c46b075308fd0014c48803c501b8021ec4c602b7036b0616c4d216ce18a02f02c46607f900d90114c42e006f00ab0000c46c0590030e081cc4e30e2a6ac61c02c47308a105050e11c41d380a3d6b2504c43a085007910417c42a150d18c1060ac4bb02ec00780519c4d101660522071ec4c5024b0629081ac409f651ae669901c4a317a4167d2004c41808860410091ac4a20360052b071ec4d3012d09120a17c43206db01e5001fc4342831292d2a05c45d052f077e041dc407161a140a160bc45d05700416071fc4d42bc93649b601c4572acb0d0e3c04c42e0641064f051fc4a905270d4e0b10c4fd006c068d0418c40d1ead0a9a0c08c48905b103000c15c49106a905220d10c46407af04470914c43e0cd402b50410c4200add01fb0015c4d4015805bd021ec4e902780cbe050bc49a194e2ced0404c4310cb704310c10c46000a300650000c46d07250b210b13c407293c20bd0b06c4320fc604a7060dc4ed008d05c00314c42c15ab08750d0ac4cc013007b1021bc4ab03a40365051cc4fa00b307b9070ac48a0e3519001f08c4da027308e30111c430172118840d09c4da049d0a970b09c4d501d9010b0a18c4b80ad406351c07c41c00e500150000c4d6019603b9021ec4d8010f0b320915c4b1050112c7040ec4300782047b041cc4d4012f08f40019c4de03980937120bc4003350232f2905c44c0953099f0512c4b226823eca1a02c44e0a9a052c0c11c444085e07ae0317c4bd039c04570815c4e706c70e153a04c4f20d9c63f90601c4e201d101c70218c418004600020000c4571c9d10751706c4fd00000c760614c4d30e8728204a03c4f2017d0b3d110bc4ae0600139e070dc48004070823071fc49b04c902f70015c4f503812a593703c4ec012b0ce00111c49f0c041fed0208c4172e5d209f1305c4d601b303eb0018c409088904fb001cc4d6019404d80116c4c803580b6b0a0ec41d0930098d0417c44f079c043b0817c40a1b5a12880d09c4d701080954061bc450065a06d0011bc426d92cd342bd01c41e09c5020c0a17c4710add02e4020dc4660a3a0e8b080ec474057405a0031ac49511b80b5c1b06c48b0e33199b0c08c42807f000a9031bc42a0a4109c50214c4b8058f095a0d0cc42f09f9009f0415c4550c9207ad050ec41e09d2014b0719c4ca023f0ab80313c490051f0bc10314c46c0b0413760a0dc4d508192eb90e05c4f30169103c1509c4c003d2027d0615c4e201f8001c071dc4f800f0009c031dc471046f04a8031dc4cc015e0514081bc48604b2039f0319c4870fa80a581408c4e9053432293504c466050f0840071bc46700ad00120000c4590ad902910610c45c204a24951505c40909060986041bc40d10e102310d0fc4b917ad1bca1103c4b0022a0750061bc4830457065b051cc48c047a0499031cc4bc036707580814c4d7011b08f9001bc418e7fe013fc001c40952fd001a4c03c45810011923160ac42b35921b023f04c4c3015105af021fc48607dc02c90311c41774624e0a7a02c4fc0005080d081cc4d303d50311120dc435089a042b0819c4e8011c0a760615c45606c402760519c4d4018d0380041ec4c90d103b931b04c41309a703430718c4b207820b0d160bc4e80bec09883b02c45b0c0a123a0f0dc469199112551c06c4f1003406cc011fc4e9028a0e511508c49a0ba609bf0709c4ab10182e083105c4e502390f560d0dc44e3b4f3a623403c4be02aa02e8001ec46005360669051dc4f2065853097b02c4cd0ad109e00605c49b057d07bb0411c4f10076051e0918c4fe007422b31304c43116ab09d20509c436c96798c83701c45b054c06aa021dc4990325089c031ac40c087e04a0031cc4710ae1020e120dc45f06080a300917c46705aa02c6011ec4e804761b073105c4a105370b740811c480068806d50213c44f005f00010000c4dd005a000f0000c440007d00220000c45f1a561c8d1306c4aa0ea40fdb0606c42e088b044b0719c4ab03f700e5001cc40b168c0a37120bc4b027823eac2902c47e815ca351ae01c48705e501e00117c4e101180b0b0b15c41e08a603ca011cc4d801d6016d051ac4060acc024a0717c49f08710bdb030cc480048f04a5031ac4a0034c07800518c46407f1000b0b15c4f5009206ca0311c48c04fe002b0819c45b008700170000c44807a403f3001ac42c08f700090a18c42a079f036c041ec4fc0027006c0000c4ce02aa048c0514c408f75ca38f7001c4e300210747051fc43f08d701a80318c4001391084d0d0dc4452e9a19293504c45d20b90e4e2305c4190a070ba50415c4e001840490031dc43b07cc01a7031cc4110def00fc0012c4802af902932403c421121b138d090cc4120d3c0b0d0e11c40f11420da6060ec4060baa03fb0016c4e8007705e90019c4fc00cb036a0a0ec40608b6021b071ec45706ac03d4011bc4060be101b50315c4b80b3f20941106c4040f7808b90410c4ae067c0ab5050dc4f4006e05f7001bc4fc00a00386041ac4780c0e15a8070bc4db00cc00bc0000c45b005d006a0000c4738cea1505fa01c49d106619e60406c4fc00f800df0116c4f5006d0d98090bc4d203fa00e9010dc45e098207620911c45f07d8012e0916c4d201db0129071ec4360c230d550a10c464053e0616081dc4d4085322af1005c4c702d601b6021bc445081f0a8d0515c41512de02af060dc441079104dd0119c46d098e0779080fc4a203930488041ac4000aa803100918c45c083f0a7a0713c46e0b0313e3020dc404148b09d0030cc4df02c904d6030cc41b1c6613950d08c476044a05e2001fc48d04e101380818c4e104b40a511807c4de017905940418c41109d401b30318c460052807e2011dc47f05dc01860419c4f500f700190000c4ca042a11e9010cc48c10e2045b1707c4261ba30b860f08c4ef015c12451409c44c096308420a12c48705fa00230917c4f900c5020d0919c4c9122648922403c416e99e61f50a01c4290db3049c0610c49d18a616452e04c4b804fa008f070fc42b08a0036d051ac4604f7644cd1902c4980350065c061ac4fb00d20339100cc4f900260c020e12c4ae030909ac031bc4d104b107a8080ac4362834284c2305c46d24083d841e04c4090ba4045c0715c449064b066d051cc41d10a7063f0d0ec46c0038000a0000c4c505620e92090bc4320f1b11fd000dc44d0b240da90510c4624ef107d01702c47d0db4076b0e0ac4cd02dd010a0d12c4ab033a07cd011ac4850b321239120bc47b842bd441be01c483085c0a600a0fc42d1eae0bfb0007c40c0c4909070d13c424082c071e081bc4f2014814221809c4f8003416471409c4ac08c10633140ac4b2054e0d95080dc476042f074c061dc4ab059307ef010fc40232182e641f05c4fc00ad0204081ec4231ffd004d1907c4b103010bb00317c4fc00710560051cc475045e0545061dc4200f9907500c0ec4cf050b1be90209c40409fa00ce011ac47e04d70131061fc4dd016c04b8021fc4a30d421bed0207c45a06cd02f10018c41c11480ed7030dc4f80030098c0516c46a25432fa21704c4730897066b0910c48604040805081cc4250f9f06290f0ec481043507eb001cc4e0017b06c80213c48b03150729061fc4b604fe00d8020fc41810720afe000ec41f0ee801d9020fc4990ab9076c0e0ac43a0019001a0000c48a063e0a1f0b13c4360e8608a6060ec4807f1ce3728d01c46810fe00a20a09c47c06f3004d0913c4ac06cc03cb040dc493242c469e2003c45f05c70295031bc41307880323071ec4ee01a506330e0ec4f500db016f051bc48b0483044b061cc43f18b0092c1a08c4ee00ee001a071dc432071208a4031bc46e050c09000a19c4ba08c1079a0c08c459213129c50b05c4d009292a981405c4300ace02270a14c40c300532c90a05c42b075006b1021bc4850469062b0819c47906a9046e0615c41c098105610617c4630668066f0519c43a07d101aa031ac4b425c51db32602c49f005200690000c478067b06420914c40708fa00f5001dc4d0011208d9011dc4d8079a14d00905c44206ac02b7021ec4f300e901a8060dc4af046808230c12c4cc0129073d061dc4bb021c0719071ec4450ee601f6000dc4f5005d063f071ac482055107310916c4e4016507a90316c4d802940780080fc418739b329e3002c4fb006e0530071dc43608f800ce0119c484052e091c0a16c42c08d601a4031ac4a0008700720000c4781b4325c40b05c4e6014c07070a18c48f03e800bf021fc45a07d002710615c4a303eb009c0418c44200bc00d20000c4fd00380f650b0dc4f000d502440a12c44c0ced01530c0ec46d05d201320819c4570ed903b8050cc47e04880453061bc4a20f2b23052906c4b407640f02190ac45e20dc07332805c4af0253057b041fc475064109680714c45115e503eb0208c4f50097053b0a12c44906cf0113081dc4a4127d1add0605c4e001b703eb0017c46c08af04190c12c4070040004b0000c49d03220771041dc47f05f2007f0518c4bd04ed01900610c4f2016c12ee0208c42a0f520c15100ec4ca088813b20c06c47d099107f8000ec41609010ae60119c45c058a0416081cc4f701bd0d701c05c41726bb0b8c1306c4ca07ae0b871107c4291a5a14351908c4fa009105230b14c4df01f20073051bc44b07c502710518c46c065a07e60117c47305d70159061bc4540c03126c0a0ec4ce102d46cd1003c40c0b93059e0415c4216f1c71873c02c4aa03a3030e091ac4200949075e0717c41d099704cb0217c4bb04b40505110ec4c0057a0c790c0bc490031b07d2011dc4090b9804b00316c4c10f5e28fe0004c45609c003650911c44309a2041c0b13c48b07220dab0510c47406c8029b0415c4ac04a704d60213c44b056e04c6011fc4750da009f5010ac44225641f921505c45211e40232140ac4230f5c0b81090ec4f1011b14510f0bc4d902420bbc0410c42b1aa00b361908c49807a906600b0ec423083b07bf021ac426070408d3011cc443091e0b080d13c4a22efb02af2802c4f3040453c91203c4b9026805b4021bc4cb029204760616c4e30184046e051cc4e103d2055c1408c4fa00421fe90306c48304030823071fc46a0e2c15c0060ac4cb05fa004f1309c45a29931bb21304c4630ef900550f0bc47b05b20243071ac4d70109075e051fc4e702720b20120cc4170e8c073f0c10c4f500bb02f6001fc4e6026011b70809c4be08c307ca0608c49f06240d180e10c45a05230709081ec498037405b2021bc40731611f282b05c4ce01ed00b7021dc4023ffc009d1804c4ce029904030b16c4e301d101830419c42a089604e10119c4a9000c00f70000c452057f047b041dc484004500870000c45e085509360b12c48b043c0630071dc49c03440661051cc4c7028a06660813c46905bd0261061ac46b08f400ab0412c46b09ea01c5030fc4b307c0068e0b0ac4b300e900b60000c4960d7711061f08c49005e0014b0913c4cf068611a80c07c48903e50055051fc494043609c30216c4ed04fb011e3804c4d90c9623035403c4920fd406ec0207c4212c4a24841805c45007040a740518c416097d054b0719c4a8035c077a0616c4880584050f0b15c4980479061d0a16c45e05ca01b8021ec4619e26d953ac01c42307c70247061cc4690a370d370d0fc4b708740f1a1909c4331d8a101e2007c4870c790d640f0ac4c8076a15c30807c401fe4eb1639c01c4e2097d2baa1c03c4a00abe07bf0709c49b004200f30000c46f08370b4d0a11c4480767059c031ac44e0b9a0608100fc4390b6308d50212c46e12880e071f08c4590a450b950610c49205030c480914c4bc085e14451708c41b0c5d09e90112c40a0b4e08730615c4bb02ca02eb0017c41913b1061c120cc48c056a06120a17c47b05110928081ac4ac0361067b0518c4e30164065d0717c44c05d10164051fc4a0077c0a400e0dc4bd055a0d400f0cc4cc01d6019a031dc40c0dd602fb0012c4b0075710690f0ac42e00f200550000c4134eaa1cca1103c4180adc01e40116c4d60a572a1c3804c4a3083912d2040bc4ad00fd00780000c4840c0f185b100ac4fd008905050b15c4380f6b0b07130dc49305020ccd0215c4af08f40101190ac4c3024209de0115c48e1076133d1b07c4e601080d7a0712c496045706c5021ac4f7006d0d14150bc42d695c510f7802c421112d10510d0dc4e701a4049f0513c477054a06a5031bc48f0474051d0919c45408230a430815c4440d550cdc020ec4450e650b81090dc4211bfd00751108c4a804b903720615c4f20d53ac5ba401c42c0ecf03230e0fc49e06360cef0110c4fc00a704680715c43f0abd03040d12c462165618a90c07c450063e06ea001dc4e601f00176090ec4900c1a191b1909c404168e0a20140bc42d0fec01c3040ec4041090070a100fc4b004be03d10212c48e047b041b081bc4910cac098f0c09c430081f08c50219c4f302f302c20c05c41b10230ffb000ec4410b200d0b0f10c462065e06780518c4a5028b03ce011fc4c000da00ba0000c47c047c0444061ec4d906ef02cf0806c49706060ff60010c4cd03d902fa0010c48e079007590b0fc4f300d3019a0417c4411fd9060d2806c4c0026b06600716c4a6065d0b11110ec414136d0ccc040cc485066407720714c4dd01f000a30512c4184de508124f03c49004ca0146061bc43408090abc0218c4000a1009f60018c44e0d8b08580c0dc4144e742e0a5103c44b0c9407d3030ec44506f7006b051dc4bd06610fa5090ac4490eec0126100dc45a0f1615680d0bc4dc025a0b2b0e0fc4da253ac5a75801c4d802e6017e0711c431677c41525602c415003e00ed0000c4650b1112ef010dc4b80b571c451f06c4f3009903f1001ec46c49c11ff10702c46d0797059d0513c434650e78465c02c4cc03540dc6040dc4f501b9082c1a08c4400aa304f80013c4b6121f38293504c475043c0625071dc42e347921ed0404c4312215271f2506c4150b260a9c0414c4780ba8074f0e0cc4ea00d901630617c4f5002d07fc001ec485046f0563061ac4c502960384041bc4c007be074e1309c46f1268129a0c08c4e3092847812a03c42316640f670f0ac4b802910397031dc4de04f900910f07c4a4033508b20318c4020f8f07390c10c4340924094a0816c45e0a1b0efd0010c43409d801570815c42f081b08d3011ac41a2d4425e50505c47806c0024c0816c447109b09f0010bc4a903a703b8021cc49c05cb03280c11c4c7038108680a0fc4dd03e40231120bc45a1b581ba40f06c4f0003b0a0c0d12c41674f007d31602c43d0742076e051ac4be04c40395070fc4f6011821c10807c4c703480a690811c4e904d807c10c05c49a030b0757051fc43d13a7085e100ac46f12f4014c1608c48b17242b681e05c4da01e700b6021ec46209b2041e0d11c48d0bf4015d100ac46f9046b9ac5301c455054f055b051ec4470f4d0e16130cc4694b455d6e4802c493047205e10118c44e583565ea0a02c4800c740d36140ac49907c104dd020dc41d08460689041cc4350cab05610910c4440a8e06280b12c41c115b0c91080dc48a03c9018f031ec423084c06ae031ac4ed026a15af0b07c41c1c5015661308c41f0ada016a0616c4ce100354433e03c4a857778815ea01c49c10b40c8d1306c46b18cc08da0606c4aa04e601870515c4c5020f0801081dc4ba02da011a0918c41a19a9096e1009c45d517147c81b02c4f7008f0709100fc452058c032c071dc412000b00540000c4c70492097b0b0cc48a0eb808fd0008c4a203ac0211071fc46c061309200918c488049703bd021dc479867e81e11e01c4430bf400e70111c4fe009807c1040ec4871e2a35363204c49d07d003290f0ec40d08f00078051bc47e2bb6182f4503c45e07cc02fc0015c4562a083d7d2004c4b5046e08f80011c470236f24b21304c4c2074816a80a08c4e503fa00541508c48c007000aa0000c49108b7054e0d0dc4470aa804a30512c4a70b201b291a08c470068805de0115c45206a60395031bc4c9020c0b5e0715c4e800c802130918c43708ea001a0918c4c0037f08430b10c49e058706460913c4b306fa00f9000cc452074707690618c4200c5509a70412c4b1066c0cd1030cc4c306970aa4090ac43f0db00578090ec4cf02080e1d0d11c4680587040f081dc49a045506c40219c4af502fd0817e01c401244b19102207c48e04cd02e60117c4d10128073e061ec405fa26d9cd3201c48c175322991405c4ed06fe00fd0003c4c703c3033f0a12c438101213be050cc4ea01530a840711c462087507650812c4bf02000901091bc43f06060858051fc46206d3019a031ac49f0d60160d2207c4eb002a08020a19c4ed00b403f10018c48119eb049b1405c4a8071413da030cc4b403f200d80115c42f08050a630618c43e10f9009e080cc419079a035f051fc47104e6001d071dc4b006480fb9050cc4a7045a07ca0215c48318731ca31205c40300e700e20000c41e0c110d6e0812c4d401b2037a0518c4cb026108740712c44e0b220d1a0e10c44f0d3d0e680b0dc40b300c30c70b05c4db015e0692041ac4421ba10d6b1507c4a10599068a0710c42724a50fbc0b06c44b0560052f061fc40d7935659c3102c4f500bc035a0912c484299623543903c4fb00000a970419c4c80b39277c1a05c4c902310abc0313c48976f708cd3201c41307e600cf011ec4150ea305d40210c4c207c806691208c4712ff403334403c4f0005406c1021ac4ea038b13152706c4d22d0bf4ad5201c48f045e06b30319c4ec13d02f9d6201c42fd023dcb84701c48207db02f80011c4e100a802f2001fc41d145e0e1b140bc4c60252082f0a14c4e502830c29150ac421094007110918c4430612083b071cc40f0a7506970416c4ef00510544061ec4100b7506340915c42709140a2e0917c48c06b204820711c4c5020e0af20017c449087f05d90116c4ba035c084d0814c430129a09580f0bc4870582051d0a16c48104070927081bc469120c1ed20508c4aa056309570911c42815a9087f0c0ac408092f08e5011ac4b70afd00291e07c4da01cb02d4011ac4ee019706870711c4d7054117681208c4a7044e08550815c4ce037d09250f0ec43721a30fa20f06c4610f3d13dc030ac4ee01081bdf0309c4c801af02b2021dc4bc04b5046c0910c44e05b30284031fc4ba03f800ef0015c4833e893b0b7a02c42b2a4724242b05c47810131da80a08c4772d433eed0603c47804df0180041dc4f101f60035100cc4dc012109bf0217c41a07bd025d051fc493041309ba0219c474099307f5000ec4c902c003fe0014c49722782d194c03c404082907bb021dc4d000c900550000c43e0b310c8d0611c47400c400a70000c46a060f0a7c0517c40d18810ce4020ac4da014e08280a14c44d116f0e930a0ac4a106640ac4030fc45807be033d0915c45f06f500730617c41611460e06130dc4fb008004bf021dc415212f1d5e1707c4b50506137b0a0dc48d086a0ad1030ec4790aa506e9010dc492058f05d70213c4ee00180a850517c421372935e00704c43f061f0774041ec43707540644071ac47c2b1f4a374203c4cf034b0c13100ec4020e370b280c11c4730c3412dc030bc48a08e4015d0b0ec40c0d9f05730712c4e101a7031c0919c45b054d05f1001ec4060b64078a0516c4bf038e05210a15c447089004fc0017c408085d05be021cc4d3073521d40706c4f500740553061bc4060b8f05800516c4230aa504a60415c4ef00220c690812c4fd01e70cc01f02c4dc02fd00630a0fc4b704b6049b0512c4a5007100950000c444062c07a6031bc430cfb14ee01f01c4a00df301501907c4d5028506a00512c4481a9f0d571807c4390fde02420e0dc4280bac04f00013c4fd00d105bf0709c4c10233088f0419c469152d1e8d1007c4dc01180844061bc4320ff300ba050dc4300a7e06600813c4c0037d08b50410c4430ac303330b12c4e800000a030a19c4780c7f0bf6000bc4560a8b07370c10c4b2196633e40903c4c1032e0b5e0812c4291e910f211f07c4cd03de025e0c0dc41707410681041fc4d901bd021e081cc403093d06d3011cc45721132f562105c41e0bc103c00313c434064b06f9001ec4c002a2030e091ac41011c204720a0ec4d40adb09de0804c48c73b44bd82701c49907360e15100ec49a195c28f90104c40a0cd7022c0a14c4bd09421bd10607c42e13ed01f8000bc447071b09a40318c453acf00fec1301c46506ec00020a19c4a416083de10704c44207520656061bc40d0cb103cd0214c4e8018906f20013c4fd008507bc0311c4ad105621b40f05c49c031d072b071dc468067e05190918c4b703ca02750518c4a00316077f041ec44100f3007a0000c43900be00230000c47b107111161d08c40d0aa403fa0018c4d002ce02300c11c480070a0f7f0810c4ed007a04ec001bc48404c50185041ec49506500afd0011c43b06fc00c2021ec410089203a2031dc44b0d0e1212120dc4921b3333c40e04c458061308c3021bc45019a60c5a1707c40e10250e450c0fc41819930c301709c49e078409de020dc41309e800d70118c4c903f900fd0011c427180a1b9e0a09c4e303a90a351908c4a2087d0b4e100bc4d7048e0b980a0ac4dc05e304a20f06c405086804ea001fc4e8008b00910000c4a803d102590717c4cd02d5012b0916c44b0a6f089f0512c4280a5408a10415c4f4016d0da1080bc4051bd105f20109c43e1b251fab0c07c4ef01f3017c0d0ac4f400400c7e080fc4b004d302f40013c4da014e09a10413c4c102000a280818c478054d07a70319c4002457183b1c07c4101d3419ac0a08c4a20a740fac0909c4742ead1bee0503c4a503b902dd011ec46405c202e4001cc45f05260753051fc47f043407f1001bc43e089504a30417c4a8068708260f0ec45b0ce002ec010dc4231b5415731108c43f11ee0133120bc459a657a8a35c01c4c03f36c9f50a01c474112d1a571508c43e0aac04550813c4073e1b39383104c4f502c80d572a04c4fd008a06530912c4dd045f162c1e07c48405100a250916c4b303040ae60119c4f4004700cd0000c4dc012c073d061dc47609210e7d080fc475096d0a96070ec4d201d901bb0219c47309580bc2040fc47c058e04020a19c4cf028a05860517c4037e4c594d5902c4211f4b19fb0007c4a4068c07390d0fc4090a5407e70118c4b618b618ec0603c47047d714843d02c4f100f10075041dc45a292137931b04c41b00b100a80000c4710518092b0818c4200ab503890515c4ee01810cc3060ac4300cb8040d0e11c4eb002a097f0516c408132610fc000dc4ae06610dd6030cc48518f202801905c4cd027706580715c40609bd02f2001ac4ee01f600de0111c466134717c00708c4c4016c04ec001fc45e09c4030a0e11c464050808e4001ec4c504d10392090cc4be4131ce6c9301c4c702c902b00316c42208f300f90019c4843d9a32e30e02c44a07c1027b0519c42214830b22140bc4c613473d483d03c4c604c305770b0cc43432452e682504c49003030886041ec4fe00c801f6001dc4421b17210b2207c46c088307960611c4492de905303304c4a9070e14e7020cc40d1848122b150ac4660a0c10da020fc486055a079d0415c412092c0822081ac46e09420c78090fc40e50fd00712f03c4fb00a412ab1005c4f600bc03390916c45f28402fe50604c46505740563051bc48a0e7311ef0208c493038204c8011cc4a2038205210918c40611290ffd000ec4bb04d202d10211c4b64955aa43bc01c4ce185455af2802c4b605300eea010ec4540a360bbf0311c4f600151327120cc4520fa00805160bc4f700b100e10000c4430e23105e0c0dc49137aa2ac51d02c4206f2e68ce1802c417071207e4001ec4843dda12127602c44809b403860614c435ca44bbcc3301c4a1035d06c4021bc42607420643061fc40e128809420e0dc47908080f2f0d10c4181cc806331908c4cb02ba03450816c4bd0d0f30f10205c4d8047511da0408c4811f2e34103b04c4eb06cc113f4003c45f0eb207d9030bc4d706a10f0a2806c4ab04ec00760615c4170b87057e0615c461072a09390916c44a0c1d0fc6030fc4bc084517761108c47d049104c8021bc49d10d107521c06c44a06ae038b041bc4a22eed09983302c47217e704f50106c4410d8e080c110ec4570e810ab6060cc4a41ea51e304503c46c93ed12e91601c41d4bfc018f2503c4100832076e051dc4da02a3053b0a12c46f06ce02ab0316c4531c1726122706c4db007500bb0000c4d8015605ec001fc4230ab703fa0015c459142f1a541508c4da06ee02cb0806c41d07d80188031fc48817282b951505c4cb024d080b0b16c44d195e17152107c47a859966d92601c4dc011f0b380a13c4a50b171d761108c420164712a9080ac4cf02c202910418c422120514bd050cc434160f1aa20a09c4fd013366b02702c437647943cf1802c4ef00620549061bc49833ae28fb0202c47d1a8518fe0005c4330eb605fe000ec45f0d9f085d0d0cc4a90efd00342106c4182ea911e30505c40c09d601460719c430331e38ce0c04c4c1050514c1050cc4f6012917311609c420373831fc0004c4330f2d10a0070dc4f500ed004b0717c4e40152063b0719c43c003800270000c44006260783041cc40729d507851406c4e801e4018f0513c410071407e3001fc4840c371442120ac4c202b9034b0816c41e08f70089041cc43c096707330a14c44514ae09e70209c4f802513a702f03c41c0bf3004d0814c43716be07e10309c4bd02db01c7011dc4340f5e0c9c070dc4b2060414530e0cc48d032907c3021dc47e045706b8021ac4050ea3051f0d11c48015cb08b00d06c41509750564051ac43e00da00e70000c46d057e0426071dc400093407f5001ac4170b5d08ae0414c47a000c00790000c4e10f8e382f6802c44c06b0032a081ac47b06050b790615c49306c003550a11c454089f04b90314c4d502db01000d13c4fb00430d340e0ec4ab07550e98080cc4a12f5356ec0902c495038a0388031ec4214a3344a31e03c44c071f09ea0017c44b077d05dd0119c48100c400ae0000c4000a1c09c00218c4d20776166d1806c47e0644092a0a14c42407760443061cc4950fa30d2e1d07c4170d7b07b10411c442066005ab031cc4da01e601140c13c471051c09470719c4fb006509a60510c4ad030009f9001bc4d216ba22ec0902c4ba0371067c0516c4b702c9022c0819c4d9045013ee0109c47a07180cca0213c4320e590b340e0ec4c102b003c40216c49806180f77090fc4871e2c34702304c46f18d007b90b06c4d5021a0aaf0315c4dc02d7031f110dc4f701a50c891007c4290f7c09a8060ec4da0177053e0817c40e0e1d0d900611c452069e03d20119c4e70056001e0000c4870438071d0919c4e1019704470719c46705e10160051cc4af0bdd04042307c46e24a217fd0004c45f05ed006d041ec4f600f4003e0c0fc469197317641906c4ee011510590b0ec4960dc906001f08c47e04d401b4021fc41107b50224071fc4b509e503401708c49c31614f8c3902c47d08b804240d10c407315721bd0d05c4c01f3465266c02c47e06b0030f0b15c40d0e8007ba0411c4370e2b0f1b100ec4ef016d09430b10c4070e7008950611c441074b07c50218c4f3002f0aee0014c40f0f9c06db0210c4621f57216a1d05c4dd01ab03e3011bc43a062707a0031ec47e8123dcac5301c4a802620517071fc4240a54082c0a15c40a31232c282b05c4bf0a8d13941106c4cd05740d52110ac43c08050a450718c4291ad105e80208c4ec043632e10704c448086107d10216c4f1042748772d03c48d07de02b30410c4e301d3027e080fc49c079807d8020ec49006400b760811c4a104060c2c0a14c49615fd00a41205c43a626c49614f02c4960060005e0000c4e30e256d2a6a02c4ac02db01a5021fc4e7016606c50217c43d0d1111660a0ec4180fea019b060fc49c04ef00f40015c4e20ea52df30602c4dc028c076e0910c4d4044d134a1409c4e1076227bc1004c4fd006209640911c4e207951a1e3804c49b04020a520718c4570b2b0e250e0fc4dd017c045d061bc44605c5017d041fc46a063308590618c44d2c2835173a04c473059b04430719c482044206c6011dc4bd029e037e041bc45107c802810518c4f000dc0121071fc495066908bc0311c4200b7506ac0414c4ec00cf02af0315c4cd022409e00118c40309b9020a081cc4d8018705230917c4760dbb0644120ac476087408c10311c441072d0847071ac4091bb108930c09c4a90a5914a20b08c49c317e40246d02c46411d105a60909c48904c302e3011cc40109a80304081cc4c2041610bb040ec44b06b90243061dc4550541061a071dc49000a800710000c45e050d0893031dc42b0c7c07410b11c47e07ec01770811c47909bf04710a0ec45c1b27240c2806c4e5006900bc0000c435001000cc0000c41e4b34439e2003c48f060a0d300b12c4aa15103b821f04c42337e6067b2104c42b092009ba0317c42f290e30cc0a05c4a35c54aba25d01c42c0bb1043f0a13c4fe008b17c00c05c4010fa305fc0010c4250caa05430b11c42a0bb0041a0c13c4400ccc03450c0fc4b748e91639c601c4fc00ea01580715c43c082c09ae0317c41b0a8505ea0016c4e501e50153061ac49004a403e70117c43f06cd01cc011cc4a60e12276d1806c40a1bd0058e0c09c47c049303ee001ec455089005dd0114c4f5010429ea0306c443179b0c0c1e08c49103d0011c071ec4cf048f0b900b0ac44306df01c0021cc495055608970415c4b804490b260d10c4d5024809ea0114c43407090882041cc42c07e6006e041ec418139c08ed010cc42a07610593041bc42f0d2f0dde020fc4fb0088051c0a15c4c102ea0099031ac4e101cb018e031dc4fa001d0750051ec4ae062d10a3070dc49e06dd02bd040fc43e0cb8049c0610c49706410b430b11c451157111fe0008c4410b9206920611c4bb0250061b081cc4030ee2015a0911c4820450053a061fc431070f0816081cc4da04940bfb0009c42f14e1032f140ac4a9099f0ab40809c45a21db07f20205c429155a1048120ac48f05ca02070d13c4c603300c710810c4430c98069a060fc42c107d0a0b120dc432077204c1021dc42407860444061dc4490ebb054d0d0dc4650591041f081bc40f07f000c8011fc4020b160abb0217c4dd015006a0031bc4e207b4126e2404c4fc01f5050e7802c4fa016227b91104c42a1a43172e1a08c4e00537214c1d06c4090c0d0cef0014c4c2026906070a17c4c603350afe0013c4e3018205ac0317c43e081f09f00017c4e901620c4d0d0dc4b00345077a0518c4b102e30009081dc4090041005e0000c43f0b030e670811c4c804fa0095080dc44c07d501600618c46b0c560ec3050cc42713800ba1080bc43e08c002ed0017c41b08dd012c081ac4c402ee00440719c4b8071d1644120ac40a07010849051fc4f902752e493c03c46a00ac00a40000c48904c402f7001bc45c14b309561508c41f183b15c90609c4b7033908130918c4f300d8018b041cc46d07aa040f0c13c48604d00150061ac4eb047f19611f05c4a10f7417182606c4470d790999070ec4fd004126e00605c4ae10651e342805c4920f2e1d3c1b07c49b06a206d6020fc4f8002807cc011cc4030e4a0a500912c47c0d41136b0e0ac4b94655aaf10e01c4210a4308a00416c45c1b83149b1006c4b507640fee010ac41d0c400aea0112c48304bb027f041ec45b068205ea0018c4d80294065a0a10c4cd01b5022e061fc4200abf03b40315c4410b7b07330c11c4490a7a07680812c44b2d1939861e04c43e091e0a7e0615c40718620f720e0ac4cc034b0d680b0dc49907ec0110120dc4440e8c08d0030dc4b306b006f9000cc4d42b1de2cf3001c4200de801180d11c4d4017505110918c4250d2b0df30010c41027c00a401f06c43119840f441708c48e038e0391031ec4b9231d71356502c4e603d205ad0a08c42c076f04d6011ec44406b5027c041bc4c4010508c4011ec452094609960513c4fa007a0534071ac40c28022a3c2006c4ad03010afb0019c40708bf0271041ec49b03d80181041cc4f0009c009e0000c4d5023709ae0315c42b08c502d5011ac468006500ab0000c40f07e300c0021fc4040f8e07cc0310c463349f20154e03c4ee00aa0305091bc4131a800e700f09c4bc08b109111d08c4190afb002c0a15c4b5031c0b140c13c4f200230ce20112c455062808140919c42a155610f3010ac4f8007100ec0000c4f40096077e080fc4a5035b0609091ac47c207722a91504c4a2047006f50015c4af082518c70609c45309c7028e0513c4330ab9036d0713c4a207840a620d0cc4f600a30379041dc4a70b3619c40708c49006020eb50411c43e1b5e17a90c07c45c052407a7031dc4ca02f100a4031ac4330cfb00ec0111c40510110fd6020fc441069103db011ec46a12c607910d08c44f3a5f35ca1103c40c004b00b10000c49e03e00142061dc4b905e50213120dc479862cd3b24d01c41fe0e91603fc01c41c383333153a04c4d0015a0511071ec43a080f0ac30218c46f063208990418c49a0444079c0418c48706c203bd0313c48b05a6047e0614c4dd01cc02060a18c45906b40249071ac4c902bf020f0a16c40a0bf800e10116c49e0800153f100cc44b0d2310400e0dc46505f900fe001ac4701c6b1d2f2905c4260c3b0b4a0a11c4b3069e088c0a0bc4a60b69129e0c08c4630f4113f2010ac444254b24033205c4a704ed01b30412c47c1060137e1008c4d001870478041dc4cb015f0585041ec43d009200620000c40055493c643303c46b07af03c60215c44a05240720071fc4700b81098e080dc4ef01c305b1070bc49500b300f80000c45b0a9106920610c4ea00a603d70118c442084f08350916c4e4012a091d0a16c47705e900280819c4a8092817770f09c4f401d9048d0e08c4190859050d081cc4df088d1cbb1104c404230e222e1d07c4b603c002750616c447076306b20319c4052358170d2207c43e0abe035d0813c47b0a9508c1040dc41be41be4609f01c46d49296bd81302c4580d980801150cc44a0867069e0416c4fb004a066a051dc47f04c002b4021dc41f075c05b8021dc4da1276440a7a02c4831fcb0d3b3104c45d10e9027c0d0ac415151a14c7050bc4405f2a6ad51502c44509c503080d13c422098405260917c46011740fe90209c4aa04300a290b13c44607060908091ac4c003400b5b0911c4570a170ef80010c46509500a990610c484041a0858051cc44d23b70e4b2405c46706aa03510718c47c0a2e11f1010cc4be20455d296b02c422093108400718c49c04a904c10215c47c062d0b550813c4bb03fc00510716c44606ed00d5011dc4f100a005290c11c4aa15f2038c1c04c41009270878051ac42237073e5a2904c4d902e0027b090ec46a3109529d2003c4bf03d102ac0411c40e12580ce5020dc44d3bdf0aea0703c4520c820806110ec429092109af0317c4d7041a168b0b0ac4310e430d2c0f0ec4bc025406b80219c44907ae03750518c43d0728084e061ac40613d403b4050dc4b007670dbd060bc4970ec907711407c4b108860d0e1a09c4d6025608a70414c4bf15f403503a03c440074d0636071bc4c702ed00520718c4ce092d2aa11205c4b724405f485b02c4db015207590618c4af0dd3070a2806c4f70092098d090cc45e05730476041dc4fa009000830000c4d714f704a32e02c4c208cf06361c07c42915fa00ed010ac44525701ceb0405c4f3005b06860419c49608760bf6000cc4fc00cc07801207c4ce034d0b340c10c43608ed00d60117c48d059c045e0716c49b063c0c9c0610c48c0b6d0ee2020ac43009d5029f0415c4f4017d0b800b0bc43a0ce601360c10c4b903fc009f0414c4f500310e330e0ec4de0186033c061fc4dc01290703081ec49d031d0702081fc43c0ae401890612c4351c0a23531807c48004a50366051ac45706400736071ac4b003e701c60217c44e0b9906750810c4ec00150b370915c4f100940345061fc463276027732304c48f163b27f10205c4ea03e105af0d06c4b309ee020b1e08c48e387843614f02c4ab07fb00510f0bc427078b04ae021cc46f10fd00950b09c4b703ab046a0713c42d117a0b9b080cc4cb054c13820d09c46a07fe00430914c4ad02b50283041ec4c43b3dc2956a01c442071e09eb0019c43c0625077e041dc49209f2019f080bc4d104f800680f0ac48b0488041e0919c46f106411461409c47d04d801ad031bc4e0074e2ce20704c46a12fa003d1808c49e301b72913702c4c602c602d0011cc4aa0c261fa50c07c4ad04460aa00511c44c193d1b142107c4e701190e370c10c4d50ae207532b04c4a204d401380916c4e601650ad9020fc4d40ab412602704c43b1ced029f0d07c4f50088047c041bc4560cb70512100ec426483344ae1b03c4a30beb02bc0808c4bc024307f2001ac4dc02500a660910c4061f9c0c0c1e08c44f088406320a14c466087607fd0012c40c098e040f0919c4690bc504e6010dc49a083011640c0cc49b050b0ea00511c4fe00af03230918c4410c670ab9040fc42b096106750617c4d8055418d10607c48504cd01b0031ac40508030826071ec49a32276c3d6102c4af020a087c041cc4071ff5017e1008c42c347422592904c40a0f3b0ca80510c4801f7622841e04c4f9007300190000c42e14b00703190ac4ee001a0ca90413c40809a4035d0619c4830b091646100bc4d5004600200000c46c93d8279b6401c496038d04cc011bc46904db0132061fc4421bca078d1007c464134717fd0008c446086a06cb0216c46e24e2075e2804c4e201a305370b11c488075e0a9d0610c46904ea00bd021fc4c5053114c1060ac4f300060db40412c45914dd04281a08c4093dc30fc60e04c491372f681b7202c43b185015c70708c42e089f04f70018c4c8025208080b15c4680a7709e3020ec40609f200c80219c4051bd005351609c4b90e0f30eb0405c47005fd0053061cc426090e0a790518c40a0bc602980415c45b0eb4064d100bc437061c0744061dc48e0e111d930d08c45e114814820d09c48a0df0019c0b09c495048205dd0118c451119a0a56100ac43c08aa03a40416c4b0025006a8031dc41d0e7f08260d10c4f5004209810614c47e06e501c50214c4fe00d507ce0806c4b4062d137c0b0bc41621271ef90007c4a70219075d051ec49f03380702091ac421115d0c92080dc4e3012c09b70316c4bf4000ff609f01c4fe00200829081ac4730425077a041ec4ad038305b40317c4330718080b081cc4bb06f900700d0bc460084b0a930612c434145c101f160ac44c0ea2072b110cc466065206650619c4630c2a1083090dc4b304d402190e10c4cb011408a7031cc4c103000eac0412c49a215f35942303c4060ff600740810c48a047c05ae0318c4f700a005810712c4d5069e0dc30807c49106e701850711c4c902190af50016c4bb44906fe11e01c43b119409a0080bc4090a81056a0618c4a40f39214a1e06c4ee00b902ac0319c42e0d430c82080fc4da016d05b10319c4320ab8034f0913c45105dc0198031ec403fc48b758a701c44d0672052e071bc4bc06f0017d0d0ac4a80234061f071ec4d2013b0670041fc474050d088e041bc41f097105630618c4956a23dc827d01c4f901192e891705c4ee012212c0050cc40209320783041cc4dd013a08480816c4f300ef00300a13c439062a07a0031dc45518fa000f2207c4c802b403280a15c42b0890041e0919c48b05050b5c0716c4b0028804c8021bc4d0027b06b30413c47506ef00ed0017c4840b8d0afa000bc42c09000bc00217c4ca041315e3020bc43116cc05dc0309c41c12560e7d0a0cc486058705880515c49c07560cd8020ec4af02ee00aa031bc4e502a209d4040ac4c004071009100fc41713cc04750b0cc449b605fae31c01c4df20649bd52a01c417e8d827778801c4ce013407cc011bc43c0bce02d00211c4c1036a07940514c4d6066619dc0506c4d602b203fa0014c48b0a740cb5060bc48e06fd00db0211c4e801070ee50111c43314b90706180ac4d001970315081bc425180a1b171909c4d60a422fec0404c445075c069e0319c49e03fd005e0619c4c904f201710a0dc477054d07380818c41f0ed5025a0b0fc455075b065f0618c44a0afd00240c11c49308c504d3030dc4f401141a531309c4a3004800280000c40b094107a3031bc4e5017a084e0b0fc4270c510a860711c479000c00f90000c407099e038f0419c46c0b1f11da020dc41609a103a50319c4f502252bb50e05c4ea01300eeb010ec47f12c308012407c4ab02670542061ec4ab15e706981904c40a005200970000c4810798060b0f10c406299d10de0506c4c7043c10da030cc4d5028a05fc0015c482067706a10414c4b7022c07e8001bc4e209bd166d3003c4b80efe009a1405c4f906e41b0ef101c41f10660a5d0b0ec4d501c3020d0b16c4ed0043068d041cc41f0dd4021a0d11c4222cee036a1d05c4e601fe00100b14c4d301120aeb0017c4501d1b26d70606c4da015d07130a16c4da0122090d0a17c4cf029405fa0015c4b402410662051ec41009b20226081ac4630770064e0816c43f11610eac070bc49308610c2a100dc48b0aa0082e130bc4da03ec018b0a0bc4471af601651607c4d701f700960515c435322c34c00f04c48a1d3a31841e04c438273a27562105c4c005051699090bc49a079b07d2030dc4a804390bcf0212c488117413261f07c48403af02b0021fc4310d540b5d0a0fc4130f8907390d0fc4dc03e502f7000ac4a5125f20e80405c4c206021946120ac4b8023907fa001cc44a0a7c07db0212c4020bd102680616c4030faf05b10410c49208c304d4030dc4b002e400ae021ec4e309ae1be40903c469103816a30a09c475064208b30317c43f08d501790518c4a40377049e031ec41122bc09162107c4fb00af0275051bc41d08c60266051ac406530752a71d03c459373344294703c4b2020c0925081ac405086a0408081ec4160a5207560717c4af02bd0255061bc4bd036606900516c43314f80023160ac40d0cea01690714c4d9027707740712c459072a09de0116c460073809f50016c48406050d890613c4460b280dc10310c46d08c403140d12c42a0b260b9a0513c4550ad2029f0610c4bc032509d10216c42b09ba03a10417c43a0df2002e0d0fc40c22ec02851107c48009d7038c080dc4083d103ba71604c47a0af201530d0dc43708d901540717c45007fc00730519c4bf03ed00540815c4f600aa03ca011cc4e6013c0b330c11c4d1011e07be021dc482064d084b0914c45910650fa3090ac48f03c102ae021dc40d09b502500719c47300be002e0000c416e9b44b31ce01c4a3045508f80013c4280c250c140d11c46007020b6d0616c4f2007c04e9001ec4ac05e102250e0fc4af0d441f312206c46a054406e9001dc4a0046e062e0917c4850f101de30308c4100c8306170c13c457089505680713c483061f0c3c0a12c41c38412f343204c4d207581b172606c429008800b40000c4012abe0aee0206c4ed011112620c0dc445078f04aa0319c43a0f13123e0e0dc4180a8c05010b17c46626083d143a04c44209070c000c14c42f68e50da62c02c44608e301130a17c4614fbb22346502c460055f057c041cc4a2046707430914c41b072c06fc001fc40b10d003bd040fc4f2012f10df020dc48c07490b150e10c4b2052e0e9f060ec4b207f800e4020bc416262025911206c4da04001c161909c4040b9205910515c4f200fb002c0f0ec4c604520e430f0cc45a0b0310530b0fc47d04d20177041cc4260f870898070ec43e067104c1021fc4220e1c0f8e070fc43e099c04620714c48904780473051cc4fe00bf0c681e05c4fe00070ad00217c43b131f16cd050ac4e7009500520000c4b54a9a65ac5301c49003d701cd011ec4415fae28d21602c4114fe309ef0503c47c0e9f0a790e09c42c0847071f0819c4e606c40e3b3104c4b0132e34343204c45606f900a2031bc48a05c202150b15c48109b805b1050ec42c07a702bd021ec4801f6027c20f04c415ea18e758a701c43a2748241e2d05c4fb00580f5a0f0bc4f600c2003c0000c4e7067921931b04c45b0ad802530a10c44f06b7025d061ac4240fdc02c3040ec44f11f8009b0a0ac42b0d3d0c390c10c4010c010cfd0014c46805920373041ec4de02ea015a0c0dc46b155118691507c440084308600617c4a507b90591090cc437065e05b8021dc4eb019405e40113c49a07300f25100dc46409140edc0210c4d90c9822104f03c485057706dc0116c4a40fee020a2806c43710590d7f0a0cc498089c082a110cc45d051d0792031dc47908fd00e10110c4e402a409a0090ac433077304ea001dc4a1043808b20317c41a26e204831406c4cc19823eb22602c4bf0c2c2a122f05c49806bf04150e10c49407560cc8030ec4211f6e142a1e07c42c08a4035f061ac4201bf101b20908c40f090809c10219c4f101ec02511309c41f70296b246d02c49703100851061bc47214321d381c07c4a80c431a761307c49005350a8b0514c40809e4012c071bc48917a112d60805c494073d0d06110ec4a405350b690812c4cf18f903d51502c42e11b206f9000cc47d080b0f4c0b10c4440fb6068a090cc4fb00401194090bc4425e2a6a575402c40516e602b4060bc4b2030a0b400915c4370c9d06b60410c49b032b07a4031cc4411f022acd0806c4c30076006b0000c4520ac003b80410c49a04d701770517c4e90b624e1d7102c40a11fd0083080ec457081c0bf30014c4381c2f1d421b07c4691ea013b10f05c47b04ee00cb011bc44009040c890514c48c0b780dcc050ac460137e10bf0808c42410e502600c0dc44f100c160a160bc4732e3f40553803c44f1d491e1e2506c40811ea013b0e0ec4af037c053e0817c40a1ed605761108c4a20a66115d1209c4300d7c0804100fc46c093f0c130e10c41a09d0017b0519c490126f18e80306c43c613465cc1902c4ea008403d4011fc461065607d20117c4df05b80baf0d06c4990b830d870d09c4951a9a19033f04c46426b911c10f04c42947c712463d03c49305b603240a15c4da03d20308140cc4860dda044b1409c4ea158e718f7001c4aa039703c7021bc4b605a806ee010dc4f300cb01a7021fc44e08b803730714c4738c3ec1d62901c4bd08d105eb0208c44a240b30c00c05c4bf02250811081bc4b404c9036d0811c48f168f16a61105c4a91c05538c2603c4490cbe045b0a0fc4fe006406f20019c46d065108c00315c4f200f400ec0110c4e201a405c70310c4e8019c08610d0cc4629d718e4fb001c4ab08da032b150ac4192eb60e641f05c4c50224094d0718c4500bad052e0d0fc43c0a7e06110c13c41808bd022f071cc4e002c705760c0bc40b160816a2080bc4f8006f0586041cc462076b06d70116c4a5061e0fd9020fc42e144412c6050ac4e201fd00f0001ac4bf03ae03860515c491063e0b170d11c4af0a031f151d08c48f0e7711021f08c4bf209a32664c02c4240af600f80015c49b03f40023071ec49a0c4916870f08c4f9009708bc050dc48d05170a5f0716c4e602ea0128130bc41a165910ec010ac456188910142107c42c06bf02d6011fc42b11810a8d090cc46908e001190d11c4d802b004c70311c4ac29296bec0902c4b702c702f80019c44b091e0b350a13c4322211272c2306c4a804cf025d0715c452076a06ea0017c4425e1077bf2002c492039e03ed001fc4421b950fbb0907c4cb01630511081bc4600ee602fb000bc401087304c7011fc46506ad039c0319c45a21711ce90405c459055a055f051cc4cc02a9031e0919c48b3abe20e60c02c4bb02d80135071bc465056605eb001ac426097206650617c4e51a06f9c33c01c47e40dd11505702c4d30431149d090ac425005200fe0000c47104f800f2001dc4843de30ef90302c4480fd2039a080cc482007400680000c44f19321d591707c49304b603b20318c4d304d0041c160ac4ee007c058b041ac4a106350d9c060fc41a132a11c1050cc4aa1ca31e752e03c4430edf0284090dc4d702640a4b0c0fc4ba04de028d080ec43e131417d7040ac47005050920081bc4bc0d741ba11205c4040a3308930417c4057d7445455d02c438313b31283504c46d07090c480913c43c30921b472e04c4122fa112a71105c4250f2f0e3d0d0ec46509f700320c10c4732ea01fc81203c4670bb605590c0dc4621a2224691906c46a08db020e0e11c4c8021d0806091bc4c102ce02560716c41c115d0c03130dc495043c08000a18c406236116bd0907c4ec00c103c90214c479081b0f650a0fc40c0cda01620714c47513b70a601607c40e084d068d031dc4ec01d502490a11c4dd019b03fc001fc49604a104f50016c4d603530e2b110cc4ab0afe00e50308c416006900ed0000c41f099804730518c40f0fc103a70510c40d090e090d091ac4010ea8044f0912c46807350a980514c4ba17ac1b623403c4360bf500c80312c4b102e00123071ec411ee26d93cc301c4af082b15630f0ac47806200b2d0a14c44d08e001520716c464166d14d60507c4b2021c07b6021fc4ec06ce105f3503c46005ac023e061ec44c23ed03671e05c44506e40033071cc4b9063312b8060bc4fb008c0304081ec4bb09a70c082307c404002f00fe0000c45615bb08fb0008c46e054b06b7021bc493129112741706c46007110b8e0515c4ad030e0ac00216c43e09d202730615c4d216087b0d7902c4170aa204a80316c43cc32ed1c73801c43112bf05730c0bc4040a56066b0519c4512b9c18ee0404c4920adc03ba060ac44617ad0a9d0c08c439137e0c820c0ac49806710902100fc47b043b0733071bc4ad035608be0315c43c08040ad00118c4160b9305c50214c44b12ac082b150ac4f700970394031bc40d50e807a61d03c48c033b062d071dc44c08ef00b10315c46807ba03d10214c46832513aa31e03c4970ea00d821107c4fb006807f40013c4e7016e065b0715c4000c210a140b15c4d20b821f422f04c4820dd804780f09c4e6043421e80306c4e302d8034c100bc4a4031609b70318c472097c08a4060fc488057705a80317c4d2015b060d0a18c4a20337071e081cc467135e14431708c4150bf9008a0515c4db01160a750616c43d08bb02330818c4ef006e08580911c4eb019b07270f0ec4030a29082f0818c48a75c63937c801c4e001260867051ac435149f09aa080ac41a098205180a17c4a403d401a5031bc4970ad4045c100ac41d0ef800b70410c436094908930416c43d0c460b4f0b10c4bc097a13ce0707c4030b7606720616c4f200360eed010ec45805fd00dd011dc477056806a80319c49a043b07140919c479051209920418c4a42dbe20545502c4ec00f90022071cc4c902c602350a14c4ec00da016e0714c4b502e2003b061fc4980e0523bb0907c4fc002d0fbc040ec46227aa15343204c4f000b9024b061dc462078706110b14c4a406c004ea010fc4070f420be70110c45c078a059d0417c4670b7f09750a0dc437073c07fb001ac4db018a054b0815c4ac53ac539b6401c4cf010f09bc0219c42c1e930f4e1907c42c07e300f4001dc42207bf02b1021cc41213ee01e5020cc42c08bd0283041ac45222a711b40f05c40631a312172e05c40d002900040000c48927e00a6d3003c4ac007000740000c4830d5912b80709c45339b718e30903c461074a08b50316c424243d20002a06c4ea01650a2f0d0fc431009a00240000c4f201710b8c090cc40914850a3d100cc408077f04be021fc4c41dbd210b7a02c4a90cc408381c07c4b708850d880d09c4f500dc020f0e11c47c0e870d511309c4e801031513130cc4ec0192075c0b0ec44b16c107471708c4c402f70013081bc403fcb24d39c601c40e0f340cb80410c411ee857a2dd201c459103314c4050ac4be08081ec40708c4d408cc0a9c1305c49d07de02e4010ec470003500850000c4030fd602710810c423096b06020a18c434006f00590000c4d22d8e71ad5201c49907550d9b070dc4690de20231120bc42f22e2045e1a06c4420e8609e1020dc4d302c602550814c46d094d0b350d0fc42f10660b99070dc4572acf0ccc0c04c45a29412f3f3004c4c104fc008b080ec436143214bb060ac49a0c74114e1608c4b704ee01250c11c4090ef500f00011c48d066308190c13c44e094809450913c4cf049d0913170ac4430f770b2d110cc49506f900080f10c438103311d1030cc45b052e06b5021ec4040b0c0b0f0b15c45c08a804330a14c4660b670b470e0dc4fe008c00190000c4c4037208bb0411c4cb02ba037b0613c4386370476f4802c43d08df01f10017c4e4011309440718c45f0a560afc0010c46c0e8b0b620f0ac499112e22641906c47f07a405c90311c4150ad102ed0016c4d101c002e1011bc4e1013f0750061ac42c13e80242110bc47f80cc3322dd01c41ee1ca35c93601c4a6049e04230a16c408137b0acb040dc45608a1042d0b13c4080a9004c00217c43710b4064e0e0cc4f4004807e60118c438c744bb798601c4c7054b109b090bc45c088d06c40313c4f501920ff60107c47d08a50603100fc46a128f0e431708c4f2009904d10215c41d38532b6c2404c44d236a1d881705c4560b680afa000fc44206880444061cc43e08080a710518c45f0c670baf060dc4c903b404940611c43d0a7b06d30213c4d101760539071bc4ab091a192e1709c4df029f06190e10c407f80af5da2501c4e5024a14301709c4a80e551cfd0006c44a0cc40395070fc441be5fa0649b01c4e718a95649b601c4f40086091a110dc42608a603630619c41c088d04bd021ac44bb4de21847b01c45e077506e90017c4160099005d0000c471055707690618c4e004eb02a30d07c42c0b460a550912c46c180e28431f06c48107480adf0111c4f1001a0787031fc475087108340b11c4d70178050d0919c47d82b64921de01c48e0303080a081dc4350be2011d0c12c420006400c40000c4050bdb018f0515c4280b5a09da0212c4a7092e17d60409c4600df4009d080cc455072f09b10317c4303319399c1804c45b06f500150918c4b8027805700518c42b07480671051cc4610d550eb1060cc45e35403f005503c4cc03f101590c0dc43d0b73089d0511c41d08e60032071bc42f07e6003e061cc4c812f603314403c4de0117078d031ec4e700dc0144071ac41708f20065051dc43306630569041fc4e500c401ce011ec4619eb04fee1101c44e088606df0114c41c4b443e184d03c47a04fe0069041fc4bb0224080d091ac40c289a10811506c4c50740170b1e08c4b20ff901811905c4e5019704c90215c4a01348245d2005c40b08cf0128071dc4470c100fc1040fc41513530ea3070cc49c03f700350819c480057605230918c4330cd302f70010c47205a203cd011bc4b1074c10a3080bc4940ae20211170ac4403f513a693203c4e6017e07d30211c4d90194059e0415c40907c8014b051fc4fb0045080f0b15c42f07ca01d5011bc4190a050a280917c40409d3017d041bc43d0b180de20111c4c93615ea02fd01c494117d159d1006c49d03da01ea001ac48c17cf09681e05c423162615ce040ac47509b905b3050ec4990722114e0d0dc40f306d1d5d2005c481096c0b3d0e0dc4a8031008a4031bc464059c0335071cc4390d780906100fc434149e09cb050ac4d605950de70308c4f8004006b7021dc4e7022811800a0cc4d1073921132706c4d9031917800c0ac40f08ed009c031bc4b503210b7e0613c492068607f10011c4b2047308550a10c4a2042409c80216c4500da90690080dc4020fa3058f0710c49e08e5021a140bc486048e04ea001ac40a0e3b0b6c0811c4fe00cd055a100ac493127816ed0306c4d5088c17981405c4490e9a07e3020dc49e092b15660f0ac42b07ad0362051bc49a0b840da60909c4fa00f4005f0716c4530fdc03c1050bc41a0c5c09000e12c48309df02d3030dc4540b470c94070fc417091c090d0a18c44f19c807122107c4930aa509f2010ac4e001a6051f0e10c49a03f100bb021cc4ae0dca08dd0506c45f0c460e690b0dc48a078a07640a0fc4b705a80688080ec4140c7e06a10413c416097c054d0719c4d9016e06820516c4dc01b803d60212c41107bb0262051fc4f3006109df0210c472148f101d2007c40354fd009f2003c4e406db09c30f04c4560bfd00e5010fc486071a0dbd0311c4341d940f611607c435082f08e20118c41c38c00fe30704c413132012eb010cc4990e8a10fa0007c415172b15810c0ac44b052c069a031fc44a090e0ca60414c45607c602110918c46e09d6023c0c10c4c1032b0a220b14c455069f03e0011bc4090ca2047a0713c490034506b9021dc4900386045d051cc4d5018e05ca0216c4c20ce704e80405c4160875057b041bc46806e800120918c4f9002a0b0d0d12c4430bb604870711c4d804281a171d08c4e60233120d160bc4a505f400ef0110c47c042e078a041bc48504030982041ac40f18b0077e0c0ac443060e08d9011bc42a0840073c0719c4f900ac06450f0cc4a82b614fa62c02c4bf0ca711941505c4e700c700630000c478095c0bb9050ec4b6024e0658051dc4b51263278d1c04c41717461240130ac42d0ad801b70315c49b64d22dcd3201c4e9006500c70000c4da02c603370b11c4480ed103f3000dc42907bd02f0001dc4d0017005790519c4a104bc03880613c4ce023d0a8e0513c47200d200bd0000c4b9115b29c60e04c4fa00880aad070bc4c902d701470816c41809d401850518c4276c9d31bd2102c46b12b209291a08c4e5012308d90119c4ef00ce0150061ac4cf01080740061fc4b90ee704083105c44f0d570cc5040dc4000af000d30119c4f80010083b071bc43e100315fe000cc45b0a490b060f10c4f3008d06da0212c47c0e9f0a131a09c4a711152e262b05c4103bdd081f3804c4ed063b41a21f03c4bd02090a750518c4d5040618d1040ac4cc0a5621222c05c4a7115a218d1605c41b0b4109850614c4450a150dbf0311c4fc00b40269051ac49b0bef01181909c458293233ec0404c4231b7411f50108c4010e8b06220d11c4230ad9017c0516c481044b06f7001bc41407d501e2001ec435ca2bd434cb01c4e701120f4b0c0fc425248a133c2006c468053107f6001ac4a45b06f9db2401c496099a09b1070bc40410a705520b0fc423124e0e35100cc40f095606120919c40c094107f40019c4090ae101010b17c4281a47171f1c08c405325023462505c41b08250789041cc463064108350817c47d04f300a0031bc4d1175654ca1a02c42709ad03a30416c476084f0ba40510c4670bb70523100dc4d3049209570f0bc40b0b220af00015c4ab088f0bce040ac4ad525ea16a9501c4fe006f48db1202c45608fc00820614c4fe00b3021b081bc46c1d182ee70405c42847ea07423f03c469005c001e0000c44514840d591209c4f800150b260a15c4e101070b9c0415c4956aa45be61901c4e900aa0221071fc4eb01070ed50211c48e10fb001d2007c4f200c402be0218c4ce00f800d90000c4cd05431225150ac45c0e6f0dd9030bc4b609ab0a221b08c42cd348b734cb01c4ab05f7008a0710c4010a3f076f0519c4b6086c10e40309c4f1000e0e970611c4ac005e00a40000c4e800020885031fc43312a60828130bc4ba06640e29130bc492030208df011ec492031c07a0031dc46e070d0c540913c45837483d503a03c4ce042f14eb020ac4e1005100640000c4a1127d1ae90405c4c306a40914170ac45609a005700712c41c0edf02fc0010c492087c0acc030dc4360d0510d0030fc4da029c06530b0fc4d70af103941a04c4a6006b00d80000c4f500590cd8030dc45708f000180c13c49a04c402a20318c4c205c305f8000cc4d901150809081dc4f400170b090c14c49203c00272041ec4fd001939732304c42f0b9d053e0a12c47805b502570619c4ae1b5738563803c4e60672237f200461010060006000c16102006000f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : [ + "" + ], + "gasLimit" : [ + "0x3b9aca00" + ], + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "to" : "0xbe7c43a580000000000000000000000000000001", + "value" : [ + "0x00" + ] + } + } +} \ No newline at end of file diff --git a/test/evmmax-precompiles/ntt.cpp b/test/evmmax-precompiles/ntt.cpp new file mode 100644 index 0000000000..5ef56a35fe --- /dev/null +++ b/test/evmmax-precompiles/ntt.cpp @@ -0,0 +1,408 @@ +#include "ntt.hpp" +#include +#include + +using namespace evmone::test; +using namespace intx; + +namespace +{ +const std::array psi_rev = {1, 1479, 4043, 7143, 5736, 4134, 1305, 722, 1646, 1212, + 6429, 9094, 3504, 8747, 9744, 8668, 4591, 6561, 5023, 6461, 10938, 4978, 6512, 8961, 11340, + 9664, 9650, 4821, 563, 9314, 2744, 3006, 1000, 4320, 12208, 3091, 9326, 4896, 2366, 9238, 11563, + 7678, 1853, 140, 1635, 9521, 11112, 4255, 7203, 10963, 9088, 9275, 790, 955, 11119, 2319, 9542, + 4846, 3135, 3712, 9995, 11227, 3553, 7484, 544, 5791, 11950, 2468, 11267, 9, 9447, 11809, 10616, + 8011, 7300, 6958, 1381, 2525, 4177, 8705, 2837, 5374, 4354, 130, 2396, 4452, 3296, 8340, 12171, + 9813, 2197, 5067, 11336, 3748, 5767, 827, 3284, 2881, 5092, 10200, 10276, 9000, 9048, 11560, + 10593, 10861, 334, 2426, 4632, 5755, 11029, 4388, 10530, 3707, 3694, 7110, 11934, 3382, 2548, + 8058, 4890, 6378, 9558, 3932, 5542, 12144, 3459, 3637, 1663, 1777, 1426, 7635, 2704, 5291, 7351, + 8653, 9140, 160, 12286, 7852, 2166, 8374, 7370, 12176, 3364, 10600, 9018, 4057, 2174, 7917, + 2847, 7875, 7094, 9509, 10805, 4895, 2305, 5042, 4053, 9644, 3985, 7384, 476, 3531, 420, 6730, + 2178, 1544, 9273, 243, 9289, 11618, 3136, 5191, 8889, 9890, 9103, 6882, 10163, 1630, 11136, + 2884, 8241, 10040, 3247, 9603, 2969, 3978, 6957, 3510, 9919, 9424, 7575, 8146, 1537, 12047, + 8585, 2678, 5019, 545, 7404, 1017, 10657, 7205, 10849, 8526, 3066, 12262, 11244, 2859, 2481, + 7277, 2912, 5698, 354, 7428, 390, 11516, 3778, 8456, 442, 2401, 5101, 11222, 4976, 10682, 875, + 3780, 7278, 11287, 5088, 4284, 6022, 9302, 2437, 3646, 10102, 9723, 6039, 9867, 11854, 7952, + 10911, 1912, 11796, 8193, 9908, 5444, 9041, 1207, 5277, 1168, 11885, 4645, 1065, 2143, 3957, + 2839, 10162, 151, 11858, 1579, 2505, 5906, 52, 3174, 1323, 2766, 3336, 6055, 6415, 677, 3445, + 7509, 4698, 5057, 12097, 10968, 10240, 4912, 5241, 9369, 3127, 4169, 3482, 787, 6821, 11279, + 12231, 241, 11286, 3532, 11404, 6008, 10333, 7280, 2844, 3438, 8077, 975, 5681, 8812, 142, 1105, + 4080, 421, 3602, 6221, 4624, 6212, 3263, 8689, 5886, 4782, 5594, 3029, 4213, 504, 605, 9987, + 2033, 8291, 10367, 8410, 11316, 11035, 10930, 5435, 3710, 6196, 6950, 5446, 8301, 468, 11973, + 11907, 6152, 4948, 11889, 10561, 6153, 6427, 3643, 5415, 56, 9090, 5206, 6760, 1702, 10302, + 11635, 3565, 5315, 8214, 7373, 4324, 10120, 11767, 5079, 3262, 11011, 2344, 6715, 1973, 5925, + 1018, 3514, 11248, 7500, 7822, 5537, 4749, 8500, 12142, 5456, 7840, 6844, 8429, 7753, 1050, + 6118, 3818, 9606, 1190, 5876, 2281, 2031, 5333, 8298, 8320, 12133, 2767, 453, 6381, 418, 3772, + 5429, 4774, 1293, 7552, 2361, 1843, 9259, 4115, 218, 2908, 8855, 8760, 2882, 10484, 1954, 2051, + 2447, 6147, 576, 3963, 1858, 7535, 3315, 11863, 2925, 347, 3757, 1975, 10596, 3009, 174, 11566, + 9551, 5868, 2655, 6554, 1512, 11939, 5383, 10474, 9087, 7796, 6920, 10232, 6374, 1483, 49, + 11026, 1489, 2500, 10706, 5942, 1404, 11964, 11143, 948, 4049, 3728, 1159, 5990, 652, 5766, + 6190, 11994, 4016, 4077, 2919, 3762, 6328, 7183, 10695, 1962, 7991, 8960, 12121, 9597, 7105, + 1200, 6122, 9734, 3956, 1360, 6119, 5297, 3054, 6803, 9166, 1747, 5919, 4433, 3834, 5257, 683, + 2459, 8633, 12225, 9786, 9341, 6507, 1566, 11454, 6224, 3570, 8049, 3150, 1319, 4046, 11580, + 1958, 7967, 2078, 1112, 11231, 8210, 11367, 441, 1826, 9363, 9118, 4489, 3708, 3238, 11153, + 3449, 7080, 1092, 3359, 3205, 8024, 8611, 10361, 11825, 2068, 10900, 4404, 346, 3163, 8257, + 7449, 6127, 12164, 11749, 10763, 4222, 8051, 11677, 8921, 8062, 7228, 11071, 11851, 3515, 9011, + 5993, 6877, 8080, 1536, 10568, 4103, 9860, 11572, 8700, 1373, 2982, 3448, 11946, 4538, 1908, + 4727, 11081, 1866, 7078, 10179, 716, 10125, 6873, 1705, 2450, 11475, 416, 10224, 5826, 7725, + 8794, 1756, 4145, 8755, 8328, 5063, 4176, 8524, 10771, 2461, 2275, 8022, 5653, 6693, 6302, + 11710, 3889, 212, 6323, 9175, 2769, 5734, 1176, 5508, 11014, 4860, 11164, 11158, 10844, 11841, + 1014, 7508, 7365, 10962, 3607, 5232, 8347, 12221, 10029, 7723, 5836, 3200, 1535, 9572, 60, 7784, + 10032, 10872, 5676, 3087, 6454, 7406, 3975, 7326, 8545, 2528, 3056, 5845, 5588, 11877, 5102, + 1255, 506, 10897, 5784, 9615, 2212, 3338, 9013, 1178, 9513, 6811, 8778, 10347, 3408, 1165, 2575, + 10453, 425, 11897, 10104, 377, 4578, 375, 1620, 1038, 11366, 6085, 4167, 6092, 2231, 2800, + 12096, 1522, 2151, 8946, 8170, 5002, 12269, 7681, 5163, 10545, 1314, 2894, 3654, 11951, 3947, + 9834, 6599, 7350, 7174, 1248, 2442, 8330, 6492, 6330, 10141, 5724, 10964, 1945, 1029, 8945, + 6691, 10397, 3624, 6825, 4906, 4670, 512, 7735, 11295, 9389, 12050, 1804, 1403, 6195, 7100, 406, + 10602, 7021, 12143, 8914, 9998, 7954, 3393, 8464, 8054, 7376, 8761, 11667, 1737, 4499, 5672, + 8307, 9342, 11653, 5609, 4605, 2689, 180, 8151, 5219, 1409, 204, 6780, 9806, 2054, 1344, 9247, + 463, 8882, 3981, 1468, 4475, 7043, 3017, 1236, 9168, 4705, 2600, 11232, 4739, 4251, 1226, 6771, + 11925, 2360, 3028, 5216, 11839, 10345, 11711, 5368, 11779, 7628, 2622, 6903, 8929, 7605, 7154, + 12226, 8481, 8619, 2373, 7302, 10891, 9199, 826, 5043, 5789, 8787, 6671, 10631, 9224, 1506, + 7806, 5703, 4719, 11538, 6389, 11379, 4693, 9951, 11872, 9996, 6138, 8820, 4443, 8871, 7186, + 10398, 1802, 10734, 1590, 4411, 1223, 2334, 2946, 6828, 2637, 4510, 881, 365, 10362, 1015, 7250, + 6742, 2485, 904, 24, 10918, 11009, 11675, 980, 11607, 5082, 7699, 5207, 8239, 844, 7087, 3221, + 8016, 8452, 2595, 5289, 6627, 567, 2941, 1406, 2633, 6940, 2945, 3232, 11996, 3769, 7434, 3944, + 8190, 6759, 5604, 11024, 9282, 10118, 8809, 9169, 6184, 6643, 6086, 8753, 5370, 8348, 8536, + 1282, 3572, 9457, 2021, 4730, 3229, 1706, 3929, 5054, 3154, 9004, 7929, 12282, 1936, 8566, + 11444, 11520, 5526, 50, 216, 767, 3805, 4153, 10076, 1279, 11424, 9617, 5170, 12100, 3116, + 10080, 1763, 3815, 1734, 1350, 5832, 8420, 4423, 1530, 1694, 10036, 10421, 9559, 5411, 4820, + 1160, 9195, 7771, 2840, 9811, 4194, 9270, 7315, 4565, 7211, 10506, 944, 7519, 7002, 8620, 7624, + 6883, 3020, 5673, 5410, 1251, 10499, 7014, 2035, 11249, 6164, 10407, 8176, 12217, 10447, 3840, + 2712, 4834, 2828, 4352, 1241, 4378, 3451, 4094, 3045, 5781, 9646, 11194, 7592, 8711, 8823, + 10588, 7785, 11511, 2626, 530, 10808, 9332, 9349, 2046, 8972, 9757, 8957, 12150, 3268, 3795, + 1849, 6513, 4523, 4301, 457, 8, 8835, 3758, 8071, 4390, 10013, 982, 2593, 879, 9687, 10388, + 11787, 7171, 6063, 8496, 8443, 1573, 5969, 4649, 9360, 6026, 1030, 11823, 10608, 8468, 11415, + 9988, 5650, 12119, 648, 12139, 2307, 8000, 11498, 9855, 9416, 2827, 9754, 11169, 21, 6481}; + +[[maybe_unused]] bytecode generate_internal_nttfw(size_t a_ptr, size_t at_ptr, uint8_t size, + uint8_t S_slot, uint8_t slot_range_first, [[maybe_unused]] uint8_t slot_range_last) +{ + assert(slot_range_first + 3 * size <= slot_range_last); + + bytecode res; + const uint8_t a_start_slot = slot_range_first; + res += storex(size, a_ptr, a_start_slot); + const uint8_t at_start_slot = a_start_slot + size; + res += storex(size, at_ptr, at_start_slot); + + const uint8_t V_slot_start = at_start_slot + size; + + // V := at * S + res += mulmodx(V_slot_start, 1, at_start_slot, 1, S_slot, 0, size); + + // at = a - V + res += submodx(at_start_slot, 1, a_start_slot, 1, V_slot_start, 1, size); + + // a = a + V + res += addmodx(a_start_slot, 1, a_start_slot, 1, V_slot_start, 1, size); + + res += loadx(size, a_start_slot, a_ptr); + res += loadx(size, at_start_slot, at_ptr); + + return res; +} + +bytecode generate_shuffle_bytecode(uint8_t input_slot_start, uint8_t output_slot_start, + uint8_t zero_slot, uint8_t window_size, uint8_t num_windows) +{ + bytecode res; + + for (uint8_t k = 0; k < window_size / 2; ++k) + { + res += addmodx(output_slot_start + 2 * k, window_size, input_slot_start + k, window_size, + zero_slot, 0, num_windows); + res += addmodx(output_slot_start + 2 * k + 1, window_size, + input_slot_start + (window_size / 2) + k, window_size, zero_slot, 0, num_windows); + } + + return res; +} + +bytecode generate_unshuffle_bytecode(uint8_t input_slot_start, uint8_t output_slot_start, + uint8_t zero_slot, uint8_t window_size, uint8_t num_windows) +{ + bytecode res; + + for (uint8_t k = 0; k < window_size / 2; ++k) + { + res += addmodx(output_slot_start + k, window_size, input_slot_start + 2 * k, window_size, + zero_slot, 0, num_windows); + res += addmodx(output_slot_start + (window_size / 2) + k, window_size, + input_slot_start + 2 * k + 1, window_size, zero_slot, 0, num_windows); + } + + return res; +} + +bytecode generate_spread_bytecode(uint8_t input_slot_start, uint8_t output_slot_start, + uint8_t zero_slot, uint8_t window_size, uint8_t num_windows) +{ + bytecode res; + + for (uint8_t k = 0; k < window_size; ++k) + { + res += addmodx( + output_slot_start + k, window_size, input_slot_start, 1, zero_slot, 0, num_windows); + } + + return res; +} + +[[maybe_unused]] bytecode log_evmmax(uint8_t start_slot, uint8_t num_slots, size_t free_mem_ptr) +{ + bytecode res; + res += loadx(num_slots, start_slot, free_mem_ptr); + res += log0(free_mem_ptr, num_slots * 2); + + return res; +} + +[[maybe_unused]] bytecode generate_internal_nttfw_small_t(size_t a_ptr, uint8_t slot_range_first, + [[maybe_unused]] uint8_t slot_range_last, size_t psi_rev_mem_ptr, uint8_t zero_slot, + uint8_t window_size) +{ + constexpr uint8_t MAX_BUCKET_SIZE = 64; + constexpr uint8_t VALUE_SIZE = 2; + const uint8_t num_windows = MAX_BUCKET_SIZE / window_size; + bytecode res; + + for (size_t j = 0; j < 512; j += MAX_BUCKET_SIZE) + { + // store input elements to [slot_range_first + 64, slot_range_first + 128) + const uint8_t a_tmp_slot_start = slot_range_first + MAX_BUCKET_SIZE; + res += storex(MAX_BUCKET_SIZE, a_ptr + VALUE_SIZE * j, a_tmp_slot_start); + + // shuffle input + const uint8_t a_slot_start = slot_range_first; + res += generate_shuffle_bytecode( + a_tmp_slot_start, a_slot_start, zero_slot, window_size, num_windows); + + // load psi + // reuse slots. tmp not needed any longer. + const uint8_t psi_rev_slot_start = a_tmp_slot_start + MAX_BUCKET_SIZE / 2; + res += storex(num_windows, + psi_rev_mem_ptr + (512 / window_size) * VALUE_SIZE + (j / window_size) * VALUE_SIZE, + psi_rev_slot_start); + + // spread psi + const uint8_t psi_rev_spreaded_slot_start = a_tmp_slot_start; + res += generate_spread_bytecode(psi_rev_slot_start, psi_rev_spreaded_slot_start, zero_slot, + window_size / 2, num_windows); + + // res += log_evmmax(psi_rev_spreaded_slot_start, 32, 10 * 1024); + // multiply V = at * S + const uint8_t V_slot_start = psi_rev_spreaded_slot_start + (window_size / 2) * num_windows; + res += mulmodx(V_slot_start, 1, a_slot_start + 1, 2, psi_rev_spreaded_slot_start, 1, + MAX_BUCKET_SIZE / 2); + + // at = a - V + res += submodx(a_slot_start + 1, 2, a_slot_start, 2, V_slot_start, 1, MAX_BUCKET_SIZE / 2); + + // a = a + V + res += addmodx(a_slot_start, 2, a_slot_start, 2, V_slot_start, 1, MAX_BUCKET_SIZE / 2); + + // unshuffle input + res += generate_unshuffle_bytecode( + a_slot_start, a_tmp_slot_start, zero_slot, window_size, num_windows); + + // res += log_evmmax(a_tmp_slot_start, 64, 10 * 1024); + + res += loadx(MAX_BUCKET_SIZE, a_tmp_slot_start, a_ptr + 2 * j); + } + + return res; +} + +bytecode generate_nttfw(size_t a_ptr, size_t size, uint8_t S_slot, size_t psi_rev_mem_ptr, + uint8_t slot_range_first, uint8_t slot_range_last) +{ + bytecode res; + size_t m = 1; + size_t t = size; + constexpr auto VALUE_SIZE = 2; + + while (m < size) + { + t = t >> 1; + + constexpr size_t max_bucket_size = 64; + if (t > 2) + { + // res += log0(a_ptr, 128); + for (size_t i = 0; i < m; i++) + { + res += storex(1, psi_rev_mem_ptr + (m + i) * 2, S_slot); + + size_t j1 = (i * t) << 1; + size_t j2 = j1 + t - 1; + + for (size_t j = j1; j < j2 + 1; j += max_bucket_size) + { + res += generate_internal_nttfw(a_ptr + j * VALUE_SIZE, + a_ptr + (t + j) * VALUE_SIZE, + static_cast(std::min(t, max_bucket_size)), S_slot, + slot_range_first, slot_range_last); + } + } + + // res += log0(a_ptr, 128); + } + else if (t == 2) // t == 2 Can be tested for t in a range [2, k]. + // It looks now that for t == 4 it's slower + { + // res += log0(a_ptr, 128); + // zero last slot + const uint8_t zero_slot = slot_range_last; + res += submodx(zero_slot, 0, zero_slot, 0, zero_slot, 0, 1); + + assert(2 * t <= std::numeric_limits::max()); + res += generate_internal_nttfw_small_t(a_ptr, slot_range_first, slot_range_last - 1, + psi_rev_mem_ptr, zero_slot, static_cast(2 * t)); + + // res += log0(a_ptr, 128); + } + else // t == 1 + { + // res += log0(a_ptr, 128); + for (size_t j = 0; j < 512; j += max_bucket_size) + { + // store `a` 64 elements + const uint8_t a_slot_start = slot_range_first; + res += storex(max_bucket_size, a_ptr + VALUE_SIZE * j, a_slot_start); + + // store S 32 elements + const uint8_t pri_res_slot_start = a_slot_start + max_bucket_size; + res += storex(max_bucket_size / 2, + psi_rev_mem_ptr + 256 * VALUE_SIZE + (j / 2) * VALUE_SIZE, pri_res_slot_start); + + // multiply V = at * S + const uint8_t V_slot_start = pri_res_slot_start + max_bucket_size / 2; + res += mulmodx(V_slot_start, 1, a_slot_start + 1, 2, pri_res_slot_start, 1, + max_bucket_size / 2); + + // at = a - V + res += submodx( + a_slot_start + 1, 2, a_slot_start, 2, V_slot_start, 1, max_bucket_size / 2); + + // a = a + V + res += + addmodx(a_slot_start, 2, a_slot_start, 2, V_slot_start, 1, max_bucket_size / 2); + + res += loadx(max_bucket_size, a_slot_start, a_ptr + 2 * j); + } + + // res += log0(a_ptr, 2 * 512); + } + + m = m << 1; + } + + res = res + OP_RETF; + + return res; +} +} // namespace + +bytecode create_shuffle_bytecode_test(size_t input_size, uint8_t window_size) +{ + bytecode res = {}; + + size_t mem_ptr = 0; + res += mstore8(mem_ptr, push(12289_u256 >> 8)); + res += mstore8(mem_ptr + 1, push(12289_u256)); + const size_t mod_ptr = mem_ptr; + res += setmodx(256, 14, mod_ptr); + mem_ptr += 2; + + const auto VALUE_SIZE = 2; + res += calldatacopy(mem_ptr, 0, input_size * VALUE_SIZE); + constexpr uint8_t zero_slot = 255; + res += submodx(zero_slot, 0, zero_slot, 0, zero_slot, 0, 1); + const size_t a_ptr = mem_ptr; + + res += storex(input_size, a_ptr, 0); + + res += generate_shuffle_bytecode(0, static_cast(input_size), zero_slot, window_size, + static_cast(input_size / window_size)); + + res += loadx(input_size, input_size, a_ptr); + + res += ret(a_ptr, input_size * VALUE_SIZE); + + return eof_bytecode(res, 3); +} + +bytecode create_spread_bytecode_test(size_t input_size, uint8_t window_size) +{ + bytecode res = {}; + + size_t mem_ptr = 0; + res += mstore8(mem_ptr, push(12289_u256 >> 8)); + res += mstore8(mem_ptr + 1, push(12289_u256)); + const size_t mod_ptr = mem_ptr; + res += setmodx(256, 14, mod_ptr); + mem_ptr += 2; + + const auto VALUE_SIZE = 2; + res += calldatacopy(mem_ptr, 0, input_size * VALUE_SIZE); + constexpr uint8_t zero_slot = 255; + res += submodx(zero_slot, 0, zero_slot, 0, zero_slot, 0, 1); + const size_t a_ptr = mem_ptr; + + res += storex(input_size, a_ptr, 0); + + res += generate_spread_bytecode(0, static_cast(input_size), zero_slot, window_size, + static_cast(input_size)); + + res += loadx(input_size * window_size, input_size, a_ptr); + + res += ret(a_ptr, input_size * window_size * VALUE_SIZE); + + return eof_bytecode(res, 3); +} + +bytecode create_nttfw_bytecode() +{ + // Create data section with psi values + bytecode data = {}; + data.resize(2 * psi_rev.size()); + + for (size_t i = 0; i < psi_rev.size(); ++i) + intx::be::unsafe::store(&data[i * 2], psi_rev[i]); + + bytecode res; + size_t mem_ptr = 0; + + // Store modulus + res += mstore8(mem_ptr, push(12289_u256 >> 8)); + res += mstore8(mem_ptr + 1, push(12289_u256)); + const size_t mod_ptr = mem_ptr; + res += setmodx(256, 14, mod_ptr); + mem_ptr += 2; + + uint8_t first_available_slot = 0; + const auto INPUT_SIZE = 512; + const auto VALUE_SIZE = 2; + // Load call data to evmmax registers + res += calldatacopy(mem_ptr, 0, INPUT_SIZE * VALUE_SIZE); + const size_t a_ptr = mem_ptr; + mem_ptr += INPUT_SIZE * VALUE_SIZE; + + res += datacopy(mem_ptr, 0, 2 * psi_rev.size()); + const auto psi_rev_mem_ptr = mem_ptr; + + res += callf(1); + + res += ret(a_ptr, INPUT_SIZE * VALUE_SIZE); + + auto container = eof_bytecode(res, 3); + + uint8_t S_slot = first_available_slot++; + + container.code( + generate_nttfw(a_ptr, INPUT_SIZE, S_slot, psi_rev_mem_ptr, first_available_slot, 255), 0, 0, + 3); + + return container.data(data); +} diff --git a/test/evmmax-precompiles/ntt.hpp b/test/evmmax-precompiles/ntt.hpp new file mode 100644 index 0000000000..97971b369c --- /dev/null +++ b/test/evmmax-precompiles/ntt.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include + +evmone::test::bytecode create_nttfw_bytecode(); +evmone::test::bytecode create_shuffle_bytecode_test(size_t input_size, uint8_t window_size); +evmone::test::bytecode create_spread_bytecode_test(size_t input_size, uint8_t window_size); diff --git a/test/evmmax-precompiles/nttfw.json b/test/evmmax-precompiles/nttfw.json new file mode 100644 index 0000000000..7398e842df --- /dev/null +++ b/test/evmmax-precompiles/nttfw.json @@ -0,0 +1,73 @@ +{ + "nttfw" : { + "_info" : { + "comment" : "", + "filling-rpc-server" : "evm version 1.10.25-stable-69568c55", + "filling-tool-version" : "retesteth-0.2.2-testinfo+commit.766b4629.Linux.g++", + "generatedTestHash" : "682d204267cf3a3909bf22c063f2c9cde06a917d56f3666bad7ff4c724b3676b", + "labels" : { + "0" : "empty" + }, + "lllcversion" : "Error getting LLLC Version", + "solidity" : "Error getting solc Version", + "source" : "tmp/micro/jump_aroundFiller.yml", + "sourceHash" : "cadfd8a7ee22cbefac3a420cc4c762ca1a3a38ae3346407bd31694acff16c78e" + }, + "env" : { + "currentBaseFee" : "0x01", + "currentCoinbase" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "0x01", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x01", + "currentRandom" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "currentTimestamp" : "0x61a8d289", + "previousHash" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "post" : { + "Experimental" : [ + { + "hash" : "0x51a20eb8dbdec5af48eeecca9e38acb6006fe28733f8649500092464fe6a6364", + "indexes" : { + "data" : 0, + "gas" : 0, + "value" : 0 + }, + "logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "txbytes" : "0xf8618001843b9aca0094be7c43a58000000000000000000000000000000180801ca0999ee855b1d5325fe79efbc40ad560f9ebabbbb97e72e1a4e9cf7e4b8ba34765a06392df208ed06b901f2997995c138bfa06ae8b1a26c15e8aff52cad68f913e85" + } + ] + }, + "pre" : { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x3b9aca00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "0xbe7c43a580000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "ef0001010008020002006a25d50408000000800003000000037f00000000000000000000000000000000000000000000000000000000000000306000537f0000000000000000000000000000000000000000000000000000000000003001600153610100600e6000c061040060006002376108006000610402d3e300016104006002f360016104046000c2604060026001c260406102026041c2c581014101000040c441010101810140c301010101810140604060016002c160406041610202c1604060826001c260406102826041c2c581014101000040c441010101810140c301010101810140604060016082c160406041610282c160406101026001c260406103026041c2c581014101000040c441010101810140c30101010181014060406001610102c160406041610302c160406101826001c260406103826041c2c581014101000040c441010101810140c30101010181014060406001610182c160406041610382c160016104066000c2604060026001c260406101026041c2c581014101000040c441010101810140c301010101810140604060016002c160406041610102c1604060826001c260406101826041c2c581014101000040c441010101810140c301010101810140604060016082c160406041610182c160016104086000c260406102026001c260406103026041c2c581014101000040c441010101810140c30101010181014060406001610202c160406041610302c160406102826001c260406103826041c2c581014101000040c441010101810140c30101010181014060406001610282c160406041610382c1600161040a6000c2604060026001c2604060826041c2c581014101000040c441010101810140c301010101810140604060016002c1604060416082c1600161040c6000c260406101026001c260406101826041c2c581014101000040c441010101810140c30101010181014060406001610102c160406041610182c1600161040e6000c260406102026001c260406102826041c2c581014101000040c441010101810140c30101010181014060406001610202c160406041610282c160016104106000c260406103026001c260406103826041c2c581014101000040c441010101810140c30101010181014060406001610302c160406041610382c160016104126000c2602060026001c2602060426021c2c541012101000020c421010101410120c301010101410120602060016002c1602060216042c160016104146000c2602060826001c2602060c26021c2c541012101000020c421010101410120c301010101410120602060016082c16020602160c2c160016104166000c260206101026001c260206101426021c2c541012101000020c421010101410120c30101010141012060206001610102c160206021610142c160016104186000c260206101826001c260206101c26021c2c541012101000020c421010101410120c30101010141012060206001610182c1602060216101c2c1600161041a6000c260206102026001c260206102426021c2c541012101000020c421010101410120c30101010141012060206001610202c160206021610242c1600161041c6000c260206102826001c260206102c26021c2c541012101000020c421010101410120c30101010141012060206001610282c1602060216102c2c1600161041e6000c260206103026001c260206103426021c2c541012101000020c421010101410120c30101010141012060206001610302c160206021610342c160016104206000c260206103826001c260206103c26021c2c541012101000020c421010101410120c30101010141012060206001610382c1602060216103c2c160016104226000c2601060026001c2601060226011c2c521011101000010c411010101210110c301010101210110601060016002c1601060116022c160016104246000c2601060426001c2601060626011c2c521011101000010c411010101210110c301010101210110601060016042c1601060116062c160016104266000c2601060826001c2601060a26011c2c521011101000010c411010101210110c301010101210110601060016082c16010601160a2c160016104286000c2601060c26001c2601060e26011c2c521011101000010c411010101210110c3010101012101106010600160c2c16010601160e2c1600161042a6000c260106101026001c260106101226011c2c521011101000010c411010101210110c30101010121011060106001610102c160106011610122c1600161042c6000c260106101426001c260106101626011c2c521011101000010c411010101210110c30101010121011060106001610142c160106011610162c1600161042e6000c260106101826001c260106101a26011c2c521011101000010c411010101210110c30101010121011060106001610182c1601060116101a2c160016104306000c260106101c26001c260106101e26011c2c521011101000010c411010101210110c301010101210110601060016101c2c1601060116101e2c160016104326000c260106102026001c260106102226011c2c521011101000010c411010101210110c30101010121011060106001610202c160106011610222c160016104346000c260106102426001c260106102626011c2c521011101000010c411010101210110c30101010121011060106001610242c160106011610262c160016104366000c260106102826001c260106102a26011c2c521011101000010c411010101210110c30101010121011060106001610282c1601060116102a2c160016104386000c260106102c26001c260106102e26011c2c521011101000010c411010101210110c301010101210110601060016102c2c1601060116102e2c1600161043a6000c260106103026001c260106103226011c2c521011101000010c411010101210110c30101010121011060106001610302c160106011610322c1600161043c6000c260106103426001c260106103626011c2c521011101000010c411010101210110c30101010121011060106001610342c160106011610362c1600161043e6000c260106103826001c260106103a26011c2c521011101000010c411010101210110c30101010121011060106001610382c1601060116103a2c160016104406000c260106103c26001c260106103e26011c2c521011101000010c411010101210110c301010101210110601060016103c2c1601060116103e2c160016104426000c2600860026001c2600860126009c2c511010901000008c409010101110108c301010101110108600860016002c1600860096012c160016104446000c2600860226001c2600860326009c2c511010901000008c409010101110108c301010101110108600860016022c1600860096032c160016104466000c2600860426001c2600860526009c2c511010901000008c409010101110108c301010101110108600860016042c1600860096052c160016104486000c2600860626001c2600860726009c2c511010901000008c409010101110108c301010101110108600860016062c1600860096072c1600161044a6000c2600860826001c2600860926009c2c511010901000008c409010101110108c301010101110108600860016082c1600860096092c1600161044c6000c2600860a26001c2600860b26009c2c511010901000008c409010101110108c3010101011101086008600160a2c16008600960b2c1600161044e6000c2600860c26001c2600860d26009c2c511010901000008c409010101110108c3010101011101086008600160c2c16008600960d2c160016104506000c2600860e26001c2600860f26009c2c511010901000008c409010101110108c3010101011101086008600160e2c16008600960f2c160016104526000c260086101026001c260086101126009c2c511010901000008c409010101110108c30101010111010860086001610102c160086009610112c160016104546000c260086101226001c260086101326009c2c511010901000008c409010101110108c30101010111010860086001610122c160086009610132c160016104566000c260086101426001c260086101526009c2c511010901000008c409010101110108c30101010111010860086001610142c160086009610152c160016104586000c260086101626001c260086101726009c2c511010901000008c409010101110108c30101010111010860086001610162c160086009610172c1600161045a6000c260086101826001c260086101926009c2c511010901000008c409010101110108c30101010111010860086001610182c160086009610192c1600161045c6000c260086101a26001c260086101b26009c2c511010901000008c409010101110108c301010101110108600860016101a2c1600860096101b2c1600161045e6000c260086101c26001c260086101d26009c2c511010901000008c409010101110108c301010101110108600860016101c2c1600860096101d2c160016104606000c260086101e26001c260086101f26009c2c511010901000008c409010101110108c301010101110108600860016101e2c1600860096101f2c160016104626000c260086102026001c260086102126009c2c511010901000008c409010101110108c30101010111010860086001610202c160086009610212c160016104646000c260086102226001c260086102326009c2c511010901000008c409010101110108c30101010111010860086001610222c160086009610232c160016104666000c260086102426001c260086102526009c2c511010901000008c409010101110108c30101010111010860086001610242c160086009610252c160016104686000c260086102626001c260086102726009c2c511010901000008c409010101110108c30101010111010860086001610262c160086009610272c1600161046a6000c260086102826001c260086102926009c2c511010901000008c409010101110108c30101010111010860086001610282c160086009610292c1600161046c6000c260086102a26001c260086102b26009c2c511010901000008c409010101110108c301010101110108600860016102a2c1600860096102b2c1600161046e6000c260086102c26001c260086102d26009c2c511010901000008c409010101110108c301010101110108600860016102c2c1600860096102d2c160016104706000c260086102e26001c260086102f26009c2c511010901000008c409010101110108c301010101110108600860016102e2c1600860096102f2c160016104726000c260086103026001c260086103126009c2c511010901000008c409010101110108c30101010111010860086001610302c160086009610312c160016104746000c260086103226001c260086103326009c2c511010901000008c409010101110108c30101010111010860086001610322c160086009610332c160016104766000c260086103426001c260086103526009c2c511010901000008c409010101110108c30101010111010860086001610342c160086009610352c160016104786000c260086103626001c260086103726009c2c511010901000008c409010101110108c30101010111010860086001610362c160086009610372c1600161047a6000c260086103826001c260086103926009c2c511010901000008c409010101110108c30101010111010860086001610382c160086009610392c1600161047c6000c260086103a26001c260086103b26009c2c511010901000008c409010101110108c301010101110108600860016103a2c1600860096103b2c1600161047e6000c260086103c26001c260086103d26009c2c511010901000008c409010101110108c301010101110108600860016103c2c1600860096103d2c160016104806000c260086103e26001c260086103f26009c2c511010901000008c409010101110108c301010101110108600860016103e2c1600860096103f2c160016104826000c2600460026001c26004600a6005c2c509010501000004c405010101090104c301010101090104600460016002c160046005600ac160016104846000c2600460126001c26004601a6005c2c509010501000004c405010101090104c301010101090104600460016012c160046005601ac160016104866000c2600460226001c26004602a6005c2c509010501000004c405010101090104c301010101090104600460016022c160046005602ac160016104886000c2600460326001c26004603a6005c2c509010501000004c405010101090104c301010101090104600460016032c160046005603ac1600161048a6000c2600460426001c26004604a6005c2c509010501000004c405010101090104c301010101090104600460016042c160046005604ac1600161048c6000c2600460526001c26004605a6005c2c509010501000004c405010101090104c301010101090104600460016052c160046005605ac1600161048e6000c2600460626001c26004606a6005c2c509010501000004c405010101090104c301010101090104600460016062c160046005606ac160016104906000c2600460726001c26004607a6005c2c509010501000004c405010101090104c301010101090104600460016072c160046005607ac160016104926000c2600460826001c26004608a6005c2c509010501000004c405010101090104c301010101090104600460016082c160046005608ac160016104946000c2600460926001c26004609a6005c2c509010501000004c405010101090104c301010101090104600460016092c160046005609ac160016104966000c2600460a26001c2600460aa6005c2c509010501000004c405010101090104c3010101010901046004600160a2c16004600560aac160016104986000c2600460b26001c2600460ba6005c2c509010501000004c405010101090104c3010101010901046004600160b2c16004600560bac1600161049a6000c2600460c26001c2600460ca6005c2c509010501000004c405010101090104c3010101010901046004600160c2c16004600560cac1600161049c6000c2600460d26001c2600460da6005c2c509010501000004c405010101090104c3010101010901046004600160d2c16004600560dac1600161049e6000c2600460e26001c2600460ea6005c2c509010501000004c405010101090104c3010101010901046004600160e2c16004600560eac160016104a06000c2600460f26001c2600460fa6005c2c509010501000004c405010101090104c3010101010901046004600160f2c16004600560fac160016104a26000c260046101026001c2600461010a6005c2c509010501000004c405010101090104c30101010109010460046001610102c16004600561010ac160016104a46000c260046101126001c2600461011a6005c2c509010501000004c405010101090104c30101010109010460046001610112c16004600561011ac160016104a66000c260046101226001c2600461012a6005c2c509010501000004c405010101090104c30101010109010460046001610122c16004600561012ac160016104a86000c260046101326001c2600461013a6005c2c509010501000004c405010101090104c30101010109010460046001610132c16004600561013ac160016104aa6000c260046101426001c2600461014a6005c2c509010501000004c405010101090104c30101010109010460046001610142c16004600561014ac160016104ac6000c260046101526001c2600461015a6005c2c509010501000004c405010101090104c30101010109010460046001610152c16004600561015ac160016104ae6000c260046101626001c2600461016a6005c2c509010501000004c405010101090104c30101010109010460046001610162c16004600561016ac160016104b06000c260046101726001c2600461017a6005c2c509010501000004c405010101090104c30101010109010460046001610172c16004600561017ac160016104b26000c260046101826001c2600461018a6005c2c509010501000004c405010101090104c30101010109010460046001610182c16004600561018ac160016104b46000c260046101926001c2600461019a6005c2c509010501000004c405010101090104c30101010109010460046001610192c16004600561019ac160016104b66000c260046101a26001c260046101aa6005c2c509010501000004c405010101090104c301010101090104600460016101a2c1600460056101aac160016104b86000c260046101b26001c260046101ba6005c2c509010501000004c405010101090104c301010101090104600460016101b2c1600460056101bac160016104ba6000c260046101c26001c260046101ca6005c2c509010501000004c405010101090104c301010101090104600460016101c2c1600460056101cac160016104bc6000c260046101d26001c260046101da6005c2c509010501000004c405010101090104c301010101090104600460016101d2c1600460056101dac160016104be6000c260046101e26001c260046101ea6005c2c509010501000004c405010101090104c301010101090104600460016101e2c1600460056101eac160016104c06000c260046101f26001c260046101fa6005c2c509010501000004c405010101090104c301010101090104600460016101f2c1600460056101fac160016104c26000c260046102026001c2600461020a6005c2c509010501000004c405010101090104c30101010109010460046001610202c16004600561020ac160016104c46000c260046102126001c2600461021a6005c2c509010501000004c405010101090104c30101010109010460046001610212c16004600561021ac160016104c66000c260046102226001c2600461022a6005c2c509010501000004c405010101090104c30101010109010460046001610222c16004600561022ac160016104c86000c260046102326001c2600461023a6005c2c509010501000004c405010101090104c30101010109010460046001610232c16004600561023ac160016104ca6000c260046102426001c2600461024a6005c2c509010501000004c405010101090104c30101010109010460046001610242c16004600561024ac160016104cc6000c260046102526001c2600461025a6005c2c509010501000004c405010101090104c30101010109010460046001610252c16004600561025ac160016104ce6000c260046102626001c2600461026a6005c2c509010501000004c405010101090104c30101010109010460046001610262c16004600561026ac160016104d06000c260046102726001c2600461027a6005c2c509010501000004c405010101090104c30101010109010460046001610272c16004600561027ac160016104d26000c260046102826001c2600461028a6005c2c509010501000004c405010101090104c30101010109010460046001610282c16004600561028ac160016104d46000c260046102926001c2600461029a6005c2c509010501000004c405010101090104c30101010109010460046001610292c16004600561029ac160016104d66000c260046102a26001c260046102aa6005c2c509010501000004c405010101090104c301010101090104600460016102a2c1600460056102aac160016104d86000c260046102b26001c260046102ba6005c2c509010501000004c405010101090104c301010101090104600460016102b2c1600460056102bac160016104da6000c260046102c26001c260046102ca6005c2c509010501000004c405010101090104c301010101090104600460016102c2c1600460056102cac160016104dc6000c260046102d26001c260046102da6005c2c509010501000004c405010101090104c301010101090104600460016102d2c1600460056102dac160016104de6000c260046102e26001c260046102ea6005c2c509010501000004c405010101090104c301010101090104600460016102e2c1600460056102eac160016104e06000c260046102f26001c260046102fa6005c2c509010501000004c405010101090104c301010101090104600460016102f2c1600460056102fac160016104e26000c260046103026001c2600461030a6005c2c509010501000004c405010101090104c30101010109010460046001610302c16004600561030ac160016104e46000c260046103126001c2600461031a6005c2c509010501000004c405010101090104c30101010109010460046001610312c16004600561031ac160016104e66000c260046103226001c2600461032a6005c2c509010501000004c405010101090104c30101010109010460046001610322c16004600561032ac160016104e86000c260046103326001c2600461033a6005c2c509010501000004c405010101090104c30101010109010460046001610332c16004600561033ac160016104ea6000c260046103426001c2600461034a6005c2c509010501000004c405010101090104c30101010109010460046001610342c16004600561034ac160016104ec6000c260046103526001c2600461035a6005c2c509010501000004c405010101090104c30101010109010460046001610352c16004600561035ac160016104ee6000c260046103626001c2600461036a6005c2c509010501000004c405010101090104c30101010109010460046001610362c16004600561036ac160016104f06000c260046103726001c2600461037a6005c2c509010501000004c405010101090104c30101010109010460046001610372c16004600561037ac160016104f26000c260046103826001c2600461038a6005c2c509010501000004c405010101090104c30101010109010460046001610382c16004600561038ac160016104f46000c260046103926001c2600461039a6005c2c509010501000004c405010101090104c30101010109010460046001610392c16004600561039ac160016104f66000c260046103a26001c260046103aa6005c2c509010501000004c405010101090104c301010101090104600460016103a2c1600460056103aac160016104f86000c260046103b26001c260046103ba6005c2c509010501000004c405010101090104c301010101090104600460016103b2c1600460056103bac160016104fa6000c260046103c26001c260046103ca6005c2c509010501000004c405010101090104c301010101090104600460016103c2c1600460056103cac160016104fc6000c260046103d26001c260046103da6005c2c509010501000004c405010101090104c301010101090104600460016103d2c1600460056103dac160016104fe6000c260046103e26001c260046103ea6005c2c509010501000004c405010101090104c301010101090104600460016103e2c1600460056103eac160016105006000c260046103f26001c260046103fa6005c2c509010501000004c405010101090104c301010101090104600460016103f2c1600460056103fac1c4ff00ff00ff0001604060026041c2c301044104ff0010c302044304ff0010c303044204ff0010c304044404ff001060106105026061c2c341026101ff0010c342026101ff0010c561010202410120c402020102610120c301020102610120c341040104ff0010c343040204ff0010c342040304ff0010c344040404ff0010604060416002c1604060826041c2c301044104ff0010c302044304ff0010c303044204ff0010c304044404ff001060106105226061c2c341026101ff0010c342026101ff0010c561010202410120c402020102610120c301020102610120c341040104ff0010c343040204ff0010c342040304ff0010c344040404ff0010604060416082c160406101026041c2c301044104ff0010c302044304ff0010c303044204ff0010c304044404ff001060106105426061c2c341026101ff0010c342026101ff0010c561010202410120c402020102610120c301020102610120c341040104ff0010c343040204ff0010c342040304ff0010c344040404ff001060406041610102c160406101826041c2c301044104ff0010c302044304ff0010c303044204ff0010c304044404ff001060106105626061c2c341026101ff0010c342026101ff0010c561010202410120c402020102610120c301020102610120c341040104ff0010c343040204ff0010c342040304ff0010c344040404ff001060406041610182c160406102026041c2c301044104ff0010c302044304ff0010c303044204ff0010c304044404ff001060106105826061c2c341026101ff0010c342026101ff0010c561010202410120c402020102610120c301020102610120c341040104ff0010c343040204ff0010c342040304ff0010c344040404ff001060406041610202c160406102826041c2c301044104ff0010c302044304ff0010c303044204ff0010c304044404ff001060106105a26061c2c341026101ff0010c342026101ff0010c561010202410120c402020102610120c301020102610120c341040104ff0010c343040204ff0010c342040304ff0010c344040404ff001060406041610282c160406103026041c2c301044104ff0010c302044304ff0010c303044204ff0010c304044404ff001060106105c26061c2c341026101ff0010c342026101ff0010c561010202410120c402020102610120c301020102610120c341040104ff0010c343040204ff0010c342040304ff0010c344040404ff001060406041610302c160406103826041c2c301044104ff0010c302044304ff0010c303044204ff0010c304044404ff001060106105e26061c2c341026101ff0010c342026101ff0010c561010202410120c402020102610120c301020102610120c341040104ff0010c343040204ff0010c342040304ff0010c344040404ff001060406041610382c1604060026001c260206106026041c2c561010202410120c402020102610120c301020102610120604060016002c1604060826001c260206106426041c2c561010202410120c402020102610120c301020102610120604060016082c160406101026001c260206106826041c2c561010202410120c402020102610120c30102010261012060406001610102c160406101826001c260206106c26041c2c561010202410120c402020102610120c30102010261012060406001610182c160406102026001c260206107026041c2c561010202410120c402020102610120c30102010261012060406001610202c160406102826001c260206107426041c2c561010202410120c402020102610120c30102010261012060406001610282c160406103026001c260206107826041c2c561010202410120c402020102610120c30102010261012060406001610302c160406103826001c260206107c26041c2c561010202410120c402020102610120c30102010261012060406001610382c1e4000105c70fcb1be716681026051902d2066e04bc191d23860db0222b261021dc11ef19a1139f193d2aba1372197023012c4c25c025b212d5023324620ab80bbe03e810e02fb00c13246e1320093e24162d2b1dfe073d008c066325312b68109f1c232ad32380243b031603bb2b6f090f254612ee0c3f0e80270b2bdb0de11d3c0220169f2eae09a42c03000924e72e2129781f4b1c841b2e056509dd105122010b1514fe11020082095c11640ce020942f8b2655089513cb2c480ea41687033b0cd40b4113e427d82824232823582d2829612a6d014e097a1218167b2b15112429220e7b0e6e1bc62e9e0d3609f41f7a131a18ea25560f5c15a62f700d830e35067f06f105921dd30a9014ab1cb721cd23b400a02ffe1eac087620b61cca2f900d242968233a0fd9087e1eed0b1f1ec31bb625252a35131f090113b20fd525ac0f911cd801dc0dcb01a41a4a08820608243900f324492d620c40144722b926a2238f1ae227b3065e2b800b44203127380caf25830b990f8a1b2d0db626bf24d01d971fd206012f0f21890a76139b02211cec03f929a11c252a61214e0bfa2fe62bec0b2b09b11c6d0b60164201621d0401862cfc0ec2210801ba096113ed2bd6137029ba036b0ec41c6e2c1713e010bc1786245609850e3e277625fb1797268b2e4e1f102a9f07782e14200126b41544235104b7149d04902e6d12250429085f0f750b1727b200972e52062b09c9171200340c66052b0ace0d0817a7190f02a50d751d55125a13c12f412ad828001330147924990c3710490d9a03131aa52c0f2fc700f12c160dcc2c8c1778285d1c700b1c0d6e1f8d03cf1631226c008e04510ff001a50e12184d121018440cbf21f116fe12ae15da0bd5107501f8025d270307f12063287f20da2c342b1b2ab2153b0e7e18341b261546206d01d42ec52e83180813542e7129411809191b0e3b15270038238214561a6806a6283e2d730ded14c320161ccd10e427882df713d70cbe2b0309281a3b07b5172503fa0dba2bf01d4c1e8e15a1128d21342f6e15501ea01abc20ed1e49041a17e60eea258604a616f408e907ef14d5206a20802f650acf01c518ed01a20ebc153512a6050d1d8009390733242b101300da0b5c229722380b4228f407a20803098f180302400f7b07421d6f0cf32e570b6d015b0ead07b729640bc100ae2d2e254f16ec0a5f199a05e82ea3150728ea237f1e741b0827f818e605cb00312b1205d109c429d21736057c2ebc2b8703b40fd10e9004871766028c1686182e2eda0fb00fed0b670eb218b81c0f29c707aa1f3723002f59257d1bc104b017ea26060f74055017e714b10bee1a9323ce06d3171f11510efa148902ab099b21b92fc1263a247d196b061e2cbe18500df21f710c4e05270fce2d3c07a61f1f081e04582bdf20122c6701b907222493239e11890e7c0ca62b910d791ba804440d1f0c851f5821a328792e3108142a941134015a0c5b20411d1917ef2f842de52a0b107e1f732d9d22d91f7e1c3c2b3f2e4b0dbb233317691add1f9006002948100726842d3421fc055d0ba60d782eaa11ba077412772b49074a1ba627c302cc278d1ad906a909922cd301a027f016c21e2d225a06dc10312233208813c71050214c2a13099d08e31f5616151a25189e2dbe0f3100d418b323d70ad11666049815842b0612fc2b9c2b962a5c2e4103f61d541cc52ad20e171470209b2fbd272d1e2b16cc0c8005ff2564003c1e6827302a78162c0c0f19361cee0f871c9e216109e00bf016d515d42e6513ee04e701fa2a911698258f08a40d0a2335049a25291a9b224a286b0d50048d0a0f28d501a92e792778017911e201770654040e2c6617c5104717cc08b70af02f4005f2086722f21fea138a2fed1e01142b293105220b4e0e462eaf0f6b266a19c71cb61c0604e0098a208a195c18ba279d165c2ad40799040522f11a23289d0e281aa9132a123e02001e372c1f24ad2f12070c057b18331bbc0196296a1b6d2f6f22d2270e1f120d4121101f761cd022392d9306c9119316282073247e2d8515e911fd0a8100b41fd71463058100cc1a7c264e08060540241f01cf22b20f8d05bc117b1b830bc904d423d012610a282be01283109b04ca1a732e9509380bd414602e3f28692dbf14f82e031dcc0a3e1af722e11db51bf22fc2212121ab09451c862a8b23ef033a13b3169d22531a0f2987240805e21e7e1647126f2d1218f52c73125526df2e60270c17fa2274115b22a71c12289e070a29ee0636113b04c7091e0b821aac0a4d119e0371016d287a03f71c521a5609b5038800182aa62b012d9b03d42d5713da1e131457202f034c1baf0c951f5021040a2314a919e302370b7d057e0a491b1c0b810ca02edc0eb91d0a0f681ffe1a6715e42b1024422786226923d1182819f317c6223114fa209c215805020df424f107e5127a0c9d06aa0f5913be0c52232c1ef92ffa079021762cb42d001596003200d802ff0edd1039275c04ff2ca0259114322f440c2c276006e30ee706c6054616c820e4114705fa069e273428b52557152312d4048823eb1e5b0b182653106224361c9311d51c2b290a03b01d5f1b5a21ac1dc81ae30bcc1629152204e329031b6607f32bf1181428a71ff02fb928cf0f000a9812e20b0c110004d9111a0d7b0ffe0be5169525ae2bba1da822072277295c1e692cf70a4202122a382474248507fe230c261d22fd2f760cc40ed30739197111ab10cd01c9000822830eae1f871126271d03d60a21036f25d728942e0b1c0317af213020fb0625175112292490178a04062e2f297021142c97270416122f5702882f6b09031f402cea267f24c80b0b261a2ba100151951", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : [ + "13d01f9a0cb3129901032a76071e25a315bb151d0e182b9901260c9a068d0d8606f913f62ee0263e1d1c038a0afb1676210515c215550f2424c8089a05a013962deb142928382ee927bb02fa264317040b441a4d23a90d0c058f053713591b64193a0718272e1e891e4402d92b0d1466092d22f10c44095e08512803176a0614253f234412262e7b2f3304ae28372427261515792c800fd129362bec21c602541dd8145317aa28b60ad10ae01cb41863044519f02c841a460b0617d20bc72f8f1d5323de1f990826187b04da1f9209f2127010ef2ab8017008201d4f2d0309d8042222e1030516cc2c1802b815bc2884067329ca0df60528164411e22a6d094627f917e4013e176a14ca15b6149c157622e7153f137d2980079517e227c516e42719294d03970e4215a32f1a0c8412590b9d19fd0eb92ecd17cf0709127f01190ad603801982115407e722da027e140f26df0879008a0eba09640254138d002b0afb242c0169170511932f3e10a205fa298a20590f542d332adc085022b61734128b19a70fa2220b2c780855038e0f7d2fa827262e390ad61d922914090e1ed902f22cfc1c8d02a5122c0efb108d1c7828202d3115c601f0141f094328f92d8614282ccd07d2169e1c5e11a21059068e2e5604352b96264b1b87174f0206205519341b6329b829b20b3f1fc8084a23992db62f5f27af292018ee010c067e2d3028ea0672151d1f4a009e2a0d1df51406017a12d808c617a019520d490dcd04cb236029e1181815d706ad1506285200772ac81ce604411f76150a00a917eb2850198003431d71256f1f980ce90a2800fd06400f4d13cb0a312bc626f30dd614751f6024562b6c207e13f9159c1014189e12e32a8729580c312a920a06035e0e6211be124f2dec1da722e52cb91d012ead2f702f762b6d0f351a6809aa15e811f81489283e25070e5528ea178813fc069e275421f80b881f0e26572ae80701059813760abb2d6815932f462cbe24932be61a8200592d29144720b32682098b25271b170d8a096d1c1008ac1f211fb20a741fdb125c05f61b4e19a0087f176c22461f2b16441f2a2391138a18f50e8524292bb715190ecc028a1ace0b931558094b241f2194017a1a23285c143c2d380ab210900e6927ec2e0f04b0024d006a07b900540e1b297e117e13d5204a215e24ec1b9800c309402719148411781d2d0b930a691b9e1b6d2be21098227b0f9e0bf9090e20911a5324f228e51a011a6106a9157024dd25d127062b2009222a270d5a0cad26461a1006f0259b1f110e2e05712a3d298c2ca72bbf117617aa118f22ef0c8b276528f218200e20074d2066033b02a62aa90b12209b20e5114f08b100a12f0817e3041527fc26aa18ab2c1b09031c9707ca1eb21dda0db80f4720c62134194d2c1504db248f1f2c09440b001c3c" + ], + "gasLimit" : [ + "0x3b9aca00" + ], + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "to" : "0xbe7c43a580000000000000000000000000000001", + "value" : [ + "0x00" + ] + } + } +} \ No newline at end of file diff --git a/test/evmmax-precompiles/poseidon.cpp b/test/evmmax-precompiles/poseidon.cpp new file mode 100644 index 0000000000..9831fe1b1a --- /dev/null +++ b/test/evmmax-precompiles/poseidon.cpp @@ -0,0 +1,637 @@ +#include "poseidon.hpp" +#include + +using namespace evmone::test; +using namespace intx; + +namespace +{ +const std::array M = { + 0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b_u256, + 0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771_u256, + 0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7_u256, + 0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0_u256, + 0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23_u256, + 0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911_u256, + 0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d_u256, + 0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa_u256, + 0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0_u256, +}; + +const std::array C = { + 0x0ee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e_u256, + 0x00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864_u256, + 0x08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5_u256, + 0x2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d0_u256, + 0x2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf2_u256, + 0x0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa_u256, + 0x28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d_u256, + 0x2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78_u256, + 0x234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632_u256, + 0x15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d428_u256, + 0x0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f6_u256, + 0x1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c_u256, + 0x10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de559_u256, + 0x1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f6_u256, + 0x1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c8705_u256, + 0x04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d_u256, + 0x0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828_u256, + 0x099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b9_u256, + 0x052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa6_u256, + 0x0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc_u256, + 0x119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd1_u256, + 0x03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d09_u256, + 0x2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565_u256, + 0x005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9_u256, + 0x233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b5_u256, + 0x05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d60280_u256, + 0x0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b_u256, + 0x2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec0_u256, + 0x1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c460_u256, + 0x12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc0_u256, + 0x0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e_u256, + 0x037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f8448_u256, + 0x05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f_u256, + 0x29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e_u256, + 0x20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f_u256, + 0x2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887_u256, + 0x143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c8_u256, + 0x0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1_u256, + 0x028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da53_u256, + 0x2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c_u256, + 0x0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e_u256, + 0x2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb38_u256, + 0x30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a735206_u256, + 0x1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad_u256, + 0x10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c_u256, + 0x2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef_u256, + 0x1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c91_u256, + 0x07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a0_u256, + 0x21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c0750_u256, + 0x2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e_u256, + 0x2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e_u256, + 0x162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab_u256, + 0x2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a70092393311_u256, + 0x2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a_u256, + 0x1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9_u256, + 0x204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c4565529_u256, + 0x0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502_u256, + 0x174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b54_u256, + 0x1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef_u256, + 0x066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a_u256, + 0x2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd804_u256, + 0x13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd649_u256, + 0x1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a_u256, + 0x00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff1_u256, + 0x0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d3_u256, + 0x29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba89_u256, + 0x2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be_u256, + 0x1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af1_u256, + 0x151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c5_u256, + 0x04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f100_u256, + 0x13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c2967_u256, + 0x01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e4_u256, + 0x2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b02_u256, + 0x1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646_u256, + 0x041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d_u256, + 0x154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc6_u256, + 0x0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da4_u256, + 0x0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e_u256, + 0x06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea0654626_u256, + 0x0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb_u256, + 0x04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13_u256, + 0x2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758_u256, + 0x123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef_u256, + 0x2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9_u256, + 0x0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d_u256, + 0x12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2_u256, + 0x21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035_u256, + 0x16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147_u256, + 0x1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2_u256, + 0x07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a_u256, + 0x05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc_u256, + 0x20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f_u256, + 0x04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69_u256, + 0x27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a_u256, + 0x2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1_u256, + 0x1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8_u256, + 0x15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a_u256, + 0x1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785_u256, + 0x25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77_u256, + 0x15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67_u256, + 0x2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727_u256, + 0x002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b_u256, + 0x2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2_u256, + 0x00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe_u256, + 0x0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512_u256, + 0x00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d_u256, + 0x171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9_u256, + 0x170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808_u256, + 0x29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1_u256, + 0x1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973_u256, + 0x1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09_u256, + 0x22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38_u256, + 0x0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd_u256, + 0x11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284_u256, + 0x1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af_u256, + 0x2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466_u256, + 0x3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad_u256, + 0x2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086_u256, + 0x119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3_u256, + 0x1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800_u256, + 0x28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6_u256, + 0x083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e7_u256, + 0x0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b_u256, + 0x0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b_u256, + 0x2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591_u256, + 0x0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178_u256, + 0x0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40_u256, + 0x1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4_u256, + 0x0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233_u256, + 0x0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b168873_u256, + 0x1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d_u256, + 0x2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc0_u256, + 0x1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb_u256, + 0x01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f9326478875_u256, + 0x1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e_u256, + 0x2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f019_u256, + 0x23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b_u256, + 0x2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d59_u256, + 0x0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f_u256, + 0x2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a8_u256, + 0x15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948_u256, + 0x193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f_u256, + 0x2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f_u256, + 0x1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d142_u256, + 0x04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b_u256, + 0x0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f23_u256, + 0x058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c0_u256, + 0x1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a_u256, + 0x03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b5_u256, + 0x23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a58_u256, + 0x0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f2_u256, + 0x06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b_u256, + 0x118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d01_u256, + 0x13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b1_u256, + 0x169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b_u256, + 0x04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d_u256, + 0x256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec_u256, + 0x30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb2_u256, + 0x10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792_u256, + 0x193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e36860_u256, + 0x18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d_u256, + 0x29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea6111_u256, + 0x10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c711_u256, + 0x0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb_u256, + 0x16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa336_u256, + 0x0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a_u256, + 0x1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf1860_u256, + 0x0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6_u256, + 0x161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b_u256, + 0x0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b_u256, + 0x1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f451_u256, + 0x2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c556_u256, + 0x1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f70_u256, + 0x2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf77_u256, + 0x23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea_u256, + 0x09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d_u256, + 0x188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630_u256, + 0x3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f_u256, + 0x15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd78_u256, + 0x1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc_u256, + 0x2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb_u256, + 0x202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60_u256, + 0x096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f_u256, + 0x054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a4_u256, + 0x1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f1_u256, + 0x21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc_u256, + 0x1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf08_u256, + 0x0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb24100_u256, + 0x1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320_u256, + 0x0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870_u256, + 0x193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba_u256, + 0x102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8_u256, + 0x0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1_u256, + 0x216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d22_u256, + 0x1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e4228325161_u256, +}; +} // namespace + +#define POW5MODX(SLOT_IDX, TMP_SLOT) \ + res += mulmodx(TMP_SLOT, SLOT_IDX, SLOT_IDX); \ + res += mulmodx(TMP_SLOT, TMP_SLOT, TMP_SLOT); \ + res += mulmodx(SLOT_IDX, SLOT_IDX, TMP_SLOT); + +bytecode create_poseidon_hash_bytecode() +{ + bytecode res; + size_t mem_ptr = 0; + + // Store modulus + res += mstore(mem_ptr, + push(21888242871839275222246405745257275088548364400416034343698204186575808495617_u256)); + const size_t mod_ptr = mem_ptr; + res += setmodx(21, 254, mod_ptr); + mem_ptr += 32; + + // Store MDS matrix + const size_t mds_prt = mem_ptr; + for (size_t i = 0; i < 9; ++i) + { + res += mstore(mem_ptr, push(M[i])); + mem_ptr += 32; + } + + const uint8_t mds_slot_start = 0; + const uint8_t M00_slot = mds_slot_start; + const uint8_t M01_slot = M00_slot + 1; + const uint8_t M02_slot = M01_slot + 1; + const uint8_t M10_slot = M02_slot + 1; + const uint8_t M11_slot = M10_slot + 1; + const uint8_t M12_slot = M11_slot + 1; + const uint8_t M20_slot = M12_slot + 1; + const uint8_t M21_slot = M20_slot + 1; + const uint8_t M22_slot = M21_slot + 1; + + res += storex(9, mds_prt, mds_slot_start); + const uint8_t mds_slot_end = mds_slot_start + 9; + + const uint8_t state_slot_start = mds_slot_end; + const uint8_t state_slot_end = state_slot_start + 3; + res += calldatacopy(mem_ptr, 0, 64); + + const uint8_t swap_slot_start = state_slot_end; + const uint8_t swap_slot_end = swap_slot_start + 3; + + res += storex(2, mem_ptr, swap_slot_start + 1); + mem_ptr += 64; + + const uint8_t state0_slot = state_slot_start; + const uint8_t state1_slot = state0_slot + 1; + const uint8_t state2_slot = state1_slot + 1; + + const uint8_t swap0_slot = swap_slot_start; + const uint8_t swap1_slot = swap0_slot + 1; + const uint8_t swap2_slot = swap1_slot + 1; + + const size_t C_ptr = mem_ptr; + + for (const auto& c : C) + { + res += mstore(mem_ptr, push(c)); + mem_ptr += 32; + } + + const uint8_t T = 3; + const size_t ROUNDS_F = 8; + const size_t ROUNDS_P = 57; + + const uint8_t tmp0_slot = swap_slot_end; + const uint8_t tmp1_slot = tmp0_slot + 1; + + for (size_t r = 0; r < ROUNDS_F + ROUNDS_P; ++r) + { + res += storex(T, C_ptr + r * T * 32, state0_slot); + res += addmodx(state0_slot, swap0_slot, state0_slot); + res += addmodx(state1_slot, swap1_slot, state1_slot); + res += addmodx(state2_slot, swap2_slot, state2_slot); + + POW5MODX(state0_slot, tmp0_slot) + if (r < ROUNDS_F / 2 || r >= ROUNDS_F / 2 + ROUNDS_P) + { + POW5MODX(state1_slot, tmp0_slot) POW5MODX(state2_slot, tmp0_slot) + } + + res += mulmodx(swap0_slot, state0_slot, M00_slot); + res += mulmodx(swap1_slot, state1_slot, M10_slot); + res += mulmodx(swap2_slot, state2_slot, M20_slot); + + res += addmodx(swap0_slot, swap0_slot, swap1_slot); + res += addmodx(swap0_slot, swap0_slot, swap2_slot); + + res += mulmodx(swap1_slot, state0_slot, M01_slot); + res += mulmodx(swap2_slot, state1_slot, M11_slot); + res += mulmodx(tmp0_slot, state2_slot, M21_slot); + + res += addmodx(swap1_slot, swap1_slot, swap2_slot); + res += addmodx(swap1_slot, swap1_slot, tmp0_slot); + + res += mulmodx(swap2_slot, state0_slot, M02_slot); + res += mulmodx(tmp0_slot, state1_slot, M12_slot); + res += mulmodx(tmp1_slot, state2_slot, M22_slot); + + res += addmodx(swap2_slot, swap2_slot, tmp0_slot); + res += addmodx(swap2_slot, swap2_slot, tmp1_slot); + } + + res += loadx(1, swap0_slot, 0); + res += ret(0, 32); + return res; +} + +bytecode create_poseidon_hash_bytecode_datacopy() +{ + bytecode res; + size_t mem_ptr = 0; + + bytecode data = {}; + + for (const auto& v : M) + data += bytecode(intx::be::store(v).bytes, 32); + const auto M_size = data.size(); + + const auto C_data_offset = M_size; + for (const auto& v : C) + data += bytecode(intx::be::store(v).bytes, 32); + const auto C_size = data.size() - C_data_offset; + + // Store modulus + res += mstore(mem_ptr, + push(21888242871839275222246405745257275088548364400416034343698204186575808495617_u256)); + const size_t mod_ptr = mem_ptr; + res += setmodx(17, 254, mod_ptr); + mem_ptr += 32; + + // Store MDS matrix + const size_t mds_prt = mem_ptr; + res += datacopy(mds_prt, 0, M_size); + mem_ptr += M_size; + + const uint8_t mds_slot_start = 0; + const uint8_t M00_slot = mds_slot_start; + const uint8_t M01_slot = M00_slot + 1; + const uint8_t M02_slot = M01_slot + 1; + const uint8_t M10_slot = M02_slot + 1; + const uint8_t M11_slot = M10_slot + 1; + const uint8_t M12_slot = M11_slot + 1; + const uint8_t M20_slot = M12_slot + 1; + const uint8_t M21_slot = M20_slot + 1; + const uint8_t M22_slot = M21_slot + 1; + + res += storex(9, mds_prt, mds_slot_start); + const uint8_t mds_slot_end = mds_slot_start + 9; + + const uint8_t state_slot_start = mds_slot_end; + const uint8_t state_slot_end = state_slot_start + 3; + res += calldatacopy(mem_ptr, 0, 64); + + const uint8_t swap_slot_start = state_slot_end; + const uint8_t swap_slot_end = swap_slot_start + 3; + + res += storex(2, mem_ptr, swap_slot_start + 1); + mem_ptr += 64; + + const uint8_t state0_slot = state_slot_start; + const uint8_t state1_slot = state0_slot + 1; + const uint8_t state2_slot = state1_slot + 1; + + const uint8_t swap0_slot = swap_slot_start; + const uint8_t swap1_slot = swap0_slot + 1; + const uint8_t swap2_slot = swap1_slot + 1; + + const size_t C_ptr = mem_ptr; + res += datacopy(C_ptr, C_data_offset, C_size); + + const uint8_t T = 3; + const size_t ROUNDS_F = 8; + const size_t ROUNDS_P = 57; + + const uint8_t tmp0_slot = swap_slot_end; + const uint8_t tmp1_slot = tmp0_slot + 1; + + for (size_t r = 0; r < ROUNDS_F + ROUNDS_P; ++r) + { + res += storex(T, C_ptr + r * T * 32, state0_slot); + res += addmodx(state0_slot, swap0_slot, state0_slot); + res += addmodx(state1_slot, swap1_slot, state1_slot); + res += addmodx(state2_slot, swap2_slot, state2_slot); + + POW5MODX(state0_slot, tmp0_slot) + if (r < ROUNDS_F / 2 || r >= ROUNDS_F / 2 + ROUNDS_P) + { + POW5MODX(state1_slot, tmp0_slot) POW5MODX(state2_slot, tmp0_slot) + } + + res += mulmodx(swap0_slot, state0_slot, M00_slot); + res += mulmodx(swap1_slot, state1_slot, M10_slot); + res += mulmodx(swap2_slot, state2_slot, M20_slot); + + res += addmodx(swap0_slot, swap0_slot, swap1_slot); + res += addmodx(swap0_slot, swap0_slot, swap2_slot); + + res += mulmodx(swap1_slot, state0_slot, M01_slot); + res += mulmodx(swap2_slot, state1_slot, M11_slot); + res += mulmodx(tmp0_slot, state2_slot, M21_slot); + + res += addmodx(swap1_slot, swap1_slot, swap2_slot); + res += addmodx(swap1_slot, swap1_slot, tmp0_slot); + + res += mulmodx(swap2_slot, state0_slot, M02_slot); + res += mulmodx(tmp0_slot, state1_slot, M12_slot); + res += mulmodx(tmp1_slot, state2_slot, M22_slot); + + res += addmodx(swap2_slot, swap2_slot, tmp0_slot); + res += addmodx(swap2_slot, swap2_slot, tmp1_slot); + } + + res += loadx(1, swap0_slot, 0); + res += ret(0, 32); + + return eof_bytecode(res, 3).data(data); +} + +bytecode create_poseidon_hash_bytecode_vectorized() +{ + bytecode res; + size_t mem_ptr = 0; + + // Store modulus + res += mstore(mem_ptr, + push(21888242871839275222246405745257275088548364400416034343698204186575808495617_u256)); + const size_t mod_ptr = mem_ptr; + res += setmodx(17, 254, mod_ptr); + mem_ptr += 32; + + // Store MDS matrix + const size_t mds_prt = mem_ptr; + for (size_t i = 0; i < 9; ++i) + { + res += mstore(mem_ptr, push(M[(i * 3) % 9 + i / 3])); + mem_ptr += 32; + } + + const uint8_t mds_slot_start = 0; + const uint8_t M00_slot = mds_slot_start; + const uint8_t M01_slot = M00_slot + 3; + const uint8_t M02_slot = M01_slot + 3; + + res += storex(9, mds_prt, mds_slot_start); + const uint8_t mds_slot_end = mds_slot_start + 9; + + const uint8_t state_slot_start = mds_slot_end; + const uint8_t state_slot_end = state_slot_start + 3; + res += calldatacopy(mem_ptr, 0, 64); + + const uint8_t swap_slot_start = state_slot_end; + const uint8_t swap_slot_end = swap_slot_start + 3; + + res += storex(2, mem_ptr, swap_slot_start + 1); + mem_ptr += 64; + + const uint8_t state0_slot = state_slot_start; + const uint8_t state1_slot = state0_slot + 1; + const uint8_t state2_slot = state1_slot + 1; + + const uint8_t swap0_slot = swap_slot_start; + const uint8_t swap1_slot = swap0_slot + 1; + const uint8_t swap2_slot = swap1_slot + 1; + + const size_t C_ptr = mem_ptr; + + for (const auto& c : C) + { + res += mstore(mem_ptr, push(c)); + mem_ptr += 32; + } + + const uint8_t T = 3; + const size_t ROUNDS_F = 8; + const size_t ROUNDS_P = 57; + + const uint8_t tmp0_slot = swap_slot_end; + const uint8_t tmp1_slot = tmp0_slot + 1; + + for (size_t r = 0; r < ROUNDS_F + ROUNDS_P; ++r) + { + res += storex(T, C_ptr + r * T * 32, state0_slot); + res += addmodx(state0_slot, 1, swap0_slot, 1, state0_slot, 1, T); + + POW5MODX(state0_slot, tmp0_slot) + if (r < ROUNDS_F / 2 || r >= ROUNDS_F / 2 + ROUNDS_P) + { + POW5MODX(state1_slot, tmp0_slot) POW5MODX(state2_slot, tmp0_slot) + } + + res += mulmodx(swap0_slot, 1, state0_slot, 1, M00_slot, 1, T); + res += addmodx(swap0_slot, swap0_slot, swap1_slot); + res += addmodx(swap0_slot, swap0_slot, swap2_slot); + + res += mulmodx(swap1_slot, 1, state0_slot, 1, M01_slot, 1, T); + res += addmodx(swap1_slot, swap1_slot, swap2_slot); + res += addmodx(swap1_slot, swap1_slot, tmp0_slot); + + res += mulmodx(swap2_slot, 1, state0_slot, 1, M02_slot, 1, T); + res += addmodx(swap2_slot, swap2_slot, tmp0_slot); + res += addmodx(swap2_slot, swap2_slot, tmp1_slot); + } + + res += loadx(1, swap0_slot, 0); + res += ret(0, 32); + return res; +} + +const std::array M_T = { + M[0], + M[3], + M[6], + M[1], + M[4], + M[7], + M[2], + M[5], + M[8], +}; + +bytecode create_poseidon_hash_bytecode_vectorized_datacopy() +{ + bytecode res; + size_t mem_ptr = 0; + + bytecode data = {}; + + for (const auto& v : M_T) + data += bytecode(intx::be::store(v).bytes, 32); + const auto M_size = data.size(); + + const auto C_data_offset = M_size; + for (const auto& v : C) + data += bytecode(intx::be::store(v).bytes, 32); + const auto C_size = data.size() - C_data_offset; + + // Store modulus + res += mstore(mem_ptr, + push(21888242871839275222246405745257275088548364400416034343698204186575808495617_u256)); + const size_t mod_ptr = mem_ptr; + res += setmodx(17, 254, mod_ptr); + mem_ptr += 32; + + // Store MDS matrix + const size_t mds_prt = mem_ptr; + res += datacopy(mds_prt, 0, M_size); + mem_ptr += M_size; + + const uint8_t mds_slot_start = 0; + const uint8_t M00_slot = mds_slot_start; + const uint8_t M01_slot = M00_slot + 3; + const uint8_t M02_slot = M01_slot + 3; + + res += storex(9, mds_prt, mds_slot_start); + const uint8_t mds_slot_end = mds_slot_start + 9; + + const uint8_t state_slot_start = mds_slot_end; + const uint8_t state_slot_end = state_slot_start + 3; + res += calldatacopy(mem_ptr, 0, 64); + + const uint8_t swap_slot_start = state_slot_end; + const uint8_t swap_slot_end = swap_slot_start + 3; + + res += storex(2, mem_ptr, swap_slot_start + 1); + mem_ptr += 64; + + const uint8_t state0_slot = state_slot_start; + const uint8_t state1_slot = state0_slot + 1; + const uint8_t state2_slot = state1_slot + 1; + + const uint8_t swap0_slot = swap_slot_start; + const uint8_t swap1_slot = swap0_slot + 1; + const uint8_t swap2_slot = swap1_slot + 1; + + const size_t C_ptr = mem_ptr; + res += datacopy(C_ptr, C_data_offset, C_size); + + const uint8_t T = 3; + const size_t ROUNDS_F = 8; + const size_t ROUNDS_P = 57; + + const uint8_t tmp0_slot = swap_slot_end; + const uint8_t tmp1_slot = tmp0_slot + 1; + + for (size_t r = 0; r < ROUNDS_F + ROUNDS_P; ++r) + { + res += storex(T, C_ptr + r * T * 32, state0_slot); + res += addmodx(state0_slot, 1, swap0_slot, 1, state0_slot, 1, T); + + POW5MODX(state0_slot, tmp0_slot) + if (r < ROUNDS_F / 2 || r >= ROUNDS_F / 2 + ROUNDS_P) + { + POW5MODX(state1_slot, tmp0_slot) POW5MODX(state2_slot, tmp0_slot) + } + + res += mulmodx(swap0_slot, 1, state0_slot, 1, M00_slot, 1, T); + res += addmodx(swap0_slot, swap0_slot, swap1_slot); + res += addmodx(swap0_slot, swap0_slot, swap2_slot); + + res += mulmodx(swap1_slot, 1, state0_slot, 1, M01_slot, 1, T); + res += addmodx(swap1_slot, swap1_slot, swap2_slot); + res += addmodx(swap1_slot, swap1_slot, tmp0_slot); + + res += mulmodx(swap2_slot, 1, state0_slot, 1, M02_slot, 1, T); + res += addmodx(swap2_slot, swap2_slot, tmp0_slot); + res += addmodx(swap2_slot, swap2_slot, tmp1_slot); + } + + res += loadx(1, swap0_slot, 0); + res += ret(0, 32); + + return eof_bytecode(res, 3).data(data); +} diff --git a/test/evmmax-precompiles/poseidon.hpp b/test/evmmax-precompiles/poseidon.hpp new file mode 100644 index 0000000000..e001161ab8 --- /dev/null +++ b/test/evmmax-precompiles/poseidon.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include + +evmone::test::bytecode create_poseidon_hash_bytecode(); +evmone::test::bytecode create_poseidon_hash_bytecode_datacopy(); +evmone::test::bytecode create_poseidon_hash_bytecode_vectorized(); +evmone::test::bytecode create_poseidon_hash_bytecode_vectorized_datacopy(); diff --git a/test/evmmax-precompiles/poseidon.json b/test/evmmax-precompiles/poseidon.json new file mode 100644 index 0000000000..9012faff97 --- /dev/null +++ b/test/evmmax-precompiles/poseidon.json @@ -0,0 +1,73 @@ +{ + "poseidon" : { + "_info" : { + "comment" : "", + "filling-rpc-server" : "evm version 1.10.25-stable-69568c55", + "filling-tool-version" : "retesteth-0.2.2-testinfo+commit.766b4629.Linux.g++", + "generatedTestHash" : "682d204267cf3a3909bf22c063f2c9cde06a917d56f3666bad7ff4c724b3676b", + "labels" : { + "0" : "empty" + }, + "lllcversion" : "Error getting LLLC Version", + "solidity" : "Error getting solc Version", + "source" : "tmp/micro/jump_aroundFiller.yml", + "sourceHash" : "cadfd8a7ee22cbefac3a420cc4c762ca1a3a38ae3346407bd31694acff16c78e" + }, + "env" : { + "currentBaseFee" : "0x01", + "currentCoinbase" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "0x01", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x01", + "currentRandom" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "currentTimestamp" : "0x61a8d289", + "previousHash" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "post" : { + "Experimental" : [ + { + "hash" : "0xf70e5041c4b16cabe8b65bed44532d1c00218b0a39a256816c9d4d07bdbba64a", + "indexes" : { + "data" : 0, + "gas" : 0, + "value" : 0 + }, + "logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "txbytes" : "0xf8618001843b9aca0094be7c43a58000000000000000000000000000000180801ca0999ee855b1d5325fe79efbc40ad560f9ebabbbb97e72e1a4e9cf7e4b8ba34765a06392df208ed06b901f2997995c138bfa06ae8b1a26c15e8aff52cad68f913e85" + } + ] + }, + "pre" : { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x3b9aca00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "0xbe7c43a580000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600052601560fe6000c07f109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b6020527f2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd7716040527f143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a76060527f16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e06080527f2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe2360a0527f176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee291160c0527f2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d60e0527f101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa610100527f19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e061012052600960206000c260406000610140376002610140600dc27f0ee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e610180527f00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e8646101a0527f08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f56101c0527f2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d06101e0527f2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf2610200527f0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa610220527f28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d610240527f2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78610260527f234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632610280527f15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d4286102a0527f0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f66102c0527f1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c6102e0527f10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de559610300527f1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f6610320527f1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c8705610340527f04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d610360527f0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828610380527f099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b96103a0527f052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa66103c0527f0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc6103e0527f119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd1610400527f03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d09610420527f2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565610440527f005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9610460527f233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b5610480527f05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d602806104a0527f0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b6104c0527f2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec06104e0527f1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c460610500527f12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc0610520527f0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e610540527f037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f8448610560527f05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f610580527f29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e6105a0527f20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f6105c0527f2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c8876105e0527f143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c8610600527f0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1610620527f028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da53610640527f2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c610660527f0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e610680527f2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb386106a0527f30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a7352066106c0527f1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad6106e0527f10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c610700527f2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef610720527f1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c91610740527f07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a0610760527f21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c0750610780527f2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e6107a0527f2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e6107c0527f162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab6107e0527f2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a70092393311610800527f2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a610820527f1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9610840527f204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c4565529610860527f0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502610880527f174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b546108a0527f1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef6108c0527f066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a6108e0527f2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd804610900527f13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd649610920527f1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a610940527f00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff1610960527f0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d3610980527f29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba896109a0527f2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be6109c0527f1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af16109e0527f151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c5610a00527f04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f100610a20527f13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c2967610a40527f01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e4610a60527f2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b02610a80527f1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646610aa0527f041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d610ac0527f154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc6610ae0527f0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da4610b00527f0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e610b20527f06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea0654626610b40527f0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb610b60527f04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13610b80527f2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758610ba0527f123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef610bc0527f2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9610be0527f0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d610c00527f12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2610c20527f21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035610c40527f16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147610c60527f1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2610c80527f07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a610ca0527f05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc610cc0527f20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f610ce0527f04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69610d00527f27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a610d20527f2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1610d40527f1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8610d60527f15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a610d80527f1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785610da0527f25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77610dc0527f15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67610de0527f2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727610e00527f002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b610e20527f2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2610e40527f00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe610e60527f0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512610e80527f00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d610ea0527f171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9610ec0527f170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808610ee0527f29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1610f00527f1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973610f20527f1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09610f40527f22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38610f60527f0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd610f80527f11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284610fa0527f1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af610fc0527f2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466610fe0527f3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad611000527f2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086611020527f119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3611040527f1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800611060527f28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6611080527f083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e76110a0527f0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b6110c0527f0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b6110e0527f2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591611100527f0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178611120527f0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40611140527f1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4611160527f0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233611180527f0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b1688736111a0527f1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d6111c0527f2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc06111e0527f1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb611200527f01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f9326478875611220527f1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e611240527f2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f019611260527f23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b611280527f2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d596112a0527f0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f6112c0527f2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a86112e0527f15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948611300527f193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f611320527f2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f611340527f1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d142611360527f04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b611380527f0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f236113a0527f058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c06113c0527f1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a6113e0527f03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b5611400527f23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a58611420527f0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f2611440527f06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b611460527f118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d01611480527f13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b16114a0527f169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b6114c0527f04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d6114e0527f256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec611500527f30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb2611520527f10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792611540527f193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e36860611560527f18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d611580527f29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea61116115a0527f10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c7116115c0527f0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb6115e0527f16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa336611600527f0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a611620527f1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf1860611640527f0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6611660527f161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b611680527f0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b6116a0527f1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f4516116c0527f2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c5566116e0527f1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f70611700527f2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf77611720527f23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea611740527f09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d611760527f188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630611780527f3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f6117a0527f15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd786117c0527f1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc6117e0527f2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb611800527f202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60611820527f096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f611840527f054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a4611860527f1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f1611880527f21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc6118a0527f1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf086118c0527f0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb241006118e0527f1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320611900527f0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870611920527f193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba611940527f102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8611960527f0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1611980527f216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d226119a0527f1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e42283251616119c05260036101806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036101e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036102406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036102a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036103006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036103606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036103c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036104206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036104806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036104e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036105406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036105a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036106006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036106606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036106c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036107206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036107806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036107e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036108406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036108a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036109006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036109606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036109c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610a206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610a806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610ae06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610b406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610ba06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610c006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610c606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610cc06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610d206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610d806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610de06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610e406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610ea06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610f006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610f606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610fc06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036110206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036110806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036110e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036111406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036111a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036112006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036112606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036112c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036113206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036113806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036113e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036114406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036114a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036115006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036115606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036115c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036116206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036116806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036116e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036117406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036117a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036118006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036118606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036118c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036119206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036119806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016001600c6000c160206000f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : [ + "0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001" + ], + "gasLimit" : [ + "0x3b9aca00" + ], + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "to" : "0xbe7c43a580000000000000000000000000000001", + "value" : [ + "0x00" + ] + } + } +} \ No newline at end of file diff --git a/test/evmmax-precompiles/poseidon_datacopy.json b/test/evmmax-precompiles/poseidon_datacopy.json new file mode 100644 index 0000000000..860226b091 --- /dev/null +++ b/test/evmmax-precompiles/poseidon_datacopy.json @@ -0,0 +1,73 @@ +{ + "poseidon_datacopy" : { + "_info" : { + "comment" : "", + "filling-rpc-server" : "evm version 1.10.25-stable-69568c55", + "filling-tool-version" : "retesteth-0.2.2-testinfo+commit.766b4629.Linux.g++", + "generatedTestHash" : "682d204267cf3a3909bf22c063f2c9cde06a917d56f3666bad7ff4c724b3676b", + "labels" : { + "0" : "empty" + }, + "lllcversion" : "Error getting LLLC Version", + "solidity" : "Error getting solc Version", + "source" : "tmp/micro/jump_aroundFiller.yml", + "sourceHash" : "cadfd8a7ee22cbefac3a420cc4c762ca1a3a38ae3346407bd31694acff16c78e" + }, + "env" : { + "currentBaseFee" : "0x01", + "currentCoinbase" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "0x01", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x01", + "currentRandom" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "currentTimestamp" : "0x61a8d289", + "previousHash" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "post" : { + "Experimental" : [ + { + "hash" : "0xf70e5041c4b16cabe8b65bed44532d1c00218b0a39a256816c9d4d07bdbba64a", + "indexes" : { + "data" : 0, + "gas" : 0, + "value" : 0 + }, + "logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "txbytes" : "0xf8618001843b9aca0094be7c43a58000000000000000000000000000000180801ca0999ee855b1d5325fe79efbc40ad560f9ebabbbb97e72e1a4e9cf7e4b8ba34765a06392df208ed06b901f2997995c138bfa06ae8b1a26c15e8aff52cad68f913e85" + } + ] + }, + "pre" : { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x3b9aca00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "0xbe7c43a580000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "ef00010100040200012e9004198000008000037f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600052601160fe6000c061012060006020d3600960206000c260406000610140376002610140600dc2611860610120610180d360036101806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036101e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036102406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036102a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036103006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036103606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036103c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036104206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036104806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036104e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036105406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036105a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036106006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036106606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036106c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036107206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036107806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036107e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036108406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036108a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036109006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036109606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036109c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610a206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610a806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610ae06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610b406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610ba06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610c006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610c606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610cc06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610d206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610d806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610de06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610e406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610ea06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610f006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610f606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016003610fc06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036110206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036110806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036110e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036111406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036111a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036112006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036112606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036112c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036113206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036113806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036113e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036114406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036114a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036115006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036115606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036115c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036116206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036116806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036116e06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036117406009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036117a06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036118006009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036118606009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036118c06009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036119206009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e0010000160036119806009c2c309000c00090001c30a000d000a0001c30b000e000b0001c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c000900000001c50d000a00030001c50e000b00060001c30c000c000d0001c30c000c000e0001c50d000900010001c50e000a00040001c50f000b00070001c30d000d000e0001c30d000d000f0001c50e000900020001c50f000a00050001c510000b00080001c30e000e000f0001c30e000e001000016001600c6000c160206000f3109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a716ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e02e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee29112b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e00ee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e86408dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f52f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d02b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf20319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc63215b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d4280dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f61bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de5591f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f61d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c870504df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b9052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa60b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd103150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d092cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b505c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d602800a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec01ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c46012c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc00b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f844805a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c80c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da532e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb3830509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a7352061c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c9107533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a021576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c07502f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a700923933112c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c45655290c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b541a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd80413ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd6491121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff10e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d329f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba892a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af1151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c504c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f10013b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c296701a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e42ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b021d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc60b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da40955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea06546260f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e132b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e90fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f221e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a9003516243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b1471efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac207ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db6927e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d11ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b815742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c78525851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c7715a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a672411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d200b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c351200248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a80829aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae11e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e649731dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f0922cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af380ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e82841166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee4663006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c31835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd80028201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e70b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c985910b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f1780b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d401f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d40171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e5042330c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b1688731162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc01e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f93264788751f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f01923f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d590f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a815871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d14204e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f23058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c01382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b523f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a580a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f206ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d0113d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b1169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb210998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e3686018168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea611110646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c7110beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa3360a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf18600980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f4512c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c5561c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f702cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf7723ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc6303050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd781da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a41b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f121e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf080f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb241001671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c23200fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f80fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d221da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e4228325161", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : [ + "0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001" + ], + "gasLimit" : [ + "0x3b9aca00" + ], + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "to" : "0xbe7c43a580000000000000000000000000000001", + "value" : [ + "0x00" + ] + } + } +} \ No newline at end of file diff --git a/test/evmmax-precompiles/poseidon_vec.json b/test/evmmax-precompiles/poseidon_vec.json new file mode 100644 index 0000000000..13aaccd859 --- /dev/null +++ b/test/evmmax-precompiles/poseidon_vec.json @@ -0,0 +1,73 @@ +{ + "poseidon_vec" : { + "_info" : { + "comment" : "", + "filling-rpc-server" : "evm version 1.10.25-stable-69568c55", + "filling-tool-version" : "retesteth-0.2.2-testinfo+commit.766b4629.Linux.g++", + "generatedTestHash" : "682d204267cf3a3909bf22c063f2c9cde06a917d56f3666bad7ff4c724b3676b", + "labels" : { + "0" : "empty" + }, + "lllcversion" : "Error getting LLLC Version", + "solidity" : "Error getting solc Version", + "source" : "tmp/micro/jump_aroundFiller.yml", + "sourceHash" : "cadfd8a7ee22cbefac3a420cc4c762ca1a3a38ae3346407bd31694acff16c78e" + }, + "env" : { + "currentBaseFee" : "0x01", + "currentCoinbase" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "0x01", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x01", + "currentRandom" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "currentTimestamp" : "0x61a8d289", + "previousHash" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "post" : { + "Experimental" : [ + { + "hash" : "0x17bfb8320dbcd3058180c9b9eef355a0b2cf30302f03935260bba9163235cb00", + "indexes" : { + "data" : 0, + "gas" : 0, + "value" : 0 + }, + "logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "txbytes" : "0xf8618001843b9aca0094be7c43a58000000000000000000000000000000180801ca0999ee855b1d5325fe79efbc40ad560f9ebabbbb97e72e1a4e9cf7e4b8ba34765a06392df208ed06b901f2997995c138bfa06ae8b1a26c15e8aff52cad68f913e85" + } + ] + }, + "pre" : { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x3b9aca00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "0xbe7c43a580000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600052601160fe6000c07f109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b6020527f16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e06040527f2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d6060527f2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd7716080527f2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe2360a0527f101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa60c0527f143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a760e0527f176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911610100527f19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e061012052600960206000c260406000610140376002610140600dc27f0ee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e610180527f00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e8646101a0527f08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f56101c0527f2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d06101e0527f2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf2610200527f0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa610220527f28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d610240527f2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78610260527f234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632610280527f15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d4286102a0527f0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f66102c0527f1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c6102e0527f10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de559610300527f1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f6610320527f1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c8705610340527f04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d610360527f0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828610380527f099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b96103a0527f052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa66103c0527f0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc6103e0527f119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd1610400527f03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d09610420527f2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565610440527f005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9610460527f233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b5610480527f05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d602806104a0527f0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b6104c0527f2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec06104e0527f1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c460610500527f12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc0610520527f0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e610540527f037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f8448610560527f05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f610580527f29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e6105a0527f20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f6105c0527f2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c8876105e0527f143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c8610600527f0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1610620527f028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da53610640527f2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c610660527f0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e610680527f2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb386106a0527f30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a7352066106c0527f1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad6106e0527f10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c610700527f2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef610720527f1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c91610740527f07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a0610760527f21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c0750610780527f2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e6107a0527f2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e6107c0527f162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab6107e0527f2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a70092393311610800527f2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a610820527f1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9610840527f204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c4565529610860527f0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502610880527f174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b546108a0527f1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef6108c0527f066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a6108e0527f2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd804610900527f13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd649610920527f1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a610940527f00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff1610960527f0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d3610980527f29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba896109a0527f2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be6109c0527f1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af16109e0527f151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c5610a00527f04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f100610a20527f13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c2967610a40527f01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e4610a60527f2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b02610a80527f1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646610aa0527f041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d610ac0527f154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc6610ae0527f0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da4610b00527f0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e610b20527f06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea0654626610b40527f0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb610b60527f04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13610b80527f2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758610ba0527f123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef610bc0527f2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9610be0527f0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d610c00527f12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2610c20527f21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035610c40527f16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147610c60527f1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2610c80527f07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a610ca0527f05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc610cc0527f20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f610ce0527f04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69610d00527f27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a610d20527f2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1610d40527f1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8610d60527f15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a610d80527f1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785610da0527f25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77610dc0527f15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67610de0527f2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727610e00527f002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b610e20527f2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2610e40527f00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe610e60527f0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512610e80527f00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d610ea0527f171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9610ec0527f170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808610ee0527f29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1610f00527f1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973610f20527f1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09610f40527f22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38610f60527f0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd610f80527f11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284610fa0527f1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af610fc0527f2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466610fe0527f3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad611000527f2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086611020527f119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3611040527f1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800611060527f28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6611080527f083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e76110a0527f0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b6110c0527f0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b6110e0527f2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591611100527f0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178611120527f0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40611140527f1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4611160527f0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233611180527f0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b1688736111a0527f1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d6111c0527f2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc06111e0527f1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb611200527f01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f9326478875611220527f1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e611240527f2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f019611260527f23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b611280527f2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d596112a0527f0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f6112c0527f2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a86112e0527f15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948611300527f193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f611320527f2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f611340527f1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d142611360527f04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b611380527f0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f236113a0527f058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c06113c0527f1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a6113e0527f03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b5611400527f23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a58611420527f0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f2611440527f06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b611460527f118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d01611480527f13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b16114a0527f169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b6114c0527f04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d6114e0527f256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec611500527f30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb2611520527f10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792611540527f193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e36860611560527f18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d611580527f29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea61116115a0527f10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c7116115c0527f0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb6115e0527f16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa336611600527f0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a611620527f1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf1860611640527f0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6611660527f161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b611680527f0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b6116a0527f1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f4516116c0527f2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c5566116e0527f1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f70611700527f2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf77611720527f23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea611740527f09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d611760527f188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630611780527f3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f6117a0527f15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd786117c0527f1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc6117e0527f2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb611800527f202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60611820527f096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f611840527f054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a4611860527f1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f1611880527f21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc6118a0527f1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf086118c0527f0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb241006118e0527f1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320611900527f0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870611920527f193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba611940527f102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8611960527f0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1611980527f216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d226119a0527f1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e42283251616119c05260036101806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036101e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036102406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036102a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036103006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036103606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036103c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036104206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036104806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036104e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036105406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036105a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036106006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036106606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036106c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036107206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036107806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036107e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036108406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036108a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036109006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036109606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036109c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610a206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610a806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610ae06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610b406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610ba06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610c006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610c606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610cc06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610d206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610d806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610de06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610e406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610ea06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610f006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610f606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610fc06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036110206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036110806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036110e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036111406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036111a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036112006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036112606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036112c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036113206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036113806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036113e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036114406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036114a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036115006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036115606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036115c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036116206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036116806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036116e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036117406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036117a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036118006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036118606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036118c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036119206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036119806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016001600c6000c160206000f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : [ + "0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001" + ], + "gasLimit" : [ + "0x3b9aca00" + ], + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "to" : "0xbe7c43a580000000000000000000000000000001", + "value" : [ + "0x00" + ] + } + } +} \ No newline at end of file diff --git a/test/evmmax-precompiles/poseidon_vec_datacopy.json b/test/evmmax-precompiles/poseidon_vec_datacopy.json new file mode 100644 index 0000000000..9d9f3c24f1 --- /dev/null +++ b/test/evmmax-precompiles/poseidon_vec_datacopy.json @@ -0,0 +1,73 @@ +{ + "poseidon_vec_datacopy" : { + "_info" : { + "comment" : "", + "filling-rpc-server" : "evm version 1.10.25-stable-69568c55", + "filling-tool-version" : "retesteth-0.2.2-testinfo+commit.766b4629.Linux.g++", + "generatedTestHash" : "682d204267cf3a3909bf22c063f2c9cde06a917d56f3666bad7ff4c724b3676b", + "labels" : { + "0" : "empty" + }, + "lllcversion" : "Error getting LLLC Version", + "solidity" : "Error getting solc Version", + "source" : "tmp/micro/jump_aroundFiller.yml", + "sourceHash" : "cadfd8a7ee22cbefac3a420cc4c762ca1a3a38ae3346407bd31694acff16c78e" + }, + "env" : { + "currentBaseFee" : "0x01", + "currentCoinbase" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "0x01", + "currentGasLimit" : "0x3b9aca00", + "currentNumber" : "0x01", + "currentRandom" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "currentTimestamp" : "0x61a8d289", + "previousHash" : "0x5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "post" : { + "Experimental" : [ + { + "hash" : "0x17bfb8320dbcd3058180c9b9eef355a0b2cf30302f03935260bba9163235cb00", + "indexes" : { + "data" : 0, + "gas" : 0, + "value" : 0 + }, + "logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "txbytes" : "0xf8618001843b9aca0094be7c43a58000000000000000000000000000000180801ca0999ee855b1d5325fe79efbc40ad560f9ebabbbb97e72e1a4e9cf7e4b8ba34765a06392df208ed06b901f2997995c138bfa06ae8b1a26c15e8aff52cad68f913e85" + } + ] + }, + "pre" : { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x3b9aca00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "0xbe7c43a580000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "ef00010100040200011e5004198000008000037f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600052601160fe6000c061012060006020d3600960206000c260406000610140376002610140600dc2611860610120610180d360036101806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036101e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036102406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036102a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036103006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036103606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036103c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036104206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036104806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036104e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036105406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036105a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036106006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036106606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036106c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036107206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036107806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036107e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036108406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036108a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036109006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036109606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036109c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610a206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610a806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610ae06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610b406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610ba06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610c006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610c606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610cc06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610d206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610d806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610de06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610e406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610ea06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610f006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610f606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016003610fc06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036110206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036110806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036110e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036111406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036111a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036112006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036112606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036112c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036113206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036113806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036113e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036114406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036114a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036115006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036115606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036115c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036116206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036116806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036116e06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036117406009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036117a06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036118006009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036118606009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036118c06009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036119206009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e0010000160036119806009c2c309010c01090103c50f000900090001c50f000f000f0001c5090009000f0001c50f000a000a0001c50f000f000f0001c50a000a000f0001c50f000b000b0001c50f000f000f0001c50b000b000f0001c50c010901000103c30c000c000d0001c30c000c000e0001c50d010901030103c30d000d000e0001c30d000d000f0001c50e010901060103c30e000e000f0001c30e000e001000016001600c6000c160206000f3109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e02b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd7712e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee291119a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e00ee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e86408dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f52f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d02b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf20319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc63215b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d4280dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f61bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de5591f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f61d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c870504df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b9052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa60b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd103150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d092cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b505c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d602800a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec01ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c46012c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc00b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f844805a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c80c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da532e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb3830509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a7352061c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c9107533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a021576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c07502f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a700923933112c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c45655290c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b541a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd80413ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd6491121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff10e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d329f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba892a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af1151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c504c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f10013b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c296701a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e42ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b021d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc60b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da40955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea06546260f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e132b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e90fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f221e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a9003516243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b1471efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac207ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db6927e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d11ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b815742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c78525851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c7715a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a672411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d200b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c351200248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a80829aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae11e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e649731dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f0922cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af380ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e82841166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee4663006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c31835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd80028201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e70b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c985910b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f1780b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d401f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d40171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e5042330c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b1688731162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc01e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f93264788751f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f01923f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d590f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a815871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d14204e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f23058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c01382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b523f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a580a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f206ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d0113d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b1169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb210998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e3686018168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea611110646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c7110beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa3360a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf18600980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f4512c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c5561c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f702cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf7723ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc6303050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd781da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a41b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f121e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf080f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb241001671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c23200fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f80fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d221da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e4228325161", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : [ + "0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001" + ], + "gasLimit" : [ + "0x3b9aca00" + ], + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "sender" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "to" : "0xbe7c43a580000000000000000000000000000001", + "value" : [ + "0x00" + ] + } + } +} \ No newline at end of file diff --git a/test/internal_benchmarks/CMakeLists.txt b/test/internal_benchmarks/CMakeLists.txt index 4b5228d687..7dd38f20a5 100644 --- a/test/internal_benchmarks/CMakeLists.txt +++ b/test/internal_benchmarks/CMakeLists.txt @@ -9,4 +9,4 @@ add_executable( memory_allocation.cpp ) -target_link_libraries(evmone-bench-internal PRIVATE evmone::evmmax benchmark::benchmark) +target_link_libraries(evmone-bench-internal PRIVATE evmc::evmc evmone::evmmax benchmark::benchmark) diff --git a/test/unittests/CMakeLists.txt b/test/unittests/CMakeLists.txt index d86803d71c..268530062d 100644 --- a/test/unittests/CMakeLists.txt +++ b/test/unittests/CMakeLists.txt @@ -41,6 +41,7 @@ target_sources( evmmax_bn254_add_test.cpp evmmax_bn254_mul_test.cpp evmmax_test.cpp + evmmax_instructions_test.cpp evmmax_secp256k1_test.cpp evmone_test.cpp execution_state_test.cpp @@ -85,7 +86,7 @@ target_sources( statetest_withdrawals_test.cpp tracing_test.cpp ) -target_link_libraries(evmone-unittests PRIVATE evmone evmone::evmmax evmone::experimental evmone::state evmone::statetestutils testutils evmc::instructions GTest::gtest GTest::gtest_main) +target_link_libraries(evmone-unittests PRIVATE evmone evmone::evmmax evmone::experimental evmone::state evmone::statetestutils testutils evmc::instructions evmone-evmmax-precompiles GTest::gtest GTest::gtest_main) target_include_directories(evmone-unittests PRIVATE ${evmone_private_include_dir}) target_compile_options(evmone-unittests PRIVATE # Disable false positive C4789 diff --git a/test/unittests/eof_validation_test.cpp b/test/unittests/eof_validation_test.cpp index faf15c4ceb..ada68b0301 100644 --- a/test/unittests/eof_validation_test.cpp +++ b/test/unittests/eof_validation_test.cpp @@ -307,7 +307,9 @@ TEST_F(eof_validation, EOF1_undefined_opcodes) opcode == OP_SWAPN || opcode == OP_EXCHANGE || opcode == OP_RJUMP || opcode == OP_RJUMPI || opcode == OP_CALLF || opcode == OP_RJUMPV || opcode == OP_DATALOADN || opcode == OP_JUMPF || opcode == OP_EOFCREATE || - opcode == OP_RETURNCONTRACT) + opcode == OP_RETURNCONTRACT || opcode == OP_SETUPX || opcode == OP_ADDMODX || + opcode == OP_SUBMODX || opcode == OP_MULMODX || opcode == OP_LOADX || + opcode == OP_STOREX) continue; // These opcodes are deprecated since Osaka. // gas_cost table current implementation does not allow to undef instructions. diff --git a/test/unittests/evmmax_instructions_test.cpp b/test/unittests/evmmax_instructions_test.cpp new file mode 100644 index 0000000000..9cd9ab132f --- /dev/null +++ b/test/unittests/evmmax_instructions_test.cpp @@ -0,0 +1,454 @@ +// evmone: Fast Ethereum Virtual Machine implementation +// Copyright 2023 The evmone Authors. +// SPDX-License-Identifier: Apache-2.0 + +#include "evm_fixture.hpp" +#include +#include +#include +#include +#include + +using namespace intx; +using namespace evmmax; +using namespace evmc::literals; +using namespace evmone::test; +using evmone::test::evm; + +TEST_P(evm, evmmax_32bytes_modulus_test) +{ + // vm.set_option("trace", "1"); + if (is_advanced()) + return; + + rev = EVMC_EXPERIMENTAL; /// TODO: Use EVMC_EVMMAX + // Modulus == 7 + auto code = mstore(0, 0x07); + // 3 values slots + // Modulus size in bytes + // Modulus offset in EVM memory + // Modulus ID + code += setmodx(3, 256, 0); + // value 3 + code += mstore(32, 0x03); + // value 6 + code += mstore(64, 0x06); + // num values + // values offset + // store values + code += storex(2, 32, 0); + // ADDMODX for values in slots 0 and 1 save result in slot 2 + code += addmodx(2, 1, 0); + // MULMODX for values in slots 1 and 2 save result in slot 2 + code += mulmodx(2, 2, 1); + // SUBMODX for values in slots 1 and 2 save result in slot 2 + code += submodx(2, 2, 1); + // load values from slot 2 into EVM memory + code += loadx(1, 2, 96); + // return loaded result + code += ret(96, 32); + + execute(1000, code); + EXPECT_EQ(result.status_code, EVMC_SUCCESS); + EXPECT_OUTPUT_INT(6); +} + +TEST_P(evm, evmmax_1byte_modulus_test) +{ + if (is_advanced()) + return; + + rev = EVMC_EXPERIMENTAL; /// TODO: Use EVMC_EVMMAX + // Modulus == 7 + auto code = mstore8(0, 0x07); + // 3 values slots + // Modulus size in bytes + // Modulus offset in EVM memory + // Modulus ID + code += setmodx(3, 8, 0); + // value 3 + code += mstore8(1, 0x03); + // value 6 + code += mstore8(2, 0x06); + // num values + // values offset + // store values + code += storex(2, 1, 0); + // ADDMODX for values in slots 0 and 1 save result in slot 2 + code += addmodx(2, 1, 0); + // MULMODX for values in slots 1 and 2 save result in slot 2 + code += mulmodx(2, 2, 1); + // SUBMODX for values in slots 1 and 2 save result in slot 2 + code += submodx(2, 2, 1); + // load values from slot 2 into EVM memory + code += loadx(1, 2, 17); + // return loaded result + code += ret(17, 1); + + execute(1000, code); + EXPECT_EQ(result.status_code, EVMC_SUCCESS); + + ASSERT_EQ(result.output_size, 1); + EXPECT_EQ(hex({result.output_data, result.output_size}), "06"); +} + +TEST_P(evm, evmmax_2byte_modulus_test) +{ + if (is_advanced()) + return; + + rev = EVMC_EXPERIMENTAL; /// TODO: Use EVMC_EVMMAX + // Modulus == 263 (0x0107) + auto code = mstore8(0, 0x01); + code += mstore8(1, 0x07); + // 3 values slots + // Modulus size in bytes + // Modulus offset in EVM memory + // Modulus ID + code += setmodx(3, 9, 0); + // value 258 + code += mstore8(2, 0x01); + code += mstore8(3, 0x02); + // value 254 + code += mstore8(4, 0x00); + code += mstore8(5, 0xfe); + // num values + // values offset + // store values + code += storex(2, 2, 0); + // ADDMODX for values in slots 0 and 1 save result in slot 2 + code += addmodx(2, 1, 0); // 258 + 254 = 249 mod 263 + // MULMODX for values in slots 1 and 2 save result in slot 2 + code += mulmodx(2, 2, 1); // 249 * 254 = 126 mod 263 + // SUBMODX for values in slots 1 and 2 save result in slot 2 + code += submodx(2, 2, 1); // 126 - 254 = 135 mod 263 + // load values from slot 2 into EVM memory + code += loadx(1, 2, 18); + // return loaded result + code += ret(18, 2); + + execute(1000, code); + EXPECT_EQ(result.status_code, EVMC_SUCCESS); + + ASSERT_EQ(result.output_size, 2); + EXPECT_EQ(hex({result.output_data, result.output_size}), "0087"); +} + + +TEST_P(evm, evmmax_poseidon_hash) +{ + if (is_advanced()) + return; + + rev = EVMC_EXPERIMENTAL; + // vm.set_option("histogram", "1"); + + for (const auto& code : { + create_poseidon_hash_bytecode(), + create_poseidon_hash_bytecode_datacopy(), + create_poseidon_hash_bytecode_vectorized(), + create_poseidon_hash_bytecode_vectorized_datacopy(), + }) + { + // std::cout << hex(code) << std::endl; + + // vm.set_option("trace", "1"); + uint8_t calldata[2 * sizeof(uint256)]; + intx::be::unsafe::store(calldata, 2_u256); + intx::be::unsafe::store(&calldata[32], 1_u256); + + // std::cout << hex({calldata, 64}) << std::endl; + + execute(6000, code, {calldata, 64}); + EXPECT_EQ(result.status_code, EVMC_SUCCESS); + + ASSERT_EQ(result.output_size, 32); + EXPECT_EQ(hex({result.output_data, result.output_size}), + "1576c555b70c9b778666e91d600fdc6d73f30aeed2f6adc5360d6a052259775a"); + } +} + +namespace +{ +std::array f_12289_512 = {5072, 8090, 3251, 4761, 259, 10870, 1822, 9635, 5563, 5405, + 3608, 11161, 294, 3226, 1677, 3462, 1785, 5110, 12000, 9790, 7452, 906, 2811, 5750, 8453, 5570, + 5461, 3876, 9416, 2202, 1440, 5014, 11755, 5161, 10296, 12009, 10171, 762, 9795, 5892, 2884, + 6733, 9129, 3340, 1423, 1335, 4953, 7012, 6458, 1816, 10030, 7817, 7748, 729, 11021, 5222, 2349, + 8945, 3140, 2398, 2129, 10243, 5994, 1556, 9535, 9028, 4646, 11899, 12083, 1198, 10295, 9255, + 9749, 5497, 11392, 4049, 10550, 11244, 8646, 596, 7640, 5203, 6058, 10422, 2769, 2784, 7348, + 6243, 1093, 6640, 11396, 6726, 2822, 6098, 3015, 12175, 7507, 9182, 8089, 2086, 6267, 1242, + 8082, 2546, 4720, 4335, 10936, 368, 2080, 7503, 11523, 2520, 1058, 8929, 773, 5836, 11288, 696, + 5564, 10372, 1651, 10698, 3574, 1320, 5700, 4578, 10861, 2374, 10233, 6116, 318, 5994, 5322, + 5558, 5276, 5494, 8935, 5439, 4989, 10624, 1941, 6114, 10181, 5860, 10009, 10573, 919, 3650, + 5539, 12058, 3204, 4697, 2973, 6653, 3769, 11981, 6095, 1801, 4735, 281, 2774, 896, 6530, 4436, + 2023, 8922, 638, 5135, 9951, 2169, 138, 3770, 2404, 596, 5005, 43, 2811, 9260, 361, 5893, 4499, + 12094, 4258, 1530, 10634, 8281, 3924, 11571, 10972, 2128, 8886, 5940, 4747, 6567, 4002, 8715, + 11384, 2133, 910, 3965, 12200, 10022, 11833, 2774, 7570, 10516, 2318, 7897, 754, 11516, 7309, + 677, 4652, 3835, 4237, 7288, 10272, 11569, 5574, 496, 5151, 2371, 10489, 11654, 5160, 11469, + 2002, 5790, 7262, 4514, 4185, 1678, 11862, 1077, 11158, 9803, 7047, 5967, 518, 8277, 6452, 7011, + 10680, 10674, 2879, 8136, 2122, 9113, 11702, 12127, 10159, 10528, 6382, 268, 1662, 11568, 10474, + 1650, 5405, 8010, 158, 10765, 7669, 5126, 378, 4824, 2246, 6048, 6482, 3401, 3533, 1227, 9056, + 10721, 6168, 5591, 1709, 5382, 10322, 119, 10952, 7398, 1089, 8054, 5386, 169, 6123, 10320, + 6528, 835, 7537, 9583, 8088, 3305, 2600, 253, 1600, 3917, 5067, 2609, 11206, 9971, 3542, 5237, + 8032, 9302, 11116, 8318, 5113, 5532, 4116, 6302, 4835, 10887, 10584, 3121, 10898, 2566, 862, + 3682, 4542, 4687, 11756, 7591, 8933, 11449, 7425, 11949, 12144, 12150, 11117, 3893, 6760, 2474, + 5608, 4600, 5257, 10302, 9479, 3669, 10474, 6024, 5116, 1694, 10068, 8696, 2952, 7950, 9815, + 10984, 1793, 1432, 4982, 2747, 11624, 5523, 12102, 11454, 9363, 11238, 6786, 89, 11561, 5191, + 8371, 9858, 2443, 9511, 6935, 3466, 2413, 7184, 2220, 7969, 8114, 2676, 8155, 4700, 1526, 6990, + 6560, 2175, 5996, 8774, 7979, 5700, 7978, 9105, 5002, 6389, 3717, 9257, 11191, 5401, 3788, 650, + 6862, 2963, 5464, 2379, 9247, 8596, 378, 6691, 10332, 5180, 11576, 2738, 4240, 3689, 10220, + 11791, 1200, 589, 106, 1977, 84, 3611, 10622, 4478, 5077, 8266, 8542, 9452, 7064, 195, 2368, + 10009, 5252, 4472, 7469, 2963, 2665, 7070, 7021, 11234, 4248, 8827, 3998, 3065, 2318, 8337, + 6739, 9458, 10469, 6657, 6753, 1705, 5488, 9437, 9681, 9990, 11040, 2338, 10791, 3418, 3245, + 9798, 6672, 1776, 9627, 7953, 3630, 1393, 10813, 10636, 11431, 11199, 4470, 6058, 4495, 8943, + 3211, 10085, 10482, 6176, 3616, 1869, 8294, 827, 678, 10921, 2834, 8347, 8421, 4431, 2225, 161, + 12040, 6115, 1045, 10236, 9898, 6315, 11291, 2307, 7319, 1994, 7858, 7642, 3512, 3911, 8390, + 8500, 6477, 11285, 1243, 9359, 7980, 2372, 2816, 7228}; + +std::array f_ntt_12289_512 = {10406, 8420, 7776, 8647, 10107, 8228, 7297, 10926, + 3501, 2935, 5129, 11962, 11156, 7609, 5154, 4684, 6430, 1265, 6357, 3401, 6791, 8683, 4150, + 6869, 5276, 11240, 10820, 2599, 3575, 6090, 2327, 7449, 10091, 9704, 11656, 4069, 7297, 7382, + 9016, 6444, 2730, 2043, 6340, 10818, 8527, 11287, 1102, 1748, 9946, 6134, 2976, 10774, 10666, + 5691, 3048, 6671, 8045, 3556, 1089, 8304, 4370, 11489, 8073, 4755, 4853, 6204, 7435, 3393, 24, + 4613, 7291, 6435, 2621, 7546, 5170, 3705, 10596, 11556, 2428, 6800, 2986, 4187, 7548, 7817, + 6539, 3005, 7208, 10928, 9103, 7881, 10402, 1551, 9587, 2165, 864, 632, 2952, 4156, 10531, 5509, + 8327, 9065, 8828, 4986, 9864, 9108, 73, 4106, 11242, 9938, 4492, 8637, 11733, 3703, 2008, 2753, + 117, 6927, 2865, 6034, 7921, 8773, 9773, 10340, 8925, 738, 946, 4220, 11973, 5415, 4128, 2641, + 1471, 7941, 490, 2136, 6012, 11934, 8917, 2605, 10911, 11443, 928, 6518, 3974, 4893, 3891, 2259, + 11676, 6130, 329, 255, 11945, 8037, 2198, 315, 11299, 7401, 8709, 10369, 3488, 1900, 11744, + 11590, 6646, 1652, 3312, 6933, 8649, 4685, 9678, 4752, 8316, 10381, 9676, 9141, 4635, 9180, + 12064, 10873, 8257, 9911, 2382, 4883, 8228, 5847, 11638, 1147, 3037, 2888, 6620, 9557, 4215, + 3682, 1695, 2415, 1, 8500, 7772, 4423, 2128, 10125, 10654, 9608, 8433, 5888, 3570, 10442, 1398, + 10647, 10178, 8011, 6003, 10642, 6574, 11955, 388, 6790, 2276, 10788, 3681, 6790, 12053, 5536, + 8043, 178, 7422, 3232, 9286, 3057, 2121, 6122, 9891, 5716, 331, 9675, 5674, 6883, 8454, 3976, + 11542, 7637, 4716, 7188, 8560, 4665, 3266, 3368, 1710, 7479, 7936, 4930, 9127, 9169, 4726, 6618, + 11753, 11431, 10184, 1175, 8050, 10558, 10354, 7200, 2334, 7912, 11452, 8292, 8855, 9157, 10078, + 9383, 6904, 2353, 12064, 8558, 5560, 2003, 7173, 12123, 5068, 6525, 4572, 5887, 8825, 11302, + 7893, 9685, 3244, 8457, 2686, 10712, 3250, 851, 10945, 11544, 4826, 11341, 7494, 2428, 4188, + 8754, 2972, 9687, 9913, 676, 156, 10861, 12139, 3158, 165, 2129, 2657, 2755, 2708, 11352, 5258, + 7384, 5308, 5440, 10059, 8614, 7221, 10502, 8790, 6124, 3431, 952, 7358, 1631, 3066, 9394, 5138, + 7157, 5884, 2687, 10259, 5053, 9079, 6092, 553, 7807, 3130, 5141, 1200, 10240, 6394, 6360, 8349, + 9027, 9947, 6386, 615, 2091, 3541, 4074, 3468, 992, 4103, 10906, 5105, 8278, 701, 4334, 1823, + 6151, 4983, 4684, 8924, 2912, 10295, 3715, 6561, 3702, 1992, 9406, 2175, 2279, 8603, 7267, 3744, + 1442, 534, 4119, 7014, 8352, 7391, 5106, 10284, 9061, 4553, 2421, 10066, 6373, 4668, 5490, 1189, + 10698, 2365, 3736, 8108, 5851, 11733, 10118, 694, 7199, 9614, 6897, 1502, 1734, 5064, 11541, + 3216, 9593, 7139, 9974, 9886, 3964, 1288, 6216, 8357, 9460, 11530, 898, 4678, 3334, 2415, 9454, + 1628, 352, 1588, 9287, 5350, 9565, 104, 9041, 8817, 4233, 9566, 5327, 1208, 4537, 1141, 4929, + 5687, 1424, 942, 5266, 5443, 2389, 7962, 469, 11823, 9818, 4662, 8858, 4439, 7273, 9993, 6357, + 1814, 7332, 1307, 7394, 10094, 4717, 10879, 3500, 63, 3945, 11660, 8270, 9140, 5362, 12014, + 6845, 7187, 9343, 4754, 8062, 8744, 10365, 6450, 4492, 7748, 10390, 9713, 11143, 4370, 5462, + 10072, 7694, 1672, 11895, 1263, 8632, 10679, 8134, 9211, 10825, 9325, 2776, 5248, 130, 1364, + 3280, 5997, 8689, 1304, 840, 7365, 7458}; + + +} // namespace + +TEST_P(evm, ntt) +{ + if (is_advanced()) + return; + + rev = EVMC_EXPERIMENTAL; + vm.set_option("validate_eof", "1"); + // vm.set_option("histogram", "1"); + // vm.set_option("trace", "1"); + + uint8_t calldata[2 * 512 * 2]; + uint8_t result_data[2 * 512]; + + for (size_t i = 0; i < f_12289_512.size(); ++i) + { + intx::be::unsafe::store(&calldata[i * 2], f_12289_512[i]); + intx::be::unsafe::store(&result_data[i * 2], f_ntt_12289_512[i]); + } + + for (const auto& code : {create_nttfw_bytecode()}) + { + std::cout << hex(code) << std::endl; + // std::cout << code.size() << std::endl; + + execute(30000, code, {calldata, 2 * 512}); + EXPECT_EQ(result.status_code, EVMC_SUCCESS); + + size_t log_idx = 0; + for (const auto& l : this->host.recorded_logs) + { + std::cout << "log " << log_idx << std::endl; + for (size_t i = 0; i < l.data.size(); i = i + 2) + std::cout << i / 2 << ": " << intx::be::unsafe::load(l.data.data() + i) + << std::endl; + + log_idx++; + } + + ASSERT_EQ(result.output_size, 2 * 512); + EXPECT_EQ(hex({result.output_data, result.output_size}), hex({result_data, 2 * 512})); + } +} + +TEST_P(evm, ntt_shuffle) +{ + if (is_advanced()) + return; + + rev = EVMC_EXPERIMENTAL; + vm.set_option("validate_eof", "1"); + // vm.set_option("trace", "1"); + + { + uint8_t calldata[2 * 64]; + uint8_t result_data[2 * 64]; + + std::array test_data = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63}; + + std::array expected_result = {0, 4, 1, 5, 2, 6, 3, 7, 8, 12, 9, 13, 10, 14, + 11, 15, 16, 20, 17, 21, 18, 22, 19, 23, 24, 28, 25, 29, 26, 30, 27, 31, 32, 36, 33, 37, + 34, 38, 35, 39, 40, 44, 41, 45, 42, 46, 43, 47, 48, 52, 49, 53, 50, 54, 51, 55, 56, 60, + 57, 61, 58, 62, 59, 63}; + + for (size_t i = 0; i < 64; ++i) + { + intx::be::unsafe::store(&calldata[i * 2], test_data[i]); + intx::be::unsafe::store(&result_data[i * 2], expected_result[i]); + } + + const auto code = create_shuffle_bytecode_test(64, 8); + + execute(50000, code, {calldata, 2 * 64}); + EXPECT_EQ(result.status_code, EVMC_SUCCESS); + + ASSERT_EQ(result.output_size, 2 * 64); + EXPECT_EQ(hex({result.output_data, result.output_size}), hex({result_data, 2 * 64})); + } +} + +TEST_P(evm, ntt_spread) +{ + { + if (is_advanced()) + return; + rev = EVMC_EXPERIMENTAL; + vm.set_option("validate_eof", "1"); + + uint8_t calldata[2 * 64]; + uint8_t result_data[2 * 64]; + + std::array test_data = {0, 1, 2, 3, 4, 5, 6, 7}; + + std::array expected_result = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, + 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7}; + + for (size_t i = 0; i < 8; ++i) + intx::be::unsafe::store(&calldata[i * 2], test_data[i]); + + for (size_t i = 0; i < 8 * 4; ++i) + intx::be::unsafe::store(&result_data[i * 2], expected_result[i]); + + const auto code = create_spread_bytecode_test(8, 4); + + execute(50000, code, {calldata, 2 * 8}); + EXPECT_EQ(result.status_code, EVMC_SUCCESS); + + ASSERT_EQ(result.output_size, 2 * 4 * 8); + EXPECT_EQ(hex({result.output_data, result.output_size}), hex({result_data, 2 * 4 * 8})); + } +} + +namespace +{ +std::vector generate_random_bytecode() +{ + std::vector res; + res.reserve(6); + + std::array< + std::function, 3> + evmmax_opcodes = { + static_cast(&addmodx), + static_cast(&submodx), + static_cast(&mulmodx), + }; + + for (const auto& op : evmmax_opcodes) + { + auto code = mstore8(0, push(12289_u256 >> 8)) + mstore8(1, push(12289_u256)) + + setmodx(256, 14, 0) + mstore8(0, push(static_cast(rand() % 0xff))) + + mstore8(1, push(static_cast(rand() % 0xff))) + storex(1, 0, 0) + + addmodx(1, 1, 0, 0, 1, 1, 254); + + for (size_t i = 0; i < 3000; ++i) + { + code += op(static_cast(rand() % 0xff), 0, static_cast(rand() % 0xff), + 0, static_cast(rand() % 0xff), 0, 1); + } + + code += loadx(256, 0, 0); + code += ret(0, 256 * 2); + + code = eof_bytecode(code, 3); + + res.emplace_back(code); + } + + for (const auto& op : evmmax_opcodes) + { + auto code = mstore8(0, push(12289_u256 >> 8)) + mstore8(1, push(12289_u256)) + + setmodx(256, 14, 0) + mstore8(0, push(static_cast(rand() % 0xff))) + + mstore8(1, push(static_cast(rand() % 0xff))) + storex(1, 0, 0) + + addmodx(1, 1, 0, 0, 1, 1, 254); + + for (size_t i = 0; i < 3000; ++i) + { + const auto dst_idx = static_cast(rand() % 0xff); + const auto x_idx = static_cast(rand() % 0xff); + const auto y_idx = static_cast(rand() % 0xff); + + const auto count = static_cast(rand() % 32); + + const auto dst_stride = static_cast((255 - dst_idx) / count); + const auto x_stride = static_cast((255 - x_idx) / count); + const auto y_stride = static_cast((255 - y_idx) / count); + + code += op(dst_idx, dst_stride, x_idx, x_stride, y_idx, y_stride, count); + } + + code += loadx(256, 0, 0); + code += ret(0, 256 * 2); + + code = eof_bytecode(code, 3); + + res.emplace_back(code); + } + + return res; +} + +} // namespace + +TEST_P(evm, evmmax_bench) +{ + { + if (is_advanced()) + return; + rev = EVMC_EXPERIMENTAL; + vm.set_option("validate_eof", "1"); + + for (const auto& code : generate_random_bytecode()) + { + std::cout << hex(code) << std::endl; + std::cout << code.size() << std::endl; + + execute(50000, code); + + // std::cout << hex({result.output_data, result.output_size}) << std::endl; + + EXPECT_EQ(result.status_code, EVMC_SUCCESS); + } + } +} diff --git a/test/unittests/evmmax_test.cpp b/test/unittests/evmmax_test.cpp index e078623caa..431c8d30be 100644 --- a/test/unittests/evmmax_test.cpp +++ b/test/unittests/evmmax_test.cpp @@ -2,12 +2,14 @@ // Copyright 2023 The evmone Authors. // SPDX-License-Identifier: Apache-2.0 +#include "evm_fixture.hpp" #include #include #include using namespace intx; using namespace evmmax; +using evmone::test::evm; constexpr auto P23 = 23_u256; constexpr auto BN254Mod = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47_u256; @@ -147,3 +149,188 @@ TYPED_TEST(evmmax_test, mul) } } } + +namespace +{ +using namespace evmone::test; +template +inline bytecode create_test_bytecode() +{ + constexpr auto size = sizeof(UintT); + return calldatacopy(push(0), push(0), push(size * 3)) + setmodx(3, size * 8, 0) + + storex(2, size, 0) + mulmodx(2, 1, 0) + loadx(1, 2, size * 3) + ret(size * 3, size); +} + +} // namespace + +TEST_P(evm, exec_bn254_test) +{ + using namespace evmone::test; + + if (evm::is_advanced()) + return; + + evm::rev = EVMC_EXPERIMENTAL; /// TODO: Use EVMC_EVMMAX + + const ModA m; + + uint8_t calldata[3 * sizeof(uint256)]; + intx::be::unsafe::store(&calldata[0], BN254Mod); + + const auto values = get_test_values(m); + + const auto code = create_test_bytecode(); + + for (const auto& x : values) + { + for (const auto& y : values) + { + const auto expected = udivrem(umul(x, y), m.mod).rem; + + intx::be::unsafe::store(&calldata[32], x); + intx::be::unsafe::store(&calldata[64], y); + + execute(1000, code, {calldata, 96}); + EXPECT_EQ(result.status_code, EVMC_SUCCESS); + EXPECT_OUTPUT_INT(expected); + } + } +} + +TEST_P(evm, exec_bls_test) +{ + using namespace evmone::test; + + if (evm::is_advanced()) + return; + + evm::rev = EVMC_EXPERIMENTAL; /// TODO: Use EVMC_EVMMAX + + const ModA m; + + constexpr auto size = sizeof(uint384); + uint8_t calldata[3 * size]; + intx::be::unsafe::store(&calldata[0], BLS12384Mod); + + const auto values = get_test_values(m); + + const auto code = create_test_bytecode(); + + for (const auto& x : values) + { + for (const auto& y : values) + { + const auto expected = udivrem(umul(x, y), m.mod).rem; + + intx::be::unsafe::store(&calldata[size], x); + intx::be::unsafe::store(&calldata[size * 2], y); + + execute(1000, code, {calldata, size * 3}); + EXPECT_EQ(result.status_code, EVMC_SUCCESS); + ASSERT_EQ(result.output_size, size); + EXPECT_EQ(intx::be::unsafe::load(result.output_data), expected); + } + } +} + +TEST_P(evm, exec_invalid_test) +{ + using namespace evmone::test; + + if (evm::is_advanced()) + return; + + evm::rev = EVMC_EXPERIMENTAL; /// TODO: Use EVMC_EVMMAX + + { + // Even modulus + constexpr auto size = sizeof(uint256); + uint8_t calldata[3 * size]; + + const auto code = create_test_bytecode(); + intx::be::unsafe::store(&calldata[0], BN254Mod + 1); + execute(1000, code, {calldata, size * 3}); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + } + + { + // Modulus too big + constexpr auto size = sizeof(intx::uint<4160>); + uint8_t calldata[3 * size]; + + const auto code = create_test_bytecode>(); + intx::be::unsafe::store(&calldata[0], intx::uint<4160>(7)); + execute(1000, code, {calldata, size * 3}); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + } + + { + // Too many value slots + constexpr auto size = sizeof(uint256); + uint8_t calldata[size]; + + const auto code = calldatacopy(push(0), push(0), push(size)) + setmodx(257, size, 0); + intx::be::unsafe::store(&calldata[0], BN254Mod); + execute(1000, code, {calldata, size}); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + } + + { + // not enough gas + constexpr auto size = sizeof(uint256); + uint8_t calldata[3 * size]; + + const auto code = create_test_bytecode(); + intx::be::unsafe::store(&calldata[0], BN254Mod); + execute(45, code, {calldata, size * 3}); + EXPECT_EQ(result.status_code, EVMC_OUT_OF_GAS); + } + + { + // Too much evmmax memory used + constexpr auto size = sizeof(intx::uint<2048>); + uint8_t calldata[size * 3]; + + const auto code = calldatacopy(push(0), push(0), push(size)) + setmodx(1, size, 0) + + setmodx(256, size, 0); + intx::be::unsafe::store(&calldata[0], intx::uint<2048>(BN254Mod)); + execute(1000, code, {calldata, size}); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + } + + { + // Invalid instruction index + constexpr auto size = sizeof(intx::uint<256>); + uint8_t calldata[size * 3]; + + const auto common_code = calldatacopy(push(0), push(0), push(size)) + setmodx(1, size, 0); + intx::be::unsafe::store(&calldata[0], intx::uint<256>(BN254Mod)); + + execute(1000, common_code + addmodx(0, 0, 2), {calldata, size}); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + + execute(1000, common_code + mulmodx(0, 0, 2), {calldata, size}); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + + execute(1000, common_code + submodx(0, 0, 2), {calldata, size}); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + } + + { + // No active modulus + execute(1000, addmodx(0, 0, 1)); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + + execute(1000, mulmodx(0, 0, 2)); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + + execute(1000, submodx(0, 0, 2)); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + + execute(1000, loadx(1, 0, 0)); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + + execute(1000, storex(1, 0, 0)); + EXPECT_EQ(result.status_code, EVMC_FAILURE); + } +} diff --git a/test/unittests/instructions_test.cpp b/test/unittests/instructions_test.cpp index c868066977..2db8f3ee6c 100644 --- a/test/unittests/instructions_test.cpp +++ b/test/unittests/instructions_test.cpp @@ -67,6 +67,8 @@ constexpr void validate_traits_of() noexcept static_assert(tr.immediate_size == 1); else if constexpr (Op == OP_DATALOADN) static_assert(tr.immediate_size == 2); + else if constexpr (Op == OP_ADDMODX || Op == OP_SUBMODX || Op == OP_MULMODX) + static_assert(tr.immediate_size == 7); else static_assert(tr.immediate_size == 0); // Including RJUMPV. @@ -97,7 +99,7 @@ static_assert(validate_traits(std::make_index_sequence<256>{})); // Check some cases for has_const_gas_cost(). static_assert(instr::has_const_gas_cost(OP_STOP)); static_assert(instr::has_const_gas_cost(OP_ADD)); -static_assert(instr::has_const_gas_cost(OP_PUSH1)); +// static_assert(instr::has_const_gas_cost(OP_PUSH1)); static_assert(!instr::has_const_gas_cost(OP_SHL)); static_assert(!instr::has_const_gas_cost(OP_BALANCE)); static_assert(!instr::has_const_gas_cost(OP_SLOAD)); @@ -115,6 +117,12 @@ constexpr bool instruction_only_in_evmone(evmc_revision rev, Opcode op) noexcept switch (op) { + case OP_SETUPX: + case OP_ADDMODX: + case OP_SUBMODX: + case OP_MULMODX: + case OP_LOADX: + case OP_STOREX: case OP_BLOBHASH: case OP_BLOBBASEFEE: case OP_RJUMP: diff --git a/test/utils/bytecode.hpp b/test/utils/bytecode.hpp index 8ee590d2a4..17cce917e7 100644 --- a/test/utils/bytecode.hpp +++ b/test/utils/bytecode.hpp @@ -433,6 +433,11 @@ inline bytecode returndatacopy(bytecode dst, bytecode src, bytecode size) return std::move(size) + std::move(src) + std::move(dst) + OP_RETURNDATACOPY; } +inline bytecode datacopy(bytecode dst, bytecode src, bytecode size) +{ + return std::move(size) + std::move(src) + std::move(dst) + OP_DATACOPY; +} + inline bytecode sstore(bytecode index, bytecode value) { return value + index + OP_SSTORE; @@ -468,6 +473,62 @@ inline bytecode blobhash(bytecode index) return index + OP_BLOBHASH; } +inline bytecode setmodx(bytecode num_val_slots, bytecode mod_size, bytecode mod_offset) +{ + return num_val_slots + mod_size + mod_offset + OP_SETUPX; +} + +inline bytecode storex(bytecode num_vals, bytecode val_offset, bytecode val_slot) +{ + return num_vals + val_offset + val_slot + OP_STOREX; +} + +inline bytecode loadx(bytecode num_vals, bytecode val_idx, bytecode mem_offset) +{ + return num_vals + val_idx + mem_offset + OP_LOADX; +} + +inline bytecode log0(bytecode offset, bytecode size) +{ + return size + offset + OP_LOG0; +} + +inline bytecode addmodx(uint8_t dst_idx, uint8_t dst_stride, uint8_t x_idx, uint8_t x_stride, + uint8_t y_idx, uint8_t y_stride, uint8_t count) +{ + return hex(OP_ADDMODX) + hex(dst_idx) + hex(dst_stride) + hex(x_idx) + hex(x_stride) + + hex(y_idx) + hex(y_stride) + hex(count); +} + +inline bytecode submodx(uint8_t dst_idx, uint8_t dst_stride, uint8_t x_idx, uint8_t x_stride, + uint8_t y_idx, uint8_t y_stride, uint8_t count) +{ + return hex(OP_SUBMODX) + hex(dst_idx) + hex(dst_stride) + hex(x_idx) + hex(x_stride) + + hex(y_idx) + hex(y_stride) + hex(count); +} + +inline bytecode mulmodx(uint8_t dst_idx, uint8_t dst_stride, uint8_t x_idx, uint8_t x_stride, + uint8_t y_idx, uint8_t y_stride, uint8_t count) +{ + return hex(OP_MULMODX) + hex(dst_idx) + hex(dst_stride) + hex(x_idx) + hex(x_stride) + + hex(y_idx) + hex(y_stride) + hex(count); +} + +inline bytecode addmodx(uint8_t dst_idx, uint8_t x_idx, uint8_t y_idx) +{ + return addmodx(dst_idx, 0, x_idx, 0, y_idx, 0, 1); +} + +inline bytecode submodx(uint8_t dst_idx, uint8_t x_idx, uint8_t y_idx) +{ + return submodx(dst_idx, 0, x_idx, 0, y_idx, 0, 1); +} + +inline bytecode mulmodx(uint8_t dst_idx, uint8_t x_idx, uint8_t y_idx) +{ + return mulmodx(dst_idx, 0, x_idx, 0, y_idx, 0, 1); +} + template struct call_instruction { diff --git a/test/utils/utils.cpp b/test/utils/utils.cpp index a3abe5b660..8a55367837 100644 --- a/test/utils/utils.cpp +++ b/test/utils/utils.cpp @@ -39,6 +39,8 @@ evmc_revision to_rev(std::string_view s) return EVMC_PRAGUE; if (s == "Osaka") return EVMC_OSAKA; + if (s == "Experimental") + return EVMC_EXPERIMENTAL; throw std::invalid_argument{"unknown revision: " + std::string{s}}; }