From 68c68eae0a0b41a0465015d07ef12315327fb688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Vincent?= <28714795+leovct@users.noreply.github.com> Date: Fri, 17 Nov 2023 07:51:08 +0100 Subject: [PATCH 1/5] chore: drop successful swap msg to trace level in `uniswapv3` mode (#161) --- cmd/loadtest/uniswapv3/swap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/loadtest/uniswapv3/swap.go b/cmd/loadtest/uniswapv3/swap.go index 15300c3a..33603889 100644 --- a/cmd/loadtest/uniswapv3/swap.go +++ b/cmd/loadtest/uniswapv3/swap.go @@ -43,7 +43,7 @@ func ExactInputSingleSwap(tops *bind.TransactOpts, swapRouter *uniswapv3.SwapRou log.Error().Err(err).Str("tokenIn", swapDirection.tokenInName).Str("tokenOut", swapDirection.tokenOutName).Interface("amountIn", amountIn).Msg("Unable to swap") return err } - log.Debug().Str("tokenIn", swapDirection.tokenInName).Str("tokenOut", swapDirection.tokenOutName).Interface("amountIn", amountIn).Msg("Successful swap") + log.Trace().Str("tokenIn", swapDirection.tokenInName).Str("tokenOut", swapDirection.tokenOutName).Interface("amountIn", amountIn).Msg("Successful swap") return nil } From 601409d7edc2bdfc5736eff6b974828e18e77767 Mon Sep 17 00:00:00 2001 From: Idris Hanafi Date: Fri, 17 Nov 2023 13:07:56 -0500 Subject: [PATCH 2/5] feat: RPC Reason Error Message Conformance (#153) * feat: reason error message conformance * lint: fix ineffectual assignment * feat: small changes - geth tests passing again - simple contract for conformance - minor refactors - script to regenerate json rpc types future: - re-add minting to contract (similar to ERC20) and re-add the conformance tests for it * feat: readding debug_getRawTransaction and debug_traceTransaction tests for contract methods * clean: delete unused file * feat: re-add contract address flag and early return on deployment failure * lint: declaration of "err" shadows declaration --- .gitignore | 1 + Makefile | 5 + cmd/loadtest/loadtest.go | 9 +- cmd/loadtest/uniswapv3/deploy.go | 5 +- cmd/loadtest/uniswapv3/pool.go | 7 +- cmd/loadtest/uniswapv3/swapper.go | 5 +- cmd/rpcfuzz/cmd.go | 2 +- cmd/rpcfuzz/rpcfuzz.go | 184 +- .../conformancetester/ConformanceTester.abi | 1 + .../conformancetester/ConformanceTester.bin | 1 + .../conformancetester/ConformanceTester.go | 346 + .../conformancetester/ConformanceTester.sol | 20 + contracts/contracts.go | 38 +- contracts/loadtester/LoadTester.go | 1819 ---- .../loadtest/uniswapv3 => contracts}/types.go | 6 +- doc/polycli_rpcfuzz.md | 2 +- rpctypes/{schemas => jsonschemas}/README.org | 7 + rpctypes/jsonschemas/debug_getBadBlocks.json | 731 ++ rpctypes/jsonschemas/debug_getRawBlock.json | 5 + rpctypes/jsonschemas/debug_getRawHeader.json | 5 + .../debug_getRawReceipts.json} | 0 .../jsonschemas/debug_getRawTransaction.json | 5 + .../engine_exchangeCapabilities.json | 6 + ...ine_exchangeTransitionConfigurationV1.json | 26 + .../engine_forkchoiceUpdatedV1.json | 42 + .../engine_forkchoiceUpdatedV2.json | 42 + .../engine_forkchoiceUpdatedV3.json | 42 + .../engine_getPayloadBodiesByHashV1.json | 60 + .../engine_getPayloadBodiesByRangeV1.json | 60 + rpctypes/jsonschemas/engine_getPayloadV1.json | 96 + rpctypes/jsonschemas/engine_getPayloadV2.json | 248 + rpctypes/jsonschemas/engine_getPayloadV3.json | 203 + rpctypes/jsonschemas/engine_newPayloadV1.json | 29 + rpctypes/jsonschemas/engine_newPayloadV2.json | 28 + rpctypes/jsonschemas/engine_newPayloadV3.json | 28 + .../eth_accounts.json} | 0 rpctypes/jsonschemas/eth_blockNumber.json | 5 + rpctypes/jsonschemas/eth_call.json | 5 + rpctypes/jsonschemas/eth_chainId.json | 5 + rpctypes/jsonschemas/eth_coinbase.json | 5 + .../eth_createAccessList.json} | 2 + rpctypes/jsonschemas/eth_estimateGas.json | 5 + .../eth_feeHistory.json} | 12 + rpctypes/jsonschemas/eth_gasPrice.json | 5 + rpctypes/jsonschemas/eth_getBalance.json | 5 + rpctypes/jsonschemas/eth_getBlockByHash.json | 713 ++ .../jsonschemas/eth_getBlockByNumber.json | 713 ++ .../jsonschemas/eth_getBlockReceipts.json | 200 + .../eth_getBlockTransactionCountByHash.json | 13 + .../eth_getBlockTransactionCountByNumber.json | 13 + rpctypes/jsonschemas/eth_getCode.json | 5 + .../eth_getFilterChanges.json} | 1 + rpctypes/jsonschemas/eth_getFilterLogs.json | 85 + rpctypes/jsonschemas/eth_getLogs.json | 85 + .../eth_getProof.json} | 2 + rpctypes/jsonschemas/eth_getStorageAt.json | 5 + ...eth_getTransactionByBlockHashAndIndex.json | 508 + ...h_getTransactionByBlockNumberAndIndex.json | 508 + .../jsonschemas/eth_getTransactionByHash.json | 508 + .../jsonschemas/eth_getTransactionCount.json | 5 + .../eth_getTransactionReceipt.json | 196 + .../eth_getUncleCountByBlockHash.json | 13 + .../eth_getUncleCountByBlockNumber.json | 13 + .../jsonschemas/eth_maxPriorityFeePerGas.json | 5 + rpctypes/jsonschemas/eth_newBlockFilter.json | 5 + rpctypes/jsonschemas/eth_newFilter.json | 5 + .../eth_newPendingTransactionFilter.json | 5 + .../jsonschemas/eth_sendRawTransaction.json | 5 + rpctypes/jsonschemas/eth_sendTransaction.json | 5 + rpctypes/jsonschemas/eth_sign.json | 5 + rpctypes/jsonschemas/eth_signTransaction.json | 5 + .../eth_syncing.json} | 1 + rpctypes/jsonschemas/eth_uninstallFilter.json | 3 + rpctypes/jsonschemas/openrpc.json | 9443 +++++++++++++++++ .../rpcschemadebugblock.json | 0 .../rpcschemadebugtrace.json | 0 rpctypes/jsonschemas/rpcschemahexarray.json | 9 + .../rpcschemasigntxresponse.json | 0 rpctypes/schemas.go | 28 +- rpctypes/schemas/openrpc.json | 5873 ---------- rpctypes/schemas/rpcschemabadblocks.json | 30 - rpctypes/schemas/rpcschemaethblock.json | 469 - rpctypes/schemas/rpcschemaethreceipt.json | 160 - rpctypes/schemas/rpcschemaethtransaction.json | 323 - scripts/rpctypes.sh | 30 + 85 files changed, 15393 insertions(+), 8765 deletions(-) create mode 100644 contracts/conformancetester/ConformanceTester.abi create mode 100644 contracts/conformancetester/ConformanceTester.bin create mode 100644 contracts/conformancetester/ConformanceTester.go create mode 100644 contracts/conformancetester/ConformanceTester.sol delete mode 100644 contracts/loadtester/LoadTester.go rename {cmd/loadtest/uniswapv3 => contracts}/types.go (60%) rename rpctypes/{schemas => jsonschemas}/README.org (80%) create mode 100644 rpctypes/jsonschemas/debug_getBadBlocks.json create mode 100644 rpctypes/jsonschemas/debug_getRawBlock.json create mode 100644 rpctypes/jsonschemas/debug_getRawHeader.json rename rpctypes/{schemas/rpcschemahexarray.json => jsonschemas/debug_getRawReceipts.json} (100%) create mode 100644 rpctypes/jsonschemas/debug_getRawTransaction.json create mode 100644 rpctypes/jsonschemas/engine_exchangeCapabilities.json create mode 100644 rpctypes/jsonschemas/engine_exchangeTransitionConfigurationV1.json create mode 100644 rpctypes/jsonschemas/engine_forkchoiceUpdatedV1.json create mode 100644 rpctypes/jsonschemas/engine_forkchoiceUpdatedV2.json create mode 100644 rpctypes/jsonschemas/engine_forkchoiceUpdatedV3.json create mode 100644 rpctypes/jsonschemas/engine_getPayloadBodiesByHashV1.json create mode 100644 rpctypes/jsonschemas/engine_getPayloadBodiesByRangeV1.json create mode 100644 rpctypes/jsonschemas/engine_getPayloadV1.json create mode 100644 rpctypes/jsonschemas/engine_getPayloadV2.json create mode 100644 rpctypes/jsonschemas/engine_getPayloadV3.json create mode 100644 rpctypes/jsonschemas/engine_newPayloadV1.json create mode 100644 rpctypes/jsonschemas/engine_newPayloadV2.json create mode 100644 rpctypes/jsonschemas/engine_newPayloadV3.json rename rpctypes/{schemas/rpcschemaaccountlist.json => jsonschemas/eth_accounts.json} (100%) create mode 100644 rpctypes/jsonschemas/eth_blockNumber.json create mode 100644 rpctypes/jsonschemas/eth_call.json create mode 100644 rpctypes/jsonschemas/eth_chainId.json create mode 100644 rpctypes/jsonschemas/eth_coinbase.json rename rpctypes/{schemas/rpcschemaethaccesslist.json => jsonschemas/eth_createAccessList.json} (92%) create mode 100644 rpctypes/jsonschemas/eth_estimateGas.json rename rpctypes/{schemas/rpcschemaethfeehistory.json => jsonschemas/eth_feeHistory.json} (81%) create mode 100644 rpctypes/jsonschemas/eth_gasPrice.json create mode 100644 rpctypes/jsonschemas/eth_getBalance.json create mode 100644 rpctypes/jsonschemas/eth_getBlockByHash.json create mode 100644 rpctypes/jsonschemas/eth_getBlockByNumber.json create mode 100644 rpctypes/jsonschemas/eth_getBlockReceipts.json create mode 100644 rpctypes/jsonschemas/eth_getBlockTransactionCountByHash.json create mode 100644 rpctypes/jsonschemas/eth_getBlockTransactionCountByNumber.json create mode 100644 rpctypes/jsonschemas/eth_getCode.json rename rpctypes/{schemas/rpcschemafilterchanges.json => jsonschemas/eth_getFilterChanges.json} (98%) create mode 100644 rpctypes/jsonschemas/eth_getFilterLogs.json create mode 100644 rpctypes/jsonschemas/eth_getLogs.json rename rpctypes/{schemas/rpcschemaethproof.json => jsonschemas/eth_getProof.json} (96%) create mode 100644 rpctypes/jsonschemas/eth_getStorageAt.json create mode 100644 rpctypes/jsonschemas/eth_getTransactionByBlockHashAndIndex.json create mode 100644 rpctypes/jsonschemas/eth_getTransactionByBlockNumberAndIndex.json create mode 100644 rpctypes/jsonschemas/eth_getTransactionByHash.json create mode 100644 rpctypes/jsonschemas/eth_getTransactionCount.json create mode 100644 rpctypes/jsonschemas/eth_getTransactionReceipt.json create mode 100644 rpctypes/jsonschemas/eth_getUncleCountByBlockHash.json create mode 100644 rpctypes/jsonschemas/eth_getUncleCountByBlockNumber.json create mode 100644 rpctypes/jsonschemas/eth_maxPriorityFeePerGas.json create mode 100644 rpctypes/jsonschemas/eth_newBlockFilter.json create mode 100644 rpctypes/jsonschemas/eth_newFilter.json create mode 100644 rpctypes/jsonschemas/eth_newPendingTransactionFilter.json create mode 100644 rpctypes/jsonschemas/eth_sendRawTransaction.json create mode 100644 rpctypes/jsonschemas/eth_sendTransaction.json create mode 100644 rpctypes/jsonschemas/eth_sign.json create mode 100644 rpctypes/jsonschemas/eth_signTransaction.json rename rpctypes/{schemas/rpcschemaethsyncing.json => jsonschemas/eth_syncing.json} (95%) create mode 100644 rpctypes/jsonschemas/eth_uninstallFilter.json create mode 100644 rpctypes/jsonschemas/openrpc.json rename rpctypes/{schemas => jsonschemas}/rpcschemadebugblock.json (100%) rename rpctypes/{schemas => jsonschemas}/rpcschemadebugtrace.json (100%) create mode 100644 rpctypes/jsonschemas/rpcschemahexarray.json rename rpctypes/{schemas => jsonschemas}/rpcschemasigntxresponse.json (100%) delete mode 100644 rpctypes/schemas/openrpc.json delete mode 100644 rpctypes/schemas/rpcschemabadblocks.json delete mode 100644 rpctypes/schemas/rpcschemaethblock.json delete mode 100644 rpctypes/schemas/rpcschemaethreceipt.json delete mode 100644 rpctypes/schemas/rpcschemaethtransaction.json create mode 100755 scripts/rpctypes.sh diff --git a/.gitignore b/.gitignore index b18058e0..34617920 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ out/ +tmp/ .DS_Store coverage.out diff --git a/Makefile b/Makefile index 87c51f9f..1cced855 100644 --- a/Makefile +++ b/Makefile @@ -91,6 +91,11 @@ gen-go-bindings: ## Generate go bindings for smart contracts. $(call gen_go_binding,contracts/tokens/ERC20,ERC20,tokens,contracts/tokens) $(call gen_go_binding,contracts/tokens/ERC721,ERC721,tokens,contracts/tokens) $(call gen_go_binding,contracts/loadtester,LoadTester,contracts,contracts) + $(call gen_go_binding,contracts/conformancetester,ConformanceTester,conformancetester,contracts/conformancetester) + +.PHONY: gen-json-rpctypes +gen-json-rpctypes: ## Generate go bindings for smart contracts. + ./scripts/rpctypes.sh rpctypes/jsonschemas/ # Generate go binding. # - $1: input_dir diff --git a/cmd/loadtest/loadtest.go b/cmd/loadtest/loadtest.go index 0ad9a70c..326029df 100644 --- a/cmd/loadtest/loadtest.go +++ b/cmd/loadtest/loadtest.go @@ -23,7 +23,6 @@ import ( "github.com/maticnetwork/polygon-cli/rpctypes" "github.com/maticnetwork/polygon-cli/util" - "github.com/cenkalti/backoff/v4" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" @@ -110,7 +109,9 @@ func modeRequiresLoadTestContract(m loadTestMode) bool { m == loadTestModeFunction || m == loadTestModeInc || m == loadTestModeRandom || - m == loadTestModeStore { + m == loadTestModeStore || + m == loadTestModePrecompiledContract || + m == loadTestModePrecompiledContracts { return true } return false @@ -773,9 +774,7 @@ func getERC721Contract(ctx context.Context, c *ethclient.Client, tops *bind.Tran } func blockUntilSuccessful(ctx context.Context, c *ethclient.Client, retryable func() error) error { - // this function use to be very complicated (and not work). I'm dumbing this down to a basic time based retryable which should work 99% of the time - b := backoff.WithContext(backoff.WithMaxRetries(backoff.NewConstantBackOff(5*time.Second), 24), ctx) - return backoff.Retry(retryable, b) + return contracts.BlockUntilSuccessful(ctx, c, retryable) } func loadTestTransaction(ctx context.Context, c *ethclient.Client, nonce uint64) (t1 time.Time, t2 time.Time, err error) { diff --git a/cmd/loadtest/uniswapv3/deploy.go b/cmd/loadtest/uniswapv3/deploy.go index 5c950cf1..77185ab0 100644 --- a/cmd/loadtest/uniswapv3/deploy.go +++ b/cmd/loadtest/uniswapv3/deploy.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/maticnetwork/polygon-cli/contracts" "github.com/maticnetwork/polygon-cli/contracts/uniswapv3" "github.com/rs/zerolog/log" ) @@ -70,7 +71,7 @@ type ( // Deploy the full UniswapV3 contract suite in 15 different steps. // Source: https://github.com/Uniswap/deploy-v3 -func DeployUniswapV3(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, knownAddresses UniswapV3Addresses, ownerAddress common.Address, blockblockUntilSuccessful blockUntilSuccessfulFn) (config UniswapV3Config, err error) { +func DeployUniswapV3(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, knownAddresses UniswapV3Addresses, ownerAddress common.Address, blockblockUntilSuccessful contracts.BlockUntilSuccessfulFn) (config UniswapV3Config, err error) { log.Debug().Msg("Step 0: WETH9 deployment") config.WETH9.Address, config.WETH9.Contract, err = deployOrInstantiateContract( ctx, c, tops, cops, @@ -343,7 +344,7 @@ func deployOrInstantiateContract[T Contract]( deploy func(*bind.TransactOpts, bind.ContractBackend) (common.Address, *types.Transaction, *T, error), instantiate func(common.Address, bind.ContractBackend) (*T, error), call func(*T) error, - blockUntilSuccessful blockUntilSuccessfulFn, + blockUntilSuccessful contracts.BlockUntilSuccessfulFn, ) (address common.Address, contract *T, err error) { if knownAddress == (common.Address{}) { // Deploy the contract if known address is empty. diff --git a/cmd/loadtest/uniswapv3/pool.go b/cmd/loadtest/uniswapv3/pool.go index e34fcc8c..d77c756c 100644 --- a/cmd/loadtest/uniswapv3/pool.go +++ b/cmd/loadtest/uniswapv3/pool.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/maticnetwork/polygon-cli/contracts" "github.com/maticnetwork/polygon-cli/contracts/uniswapv3" "github.com/rs/zerolog/log" ) @@ -89,7 +90,7 @@ type slot struct { // SetupLiquidityPool sets up a UniswapV3 liquidity pool, creating and initializing it if needed, // and providing liquidity in case none exists. -func SetupLiquidityPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, recipient common.Address, blockUntilSuccessful blockUntilSuccessfulFn) error { +func SetupLiquidityPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, recipient common.Address, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) error { // Create and initialise pool. poolContract, err := createPool(ctx, c, tops, cops, uniswapV3Config, poolConfig, blockUntilSuccessful) if err != nil { @@ -118,7 +119,7 @@ func SetupLiquidityPool(ctx context.Context, c *ethclient.Client, tops *bind.Tra } // createPool creates and initialises the UniswapV3 liquidity pool if needed. -func createPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, blockUntilSuccessful blockUntilSuccessfulFn) (*uniswapv3.IUniswapV3Pool, error) { +func createPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) (*uniswapv3.IUniswapV3Pool, error) { // Create and initialize the pool. sqrtPriceX96 := computeSqrtPriceX96(poolConfig.ReserveA, poolConfig.ReserveB) if _, err := uniswapV3Config.NonfungiblePositionManager.Contract.CreateAndInitializePoolIfNecessary(tops, poolConfig.Token0.Address, poolConfig.Token1.Address, poolConfig.Fees, sqrtPriceX96); err != nil { @@ -185,7 +186,7 @@ func getPoolState(cops *bind.CallOpts, contract *uniswapv3.IUniswapV3Pool) (slot } // provideLiquidity provides liquidity to the UniswapV3 pool. -func provideLiquidity(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, poolContract *uniswapv3.IUniswapV3Pool, poolConfig PoolConfig, recipient common.Address, nftPositionManagerContract *uniswapv3.NonfungiblePositionManager, blockUntilSuccessful blockUntilSuccessfulFn) error { +func provideLiquidity(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, poolContract *uniswapv3.IUniswapV3Pool, poolConfig PoolConfig, recipient common.Address, nftPositionManagerContract *uniswapv3.NonfungiblePositionManager, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) error { // Compute the tick lower and upper for providing liquidity. // The default tick spacing is set to 60 for the 0.3% fee tier and unfortunately, `MIN_TICK` and // `MAX_TICK` are not divisible by this amount. The solution is to use a multiple of 60 instead. diff --git a/cmd/loadtest/uniswapv3/swapper.go b/cmd/loadtest/uniswapv3/swapper.go index 0200073c..c5d9e8ed 100644 --- a/cmd/loadtest/uniswapv3/swapper.go +++ b/cmd/loadtest/uniswapv3/swapper.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/maticnetwork/polygon-cli/contracts" "github.com/maticnetwork/polygon-cli/contracts/uniswapv3" "github.com/rs/zerolog/log" ) @@ -24,7 +25,7 @@ var ( ) // Deploy an ERC20 token. -func DeployERC20(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, tokenName, tokenSymbol string, amount *big.Int, recipient common.Address, tokenKnownAddress common.Address, blockUntilSuccessful blockUntilSuccessfulFn) (tokenConfig ContractConfig[uniswapv3.Swapper], err error) { +func DeployERC20(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, tokenName, tokenSymbol string, amount *big.Int, recipient common.Address, tokenKnownAddress common.Address, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) (tokenConfig ContractConfig[uniswapv3.Swapper], err error) { tokenConfig.Address, tokenConfig.Contract, err = deployOrInstantiateContract( ctx, c, tops, cops, tokenKnownAddress, @@ -58,7 +59,7 @@ func DeployERC20(ctx context.Context, c *ethclient.Client, tops *bind.TransactOp } // Approve some UniswapV3 addresses to spend tokens on behalf of the token owner. -func setUniswapV3Allowances(ctx context.Context, c *ethclient.Client, contract *uniswapv3.Swapper, tops *bind.TransactOpts, cops *bind.CallOpts, tokenName string, addresses map[string]common.Address, owner common.Address, blockUntilSuccessful blockUntilSuccessfulFn) error { +func setUniswapV3Allowances(ctx context.Context, c *ethclient.Client, contract *uniswapv3.Swapper, tops *bind.TransactOpts, cops *bind.CallOpts, tokenName string, addresses map[string]common.Address, owner common.Address, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) error { // Get the ERC20 contract name. erc20Name, err := contract.Name(cops) if err != nil { diff --git a/cmd/rpcfuzz/cmd.go b/cmd/rpcfuzz/cmd.go index 38e3a12c..99ee3f57 100644 --- a/cmd/rpcfuzz/cmd.go +++ b/cmd/rpcfuzz/cmd.go @@ -51,7 +51,7 @@ func init() { rpcUrl = flagSet.StringP("rpc-url", "r", "http://localhost:8545", "The RPC endpoint url") testPrivateHexKey = flagSet.String("private-key", codeQualityPrivateKey, "The hex encoded private key that we'll use to sending transactions") - testContractAddress = flagSet.String("contract-address", "0x6fda56c57b0acadb96ed5624ac500c0429d59429", "The address of a contract that can be used for testing") + testContractAddress = flagSet.String("contract-address", "", "The address of a contract that can be used for testing. If not specified, a contract will be deployed automatically.") testNamespaces = flagSet.String("namespaces", fmt.Sprintf("eth,web3,net,debug,%s", rpcTestRawHTTPNamespace), "Comma separated list of rpc namespaces to test") testFuzz = flagSet.Bool("fuzz", false, "Flag to indicate whether to fuzz input or not.") testFuzzNum = flagSet.Int("fuzzn", 100, "Number of times to run the fuzzer per test.") diff --git a/cmd/rpcfuzz/rpcfuzz.go b/cmd/rpcfuzz/rpcfuzz.go index 142f205d..d622a409 100644 --- a/cmd/rpcfuzz/rpcfuzz.go +++ b/cmd/rpcfuzz/rpcfuzz.go @@ -29,6 +29,7 @@ import ( "sync" "time" + "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -36,6 +37,8 @@ import ( "github.com/ethereum/go-ethereum/rpc" fuzz "github.com/google/gofuzz" "github.com/maticnetwork/polygon-cli/cmd/rpcfuzz/testreporter" + "github.com/maticnetwork/polygon-cli/contracts" + "github.com/maticnetwork/polygon-cli/contracts/conformancetester" "github.com/maticnetwork/polygon-cli/rpctypes" "github.com/rs/zerolog/log" "github.com/xeipuuv/gojsonschema" @@ -157,11 +160,15 @@ const ( // JSON-RPC error codes. // https://eips.ethereum.org/EIPS/eip-1474 + invalidInputErr = -32000 parseErr = -32700 invalidRequestErr = -32600 methodNotFoundErr = -32601 invalidParamsErr = -32602 internalErr = -32603 + + // contracts/conformancetester/ConformanceTester.sol + revertErrorMessage = "Test Revert Error Message" ) var ( @@ -184,6 +191,24 @@ var ( testResultMutex sync.Mutex ) +func getConformanceContract(ctx context.Context, rpc *rpc.Client, chainID *big.Int) (conformanceContractAddrStr string, conformanceContract *conformancetester.ConformanceTester, err error) { + log.Trace().Msg("Deploying Conformance contract...") + var conformanceContractAddr ethcommon.Address + ec := ethclient.NewClient(rpc) + tops, err := bind.NewKeyedTransactorWithChainID(testPrivateKey, chainID) + if err != nil { + log.Error().Err(err).Msg("Error creating transaction") + return + } + + cops := new(bind.CallOpts) + conformanceContractAddr, conformanceContract, err = contracts.DeployConformanceContract(ctx, ec, tops, cops) + conformanceContractAddrStr = conformanceContractAddr.String() + log.Trace().Msg("Finished Deploying Conformance contract...") + + return +} + func runRpcFuzz(ctx context.Context) error { if *testOutputExportPath != "" && !*testExportJson && !*testExportCSV && !*testExportMarkdown && !*testExportHTML { log.Warn().Msg("Setting --export-path must pair with a export type: --json, --csv, --md, or --html") @@ -193,18 +218,29 @@ func runRpcFuzz(ctx context.Context) error { if err != nil { return err } - nonce, err := GetTestAccountNonce(ctx, rpcClient) + chainId, err := GetCurrentChainID(ctx, rpcClient) if err != nil { return err } - chainId, err := GetCurrentChainID(ctx, rpcClient) + currentChainID = chainId + + if *testContractAddress == "" { + conformanceContractAddr, _, deploymentErr := getConformanceContract(ctx, rpcClient, currentChainID) + if deploymentErr != nil { + log.Error().Err(deploymentErr).Msg("Load test contract deployment error") + return deploymentErr + } + testContractAddress = &conformanceContractAddr + } + log.Info().Str("testContractAddress", *testContractAddress).Msg("Conformance test contract address") + + nonce, err := GetTestAccountNonce(ctx, rpcClient) if err != nil { return err } testAccountNonce = nonce - currentChainID = chainId - log.Trace().Uint64("nonce", nonce).Uint64("chainid", chainId.Uint64()).Msg("Doing test setup") + log.Trace().Uint64("nonce", nonce).Uint64("chainId", chainId.Uint64()).Msg("Doing test setup") setupTests(ctx, rpcClient) httpClient := &http.Client{} @@ -424,31 +460,32 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Validator: ValidateRegexString(`^0x0$`), }) - // cast storage --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 3 + // cast storage --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 0 --block latest allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetStorageAtLatest", Method: "eth_getStorageAt", - Args: []interface{}{*testContractAddress, "0x3", "latest"}, + Args: []interface{}{*testContractAddress, "0x0", "latest"}, Flags: FlagStrictValidation, - Validator: ValidateRegexString(`^0x536f6c6964697479206279204578616d706c6500000000000000000000000026$`), + Validator: ValidateRegexString(`^0x436f6e666f726d616e6365546573746572436f6e74726163744e616d6500003a$`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetStorageAtEarliest", Method: "eth_getStorageAt", - Args: []interface{}{*testContractAddress, "0x3", "earliest"}, + Args: []interface{}{*testContractAddress, "0x0", "earliest"}, Validator: ValidateRegexString(`^0x0{64}`), }) + // cast storage --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 0 --block pending allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetStorageAtPending", Method: "eth_getStorageAt", - Args: []interface{}{*testContractAddress, "0x3", "pending"}, + Args: []interface{}{*testContractAddress, "0x0", "pending"}, Flags: FlagStrictValidation, - Validator: ValidateRegexString(`^0x536f6c6964697479206279204578616d706c6500000000000000000000000026$`), + Validator: ValidateRegexString(`^0x436f6e666f726d616e6365546573746572436f6e74726163744e616d6500003a$`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetStorageAtZero", Method: "eth_getStorageAt", - Args: []interface{}{*testContractAddress, "0x3", "0x0"}, + Args: []interface{}{*testContractAddress, "0x0", "0x0"}, Flags: FlagStrictValidation, Validator: ValidateRegexString(`^0x0{64}`), }) @@ -561,20 +598,20 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Validator: ValidateRegexString(`^0x([1-9a-f]+[0-9a-f]*|0)$`), }) - // cast code --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 + // curl http://localhost:8545 -X POST -H "Content-Type: application/json" --data '{"method":"eth_getCode","params":["0x6FdA56C57B0Acadb96Ed5624aC500C0429d59429","latest"],"id":48,"jsonrpc":"2.0"}' | jq -r ".result | tojson" | tr -d '\n' | sha1sum allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetCodeLatest", Method: "eth_getCode", Args: []interface{}{*testContractAddress, "latest"}, Flags: FlagStrictValidation, - Validator: ValidateHashedResponse("53fd13ceac858ba82dff299cb4ad45db720a6fc9"), + Validator: ValidateHashedResponse("b9689c32bf9284029715ff8375f8996129898db9"), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetCodePending", Method: "eth_getCode", Args: []interface{}{*testContractAddress, "pending"}, Flags: FlagStrictValidation, - Validator: ValidateHashedResponse("53fd13ceac858ba82dff299cb4ad45db720a6fc9"), + Validator: ValidateHashedResponse("b9689c32bf9284029715ff8375f8996129898db9"), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthGetCodeEarliest", @@ -596,11 +633,14 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Name: "RPCTestEthSignFail", Method: "eth_sign", Args: []interface{}{testEthAddress.String(), "0xdeadbeef"}, - Validator: ValidateError(invalidRequestErr, `unknown account`), + Validator: ValidateError(invalidInputErr, `unknown account`), Flags: FlagErrorValidation | FlagStrictValidation | FlagRequiresUnlock, }) // cast rpc --rpc-url localhost:8545 eth_signTransaction '{"from": "0xb9b1cf51a65b50f74ed8bcb258413c02cba2ec57", "to": "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6", "data": "0x", "gas": "0x5208", "gasPrice": "0x1", "nonce": "0x1"}' + // Weirdly, the response eth_signTransaction from geth doesn't "conform" to the spec of: https://ethereum.github.io/execution-apis/api-documentation/ + // This is the actual response with cast and curl of the above input: + // {"raw":"0xf8...85","tx":{"type":"0x0","chainId":"0x539","nonce":"0x1","to":"0x85da99c8a7c2c95964c8efd687e95e632fc533d6","gas":"0x5208","gasPrice":"0x1","maxPriorityFeePerGas":null,"maxFeePerGas":null,"value":"0x0","input":"0x","v":"0xa95","r":"0x82..fe","s":"0x78..85","hash":"0xa9b..5a"}} allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestEthSignTransaction", Method: "eth_signTransaction", @@ -648,7 +688,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Name: "RPCTestEthSendRawTransactionNonceTooLow", Method: "eth_sendRawTransaction", Args: ArgsSignTransactionWithNonce(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}, 0), - Validator: ValidateError(invalidRequestErr, `nonce too low`), + Validator: ValidateError(invalidInputErr, `nonce too low`), Flags: FlagErrorValidation | FlagStrictValidation, }) allTests = append(allTests, &RPCTestDynamicArgs{ @@ -662,31 +702,30 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Name: "RPCTestEthSendRawTransactionNonceKnown", Method: "eth_sendRawTransaction", Args: ArgsSignTransactionWithNonce(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}, testAccountNonce|defaultNonceTestOffset), - Validator: ValidateError(invalidRequestErr, `already known`), + Validator: ValidateError(invalidInputErr, `already known`), Flags: FlagErrorValidation | FlagStrictValidation | FlagOrderDependent, }) allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestEthSendRawTransactionNonceUnderpriced", Method: "eth_sendRawTransaction", Args: ArgsSignTransactionWithNonce(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x1234", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}, testAccountNonce|defaultNonceTestOffset), - Validator: ValidateError(invalidRequestErr, `replacement`), + Validator: ValidateError(invalidInputErr, `replacement`), Flags: FlagErrorValidation | FlagStrictValidation | FlagOrderDependent, }) - // cat contracts/ERC20.abi| go run main.go abi - // cast call --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 'function name() view returns(string)' + // curl http://localhost:8545 -X POST -H "Content-Type: application/json" --data '{"method":"eth_call","params":[{"to":"0x6FdA56C57B0Acadb96Ed5624aC500C0429d59429","data":"0x06fdde03"},"latest"],"id":1,"jsonrpc":"2.0"}' allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthCallLatest", Method: "eth_call", Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03"}, "latest"}, - Validator: ValidateRegexString(`536f6c6964697479206279204578616d706c65`), + Validator: ValidateRegexString(`0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d436f6e666f726d616e6365546573746572436f6e74726163744e616d65000000`), Flags: FlagStrictValidation, }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestEthCallPending", Method: "eth_call", Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03"}, "pending"}, - Validator: ValidateRegexString(`536f6c6964697479206279204578616d706c65`), + Validator: ValidateRegexString(`0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d436f6e666f726d616e6365546573746572436f6e74726163744e616d65000000`), Flags: FlagStrictValidation, }) allTests = append(allTests, &RPCTestGeneric{ @@ -703,19 +742,22 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Validator: ValidateRegexString(`^0x$`), Flags: FlagStrictValidation, }) + allTests = append(allTests, &RPCTestGeneric{ + Name: "RPCTestEthCallRevertMessage", + Method: "eth_call", + Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Data: "0xa26388bb"}, "latest"}, + Validator: ValidateErrorMsgString(revertErrorMessage), + Flags: FlagErrorValidation, + }) - // cat contracts/ERC20.abi| go run main.go abi - // cast estimate --rpc-url localhost:8545 0x6fda56c57b0acadb96ed5624ac500c0429d59429 'function mint(uint256 amount) returns()' 10000 - // cast abi-encode 'function mint(uint256 amount) returns()' 10000 + // curl http://localhost:8545 -X POST -H "Content-Type: application/json" --data '{"method":"eth_estimateGas","params":[{"to":"0x6FdA56C57B0Acadb96Ed5624aC500C0429d59429","data":"0x06fdde03"},"latest"],"id":1,"jsonrpc":"2.0"}' + // This just validates that the estimated gas response conforms to an expected hex allTests = append(allTests, &RPCTestGeneric{ - Name: "RPCTestEthEstimateGas", - Method: "eth_estimateGas", - Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d680000000000000000000000000000000000000000000000000000000000002710"}, "latest"}, - Validator: RequireAny( - ValidateRegexString(`^0x10b0d$`), // first run - ValidateRegexString(`^0xc841$`), // subsequent run - ), - Flags: FlagStrictValidation, + Name: "RPCTestEthEstimateGas", + Method: "eth_estimateGas", + Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03"}, "latest"}, + Validator: ValidateRegexString(`^0x`), + Flags: FlagStrictValidation, }) // $ curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc": "2.0", "method": "eth_estimateGas", "params": [], "id":1}' localhost:8545 @@ -770,12 +812,11 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { ), }) - // cast send --from 0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6 --rpc-url localhost:8545 --private-key 0x42b6e34dc21598a807dc19d7784c71b2a7a01f6480dc6f58258f78e539f1a1fa 0x6fda56c57b0acadb96ed5624ac500c0429d59429 'function mint(uint256 amount) returns()' 10000 // cast rpc --rpc-url localhost:8545 eth_getTransactionByHash 0xb27bd60d706c08a80d698b951b9ec4284b342a34b885ff5ebe567b41dab16f69 allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestEthGetTransactionByHash", Method: "eth_getTransactionByHash", - Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d680000000000000000000000000000000000000000000000000000000000002710", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}), Validator: RequireAll( ValidateJSONSchema(rpctypes.RPCSchemaEthTransaction), ValidateTransactionHash(), @@ -786,7 +827,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestEthGetTransactionByBlockHashAndIndex", Method: "eth_getTransactionByBlockHashAndIndex", - Args: ArgsTransactionBlockHashAndIndex(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d680000000000000000000000000000000000000000000000000000000000002710", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionBlockHashAndIndex(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}), Validator: RequireAll( ValidateJSONSchema(rpctypes.RPCSchemaEthTransaction), ValidateTransactionHash(), @@ -797,7 +838,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestEthGetTransactionByBlockNumberAndIndex", Method: "eth_getTransactionByBlockNumberAndIndex", - Args: ArgsTransactionBlockNumberAndIndex(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d680000000000000000000000000000000000000000000000000000000000002710", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionBlockNumberAndIndex(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}), Validator: RequireAll( ValidateJSONSchema(rpctypes.RPCSchemaEthTransaction), ValidateTransactionHash(), @@ -808,7 +849,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestGetTransactionReceipt", Method: "eth_getTransactionReceipt", - Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d680000000000000000000000000000000000000000000000000000000000002710", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}), Validator: ValidateJSONSchema(rpctypes.RPCSchemaEthReceipt), }) @@ -956,7 +997,10 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Address: *testContractAddress, Topics: []interface{}{nil, nil, "0x000000000000000000000000" + testEthAddress.String()[2:]}, }), - Validator: ValidateJSONSchema(rpctypes.RPCSchemaEthFilter), + Validator: RequireAny( + ValidateJSONSchema(rpctypes.RPCSchemaEthFilter), + ValidateExactJSON("[]"), + ), }) // cast rpc --rpc-url localhost:8545 eth_getLogs '{"fromBlock": "earliest", "toBlock": "latest", "address": "0x6fda56c57b0acadb96ed5624ac500c0429d59429", "topics": [null, null, "0x00000000000000000000000085da99c8a7c2c95964c8efd687e95e632fc533d6"]}' allTests = append(allTests, &RPCTestGeneric{ @@ -968,7 +1012,10 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Address: *testContractAddress, Topics: []interface{}{nil, nil, "0x000000000000000000000000" + testEthAddress.String()[2:]}, }}, - Validator: ValidateJSONSchema(rpctypes.RPCSchemaEthFilter), + Validator: RequireAny( + ValidateJSONSchema(rpctypes.RPCSchemaEthFilter), + ValidateExactJSON("[]"), + ), }) // cast rpc --rpc-url localhost:8545 eth_getWork @@ -1031,9 +1078,8 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Validator: ValidateJSONSchema(rpctypes.RPCSchemaEthProof), }) - // cat contracts/ERC20.abi| go run main.go abi - // cast abi-encode 'function mint(uint256 amount) returns()' 1000000000000000000000000 - // cast rpc --rpc-url localhost:8545 debug_traceCall '{"to": "0x6fda56c57b0acadb96ed5624ac500c0429d59429", "data":"0xa0712d6800000000000000000000000000000000000000000000d3c21bcecceda1000000"}' latest | jq '.' + // curl http://localhost:8545 -X POST -H "Content-Type: application/json" --data '{"method":"eth_call","params":[{"to":"0x6FdA56C57B0Acadb96Ed5624aC500C0429d59429","data":"0x06fdde03"},"latest"],"id":1,"jsonrpc":"2.0"}' + // cast rpc --rpc-url localhost:8545 debug_traceCall '{"to": "0x6FdA56C57B0Acadb96Ed5624aC500C0429d59429", "data":"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d436f6e666f726d616e6365546573746572436f6e74726163744e616d65000000"}' latest | jq '.' allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestDebugTraceCallSimple", Method: "debug_traceCall", @@ -1041,9 +1087,9 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Validator: ValidateJSONSchema(rpctypes.RPCSchemaDebugTrace), }) allTests = append(allTests, &RPCTestGeneric{ - Name: "RPCTestDebugTraceCallMint", + Name: "RPCTestDebugTraceCallName", Method: "debug_traceCall", - Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d6800000000000000000000000000000000000000000000d3c21bcecceda1000000"}, "latest"}, + Args: []interface{}{&RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03"}, "latest"}, Validator: ValidateJSONSchema(rpctypes.RPCSchemaDebugTrace), }) allTests = append(allTests, &RPCTestDynamicArgs{ @@ -1052,10 +1098,12 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), Validator: ValidateJSONSchema(rpctypes.RPCSchemaDebugTrace), }) + // cast calldata "deposit(uint256)" 1 + // 0xb6b55f250000000000000000000000000000000000000000000000000000000000000001 allTests = append(allTests, &RPCTestDynamicArgs{ - Name: "RPCTestDebugTraceTransactionMint", + Name: "RPCTestDebugTraceTransactionDeposit", Method: "debug_traceTransaction", - Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d6800000000000000000000000000000000000000000000d3c21bcecceda1000000", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xb6b55f250000000000000000000000000000000000000000000000000000000000000001", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), Validator: ValidateJSONSchema(rpctypes.RPCSchemaDebugTrace), }) @@ -1071,7 +1119,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Method: "debug_getRawBlock", Args: []interface{}{"pending"}, Flags: FlagErrorValidation | FlagStrictValidation, - Validator: ValidateError(invalidRequestErr, `not found`), + Validator: ValidateError(invalidInputErr, `not found`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestDebugGetRawBlockEarliest", @@ -1106,7 +1154,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Method: "debug_getRawHeader", Args: []interface{}{"pending"}, Flags: FlagErrorValidation | FlagStrictValidation, - Validator: ValidateError(invalidRequestErr, `not found`), + Validator: ValidateError(invalidInputErr, `not found`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestDebugGetRawHeaderEarliest", @@ -1151,13 +1199,15 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { allTests = append(allTests, &RPCTestDynamicArgs{ Name: "RPCTestDebugGetRawTransactionSimple", Method: "debug_getRawTransaction", - Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0x06fdde03", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: testEthAddress.String(), Value: "0x123", Gas: "0x5208", Data: "0x", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas}), Validator: ValidateRegexString(`^0x[0-9a-f]*`), }) + // cast calldata "deposit(uint256)" 1 + // 0xb6b55f250000000000000000000000000000000000000000000000000000000000000001 allTests = append(allTests, &RPCTestDynamicArgs{ - Name: "RPCTestDebugGetRawTransactionMint", + Name: "RPCTestDebugGetRawTransactionDeposit", Method: "debug_getRawTransaction", - Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xa0712d6800000000000000000000000000000000000000000000d3c21bcecceda1000000", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), + Args: ArgsTransactionHash(ctx, rpcClient, &RPCTestTransactionArgs{To: *testContractAddress, Value: "0x0", Data: "0xb6b55f250000000000000000000000000000000000000000000000000000000000000001", MaxFeePerGas: defaultMaxFeePerGas, MaxPriorityFeePerGas: defaultMaxPriorityFeePerGas, Gas: defaultGas}), Validator: ValidateRegexString(`^0x[0-9a-f]*`), }) @@ -1168,7 +1218,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Method: "debug_traceBlockByNumber", Args: []interface{}{"0x0", nil}, Flags: FlagErrorValidation | FlagStrictValidation, - Validator: ValidateError(invalidRequestErr, `genesis is not traceable`), + Validator: ValidateError(invalidInputErr, `genesis is not traceable`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestDebugTraceBlockByNumberOne", @@ -1187,7 +1237,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Method: "debug_traceBlockByNumber", Args: []interface{}{"earliest", nil}, Flags: FlagErrorValidation | FlagStrictValidation, - Validator: ValidateError(invalidRequestErr, `genesis is not traceable`), + Validator: ValidateError(invalidInputErr, `genesis is not traceable`), }) allTests = append(allTests, &RPCTestGeneric{ Name: "RPCTestDebugTraceBlockByNumberPending", @@ -1216,7 +1266,7 @@ func setupTests(ctx context.Context, rpcClient *rpc.Client) { Method: "debug_traceBlock", Args: ArgsRawBlock(ctx, rpcClient, "0x0", nil), Flags: FlagErrorValidation | FlagStrictValidation, - Validator: ValidateError(invalidRequestErr, `genesis is not traceable`), + Validator: ValidateError(invalidInputErr, `genesis is not traceable`), }) // $ curl -X POST -H "Content-Type: application/json" --data '[]' http://localhost:8545 @@ -1354,7 +1404,23 @@ func ValidateRegexString(regEx string) func(result interface{}) error { } } -// ValidateError will check the error message text against the provide regular expression +// ValidateErrorMsgString will check the error message text against the provide regular expression +func ValidateErrorMsgString(errorMessageRegex string) func(result interface{}) error { + r := regexp.MustCompile(errorMessageRegex) + return func(result interface{}) error { + fullError, err := genericResultToError(result) + if err != nil { + return err + } + if !r.MatchString(fullError.Error()) { + return fmt.Errorf("the regex %s failed to match result %s", errorMessageRegex, fullError.Error()) + } + + return nil + } +} + +// ValidateError will check the status code and error message text against the provide regular expression func ValidateError(code int, errorMessageRegex string) func(result interface{}) error { r := regexp.MustCompile(errorMessageRegex) return func(result interface{}) error { @@ -1672,7 +1738,7 @@ func ArgsTransactionHash(ctx context.Context, rpcClient *rpc.Client, tx *RPCTest return func() []interface{} { resultHash, _, err := prepareAndSendTransaction(ctx, rpcClient, tx) if err != nil { - log.Fatal().Err(err).Msg("Unable to execute transaction") + log.Error().Err(err).Msg("Unable to execute transaction") } log.Info().Str("resultHash", resultHash).Msg("Successfully executed transaction") @@ -1686,7 +1752,7 @@ func ArgsTransactionBlockHashAndIndex(ctx context.Context, rpcClient *rpc.Client return func() []interface{} { resultHash, receipt, err := prepareAndSendTransaction(ctx, rpcClient, tx) if err != nil { - log.Fatal().Err(err).Msg("Unable to execute transaction") + log.Error().Err(err).Msg("Unable to execute transaction") } log.Info().Str("resultHash", resultHash).Msg("Successfully executed transaction") @@ -1700,7 +1766,7 @@ func ArgsTransactionBlockNumberAndIndex(ctx context.Context, rpcClient *rpc.Clie return func() []interface{} { resultHash, receipt, err := prepareAndSendTransaction(ctx, rpcClient, tx) if err != nil { - log.Fatal().Err(err).Msg("Unable to execute transaction") + log.Error().Err(err).Msg("Unable to execute transaction") } log.Info().Str("resultHash", resultHash).Msg("Successfully executed transaction") diff --git a/contracts/conformancetester/ConformanceTester.abi b/contracts/conformancetester/ConformanceTester.abi new file mode 100644 index 00000000..18173589 --- /dev/null +++ b/contracts/conformancetester/ConformanceTester.abi @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"RevertErrorMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"testRevert","outputs":[],"stateMutability":"pure","type":"function"}] \ No newline at end of file diff --git a/contracts/conformancetester/ConformanceTester.bin b/contracts/conformancetester/ConformanceTester.bin new file mode 100644 index 00000000..5e5d6e91 --- /dev/null +++ b/contracts/conformancetester/ConformanceTester.bin @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b5060405162000ad638038062000ad68339818101604052810190620000379190620001e3565b80600090816200004891906200047f565b505062000566565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000b9826200006e565b810181811067ffffffffffffffff82111715620000db57620000da6200007f565b5b80604052505050565b6000620000f062000050565b9050620000fe8282620000ae565b919050565b600067ffffffffffffffff8211156200012157620001206200007f565b5b6200012c826200006e565b9050602081019050919050565b60005b83811015620001595780820151818401526020810190506200013c565b60008484015250505050565b60006200017c620001768462000103565b620000e4565b9050828152602081018484840111156200019b576200019a62000069565b5b620001a884828562000139565b509392505050565b600082601f830112620001c857620001c762000064565b5b8151620001da84826020860162000165565b91505092915050565b600060208284031215620001fc57620001fb6200005a565b5b600082015167ffffffffffffffff8111156200021d576200021c6200005f565b5b6200022b84828501620001b0565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028757607f821691505b6020821081036200029d576200029c6200023f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002c8565b620003138683620002c8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003606200035a62000354846200032b565b62000335565b6200032b565b9050919050565b6000819050919050565b6200037c836200033f565b620003946200038b8262000367565b848454620002d5565b825550505050565b600090565b620003ab6200039c565b620003b881848462000371565b505050565b5b81811015620003e057620003d4600082620003a1565b600181019050620003be565b5050565b601f8211156200042f57620003f981620002a3565b6200040484620002b8565b8101602085101562000414578190505b6200042c6200042385620002b8565b830182620003bd565b50505b505050565b600082821c905092915050565b6000620004546000198460080262000434565b1980831691505092915050565b60006200046f838362000441565b9150826002028217905092915050565b6200048a8262000234565b67ffffffffffffffff811115620004a657620004a56200007f565b5b620004b282546200026e565b620004bf828285620003e4565b600060209050601f831160018114620004f75760008415620004e2578287015190505b620004ee858262000461565b8655506200055e565b601f1984166200050786620002a3565b60005b8281101562000531578489015182556001820191506020850194506020810190506200050a565b868310156200055157848901516200054d601f89168262000441565b8355505b6001600288020188555050505b505050505050565b61056080620005766000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806306fdde031461005c578063242e7fa11461007a57806327e235e314610098578063a26388bb146100c8578063b6b55f25146100d2575b600080fd5b6100646100ee565b6040516100719190610328565b60405180910390f35b61008261017c565b60405161008f9190610328565b60405180910390f35b6100b260048036038101906100ad91906103ad565b6101b5565b6040516100bf91906103f3565b60405180910390f35b6100d06101cd565b005b6100ec60048036038101906100e7919061043a565b61023f565b005b600080546100fb90610496565b80601f016020809104026020016040519081016040528092919081815260200182805461012790610496565b80156101745780601f1061014957610100808354040283529160200191610174565b820191906000526020600020905b81548152906001019060200180831161015757829003601f168201915b505050505081565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d6573736167650000000000000081525081565b60016020528060005260406000206000915090505481565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d657373616765000000000000008152506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102369190610328565b60405180910390fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461028e91906104f6565b9250508190555050565b600081519050919050565b600082825260208201905092915050565b60005b838110156102d25780820151818401526020810190506102b7565b60008484015250505050565b6000601f19601f8301169050919050565b60006102fa82610298565b61030481856102a3565b93506103148185602086016102b4565b61031d816102de565b840191505092915050565b6000602082019050818103600083015261034281846102ef565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061037a8261034f565b9050919050565b61038a8161036f565b811461039557600080fd5b50565b6000813590506103a781610381565b92915050565b6000602082840312156103c3576103c261034a565b5b60006103d184828501610398565b91505092915050565b6000819050919050565b6103ed816103da565b82525050565b600060208201905061040860008301846103e4565b92915050565b610417816103da565b811461042257600080fd5b50565b6000813590506104348161040e565b92915050565b6000602082840312156104505761044f61034a565b5b600061045e84828501610425565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806104ae57607f821691505b6020821081036104c1576104c0610467565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610501826103da565b915061050c836103da565b9250828201905080821115610524576105236104c7565b5b9291505056fea264697066735822122097c56af386cdc27f1819acc9acc5fd56d14a42aeb926a842f69be51b4dc250ad64736f6c63430008150033 \ No newline at end of file diff --git a/contracts/conformancetester/ConformanceTester.go b/contracts/conformancetester/ConformanceTester.go new file mode 100644 index 00000000..4668a15a --- /dev/null +++ b/contracts/conformancetester/ConformanceTester.go @@ -0,0 +1,346 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package conformancetester + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ConformanceTesterMetaData contains all meta data concerning the ConformanceTester contract. +var ConformanceTesterMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"RevertErrorMessage\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"testRevert\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x60806040523480156200001157600080fd5b5060405162000ad638038062000ad68339818101604052810190620000379190620001e3565b80600090816200004891906200047f565b505062000566565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000b9826200006e565b810181811067ffffffffffffffff82111715620000db57620000da6200007f565b5b80604052505050565b6000620000f062000050565b9050620000fe8282620000ae565b919050565b600067ffffffffffffffff8211156200012157620001206200007f565b5b6200012c826200006e565b9050602081019050919050565b60005b83811015620001595780820151818401526020810190506200013c565b60008484015250505050565b60006200017c620001768462000103565b620000e4565b9050828152602081018484840111156200019b576200019a62000069565b5b620001a884828562000139565b509392505050565b600082601f830112620001c857620001c762000064565b5b8151620001da84826020860162000165565b91505092915050565b600060208284031215620001fc57620001fb6200005a565b5b600082015167ffffffffffffffff8111156200021d576200021c6200005f565b5b6200022b84828501620001b0565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028757607f821691505b6020821081036200029d576200029c6200023f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002c8565b620003138683620002c8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003606200035a62000354846200032b565b62000335565b6200032b565b9050919050565b6000819050919050565b6200037c836200033f565b620003946200038b8262000367565b848454620002d5565b825550505050565b600090565b620003ab6200039c565b620003b881848462000371565b505050565b5b81811015620003e057620003d4600082620003a1565b600181019050620003be565b5050565b601f8211156200042f57620003f981620002a3565b6200040484620002b8565b8101602085101562000414578190505b6200042c6200042385620002b8565b830182620003bd565b50505b505050565b600082821c905092915050565b6000620004546000198460080262000434565b1980831691505092915050565b60006200046f838362000441565b9150826002028217905092915050565b6200048a8262000234565b67ffffffffffffffff811115620004a657620004a56200007f565b5b620004b282546200026e565b620004bf828285620003e4565b600060209050601f831160018114620004f75760008415620004e2578287015190505b620004ee858262000461565b8655506200055e565b601f1984166200050786620002a3565b60005b8281101562000531578489015182556001820191506020850194506020810190506200050a565b868310156200055157848901516200054d601f89168262000441565b8355505b6001600288020188555050505b505050505050565b61056080620005766000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806306fdde031461005c578063242e7fa11461007a57806327e235e314610098578063a26388bb146100c8578063b6b55f25146100d2575b600080fd5b6100646100ee565b6040516100719190610328565b60405180910390f35b61008261017c565b60405161008f9190610328565b60405180910390f35b6100b260048036038101906100ad91906103ad565b6101b5565b6040516100bf91906103f3565b60405180910390f35b6100d06101cd565b005b6100ec60048036038101906100e7919061043a565b61023f565b005b600080546100fb90610496565b80601f016020809104026020016040519081016040528092919081815260200182805461012790610496565b80156101745780601f1061014957610100808354040283529160200191610174565b820191906000526020600020905b81548152906001019060200180831161015757829003601f168201915b505050505081565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d6573736167650000000000000081525081565b60016020528060005260406000206000915090505481565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d657373616765000000000000008152506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102369190610328565b60405180910390fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461028e91906104f6565b9250508190555050565b600081519050919050565b600082825260208201905092915050565b60005b838110156102d25780820151818401526020810190506102b7565b60008484015250505050565b6000601f19601f8301169050919050565b60006102fa82610298565b61030481856102a3565b93506103148185602086016102b4565b61031d816102de565b840191505092915050565b6000602082019050818103600083015261034281846102ef565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061037a8261034f565b9050919050565b61038a8161036f565b811461039557600080fd5b50565b6000813590506103a781610381565b92915050565b6000602082840312156103c3576103c261034a565b5b60006103d184828501610398565b91505092915050565b6000819050919050565b6103ed816103da565b82525050565b600060208201905061040860008301846103e4565b92915050565b610417816103da565b811461042257600080fd5b50565b6000813590506104348161040e565b92915050565b6000602082840312156104505761044f61034a565b5b600061045e84828501610425565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806104ae57607f821691505b6020821081036104c1576104c0610467565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610501826103da565b915061050c836103da565b9250828201905080821115610524576105236104c7565b5b9291505056fea264697066735822122097c56af386cdc27f1819acc9acc5fd56d14a42aeb926a842f69be51b4dc250ad64736f6c63430008150033", +} + +// ConformanceTesterABI is the input ABI used to generate the binding from. +// Deprecated: Use ConformanceTesterMetaData.ABI instead. +var ConformanceTesterABI = ConformanceTesterMetaData.ABI + +// ConformanceTesterBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ConformanceTesterMetaData.Bin instead. +var ConformanceTesterBin = ConformanceTesterMetaData.Bin + +// DeployConformanceTester deploys a new Ethereum contract, binding an instance of ConformanceTester to it. +func DeployConformanceTester(auth *bind.TransactOpts, backend bind.ContractBackend, _name string) (common.Address, *types.Transaction, *ConformanceTester, error) { + parsed, err := ConformanceTesterMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ConformanceTesterBin), backend, _name) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ConformanceTester{ConformanceTesterCaller: ConformanceTesterCaller{contract: contract}, ConformanceTesterTransactor: ConformanceTesterTransactor{contract: contract}, ConformanceTesterFilterer: ConformanceTesterFilterer{contract: contract}}, nil +} + +// ConformanceTester is an auto generated Go binding around an Ethereum contract. +type ConformanceTester struct { + ConformanceTesterCaller // Read-only binding to the contract + ConformanceTesterTransactor // Write-only binding to the contract + ConformanceTesterFilterer // Log filterer for contract events +} + +// ConformanceTesterCaller is an auto generated read-only Go binding around an Ethereum contract. +type ConformanceTesterCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ConformanceTesterTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ConformanceTesterTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ConformanceTesterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ConformanceTesterFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ConformanceTesterSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ConformanceTesterSession struct { + Contract *ConformanceTester // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ConformanceTesterCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ConformanceTesterCallerSession struct { + Contract *ConformanceTesterCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ConformanceTesterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ConformanceTesterTransactorSession struct { + Contract *ConformanceTesterTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ConformanceTesterRaw is an auto generated low-level Go binding around an Ethereum contract. +type ConformanceTesterRaw struct { + Contract *ConformanceTester // Generic contract binding to access the raw methods on +} + +// ConformanceTesterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ConformanceTesterCallerRaw struct { + Contract *ConformanceTesterCaller // Generic read-only contract binding to access the raw methods on +} + +// ConformanceTesterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ConformanceTesterTransactorRaw struct { + Contract *ConformanceTesterTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewConformanceTester creates a new instance of ConformanceTester, bound to a specific deployed contract. +func NewConformanceTester(address common.Address, backend bind.ContractBackend) (*ConformanceTester, error) { + contract, err := bindConformanceTester(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ConformanceTester{ConformanceTesterCaller: ConformanceTesterCaller{contract: contract}, ConformanceTesterTransactor: ConformanceTesterTransactor{contract: contract}, ConformanceTesterFilterer: ConformanceTesterFilterer{contract: contract}}, nil +} + +// NewConformanceTesterCaller creates a new read-only instance of ConformanceTester, bound to a specific deployed contract. +func NewConformanceTesterCaller(address common.Address, caller bind.ContractCaller) (*ConformanceTesterCaller, error) { + contract, err := bindConformanceTester(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ConformanceTesterCaller{contract: contract}, nil +} + +// NewConformanceTesterTransactor creates a new write-only instance of ConformanceTester, bound to a specific deployed contract. +func NewConformanceTesterTransactor(address common.Address, transactor bind.ContractTransactor) (*ConformanceTesterTransactor, error) { + contract, err := bindConformanceTester(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ConformanceTesterTransactor{contract: contract}, nil +} + +// NewConformanceTesterFilterer creates a new log filterer instance of ConformanceTester, bound to a specific deployed contract. +func NewConformanceTesterFilterer(address common.Address, filterer bind.ContractFilterer) (*ConformanceTesterFilterer, error) { + contract, err := bindConformanceTester(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ConformanceTesterFilterer{contract: contract}, nil +} + +// bindConformanceTester binds a generic wrapper to an already deployed contract. +func bindConformanceTester(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ConformanceTesterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ConformanceTester *ConformanceTesterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ConformanceTester.Contract.ConformanceTesterCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ConformanceTester *ConformanceTesterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ConformanceTester.Contract.ConformanceTesterTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ConformanceTester *ConformanceTesterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ConformanceTester.Contract.ConformanceTesterTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ConformanceTester *ConformanceTesterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ConformanceTester.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ConformanceTester *ConformanceTesterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ConformanceTester.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ConformanceTester *ConformanceTesterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ConformanceTester.Contract.contract.Transact(opts, method, params...) +} + +// RevertErrorMessage is a free data retrieval call binding the contract method 0x242e7fa1. +// +// Solidity: function RevertErrorMessage() view returns(string) +func (_ConformanceTester *ConformanceTesterCaller) RevertErrorMessage(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ConformanceTester.contract.Call(opts, &out, "RevertErrorMessage") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// RevertErrorMessage is a free data retrieval call binding the contract method 0x242e7fa1. +// +// Solidity: function RevertErrorMessage() view returns(string) +func (_ConformanceTester *ConformanceTesterSession) RevertErrorMessage() (string, error) { + return _ConformanceTester.Contract.RevertErrorMessage(&_ConformanceTester.CallOpts) +} + +// RevertErrorMessage is a free data retrieval call binding the contract method 0x242e7fa1. +// +// Solidity: function RevertErrorMessage() view returns(string) +func (_ConformanceTester *ConformanceTesterCallerSession) RevertErrorMessage() (string, error) { + return _ConformanceTester.Contract.RevertErrorMessage(&_ConformanceTester.CallOpts) +} + +// Balances is a free data retrieval call binding the contract method 0x27e235e3. +// +// Solidity: function balances(address ) view returns(uint256) +func (_ConformanceTester *ConformanceTesterCaller) Balances(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var out []interface{} + err := _ConformanceTester.contract.Call(opts, &out, "balances", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Balances is a free data retrieval call binding the contract method 0x27e235e3. +// +// Solidity: function balances(address ) view returns(uint256) +func (_ConformanceTester *ConformanceTesterSession) Balances(arg0 common.Address) (*big.Int, error) { + return _ConformanceTester.Contract.Balances(&_ConformanceTester.CallOpts, arg0) +} + +// Balances is a free data retrieval call binding the contract method 0x27e235e3. +// +// Solidity: function balances(address ) view returns(uint256) +func (_ConformanceTester *ConformanceTesterCallerSession) Balances(arg0 common.Address) (*big.Int, error) { + return _ConformanceTester.Contract.Balances(&_ConformanceTester.CallOpts, arg0) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ConformanceTester *ConformanceTesterCaller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ConformanceTester.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ConformanceTester *ConformanceTesterSession) Name() (string, error) { + return _ConformanceTester.Contract.Name(&_ConformanceTester.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ConformanceTester *ConformanceTesterCallerSession) Name() (string, error) { + return _ConformanceTester.Contract.Name(&_ConformanceTester.CallOpts) +} + +// TestRevert is a free data retrieval call binding the contract method 0xa26388bb. +// +// Solidity: function testRevert() pure returns() +func (_ConformanceTester *ConformanceTesterCaller) TestRevert(opts *bind.CallOpts) error { + var out []interface{} + err := _ConformanceTester.contract.Call(opts, &out, "testRevert") + + if err != nil { + return err + } + + return err + +} + +// TestRevert is a free data retrieval call binding the contract method 0xa26388bb. +// +// Solidity: function testRevert() pure returns() +func (_ConformanceTester *ConformanceTesterSession) TestRevert() error { + return _ConformanceTester.Contract.TestRevert(&_ConformanceTester.CallOpts) +} + +// TestRevert is a free data retrieval call binding the contract method 0xa26388bb. +// +// Solidity: function testRevert() pure returns() +func (_ConformanceTester *ConformanceTesterCallerSession) TestRevert() error { + return _ConformanceTester.Contract.TestRevert(&_ConformanceTester.CallOpts) +} + +// Deposit is a paid mutator transaction binding the contract method 0xb6b55f25. +// +// Solidity: function deposit(uint256 amount) returns() +func (_ConformanceTester *ConformanceTesterTransactor) Deposit(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { + return _ConformanceTester.contract.Transact(opts, "deposit", amount) +} + +// Deposit is a paid mutator transaction binding the contract method 0xb6b55f25. +// +// Solidity: function deposit(uint256 amount) returns() +func (_ConformanceTester *ConformanceTesterSession) Deposit(amount *big.Int) (*types.Transaction, error) { + return _ConformanceTester.Contract.Deposit(&_ConformanceTester.TransactOpts, amount) +} + +// Deposit is a paid mutator transaction binding the contract method 0xb6b55f25. +// +// Solidity: function deposit(uint256 amount) returns() +func (_ConformanceTester *ConformanceTesterTransactorSession) Deposit(amount *big.Int) (*types.Transaction, error) { + return _ConformanceTester.Contract.Deposit(&_ConformanceTester.TransactOpts, amount) +} diff --git a/contracts/conformancetester/ConformanceTester.sol b/contracts/conformancetester/ConformanceTester.sol new file mode 100644 index 00000000..19a9075c --- /dev/null +++ b/contracts/conformancetester/ConformanceTester.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.21; + +contract ConformanceTester { + string public name; + mapping(address => uint) public balances; + string public constant RevertErrorMessage = "Test Revert Error Message"; + + constructor(string memory _name) { + name = _name; + } + + function deposit(uint amount) external { + balances[msg.sender] += amount; + } + + function testRevert() public pure{ + revert(RevertErrorMessage); + } +} diff --git a/contracts/contracts.go b/contracts/contracts.go index 86a08802..d6162d63 100644 --- a/contracts/contracts.go +++ b/contracts/contracts.go @@ -1,6 +1,7 @@ package contracts import ( + "context" _ "embed" "encoding/hex" "fmt" @@ -9,15 +10,21 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" + ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/maticnetwork/polygon-cli/contracts/conformancetester" "github.com/rs/zerolog/log" + + "github.com/cenkalti/backoff/v4" ) // solc --version // solc, the solidity compiler commandline interface // Version: 0.8.15+commit.e14f2714.Darwin.appleclang // solc LoadTester.sol --bin --abi -o . --overwrite -// ~/code/go-ethereum/build/bin/abigen --abi LoadTester.abi --pkg contracts --type LoadTester --bin LoadTester.bin --out loadtester.go +// From within `polygon-cli/contracts/loadtester` directory: +// ~/code/go-ethereum/build/bin/abigen --abi LoadTester.abi --pkg contracts --type LoadTester --bin LoadTester.bin --out ../loadtester.go //go:embed loadtester/LoadTester.bin var RawLoadTesterBin string @@ -31,6 +38,35 @@ func GetLoadTesterBytes() ([]byte, error) { return hex.DecodeString(RawLoadTesterBin) } +func BlockUntilSuccessful(ctx context.Context, c *ethclient.Client, retryable func() error) error { + // this function use to be very complicated (and not work). I'm dumbing this down to a basic time based retryable which should work 99% of the time + b := backoff.WithContext(backoff.WithMaxRetries(backoff.NewConstantBackOff(5*time.Second), 24), ctx) + return backoff.Retry(retryable, b) +} + +func DeployConformanceContract(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts) (conformanceContractAddr ethcommon.Address, conformanceContract *conformancetester.ConformanceTester, err error) { + conformanceContractAddr, _, _, err = conformancetester.DeployConformanceTester(tops, c, "ConformanceTesterContractName") + if err != nil { + log.Error().Err(err).Msg("Unable to deploy ConformanceTester contract") + return + } + log.Info().Interface("conformanceContractAddr", conformanceContractAddr).Msg("Conformance contract deployed") + + conformanceContract, err = conformancetester.NewConformanceTester(conformanceContractAddr, c) + if err != nil { + log.Error().Err(err).Msg("Unable to instantiate new conformance contract") + return + } + log.Trace().Msg("Conformance contract instantiated") + + err = BlockUntilSuccessful(ctx, c, func() error { + _, err := conformanceContract.Name(cops) + return err + }) + + return +} + func CallLoadTestFunctionByOpCode(shortCode uint64, lt *LoadTester, opts *bind.TransactOpts, iterations uint64) (*ethtypes.Transaction, error) { x := new(big.Int).SetUint64(iterations) var longCode = 0xDEADBEEF0000 | shortCode diff --git a/contracts/loadtester/LoadTester.go b/contracts/loadtester/LoadTester.go deleted file mode 100644 index e63d3051..00000000 --- a/contracts/loadtester/LoadTester.go +++ /dev/null @@ -1,1819 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package loadtester - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// LoadTesterMetaData contains all meta data concerning the LoadTester contract. -var LoadTesterMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"dumpster\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCallCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inc\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"loopBlockHashUntilLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"loopUntilLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"trash\",\"type\":\"bytes\"}],\"name\":\"store\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testADD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testADDMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testADDRESS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testAND\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBALANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBASEFEE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBLOCKHASH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBYTE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testBlake2f\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLDATACOPY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLDATALOAD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLDATASIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLVALUE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCODECOPY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCOINBASE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testDIFFICULTY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testDIV\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECAdd\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECMul\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECPairing\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECRecover\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"result\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testEQ\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testEXP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testEXTCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGASLIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGASPRICE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testISZERO\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testIdentity\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG0\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG1\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG2\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG3\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG4\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMLOAD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMSIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMSTORE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMSTORE8\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMUL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMULMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testModExp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testNOT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testNUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testORIGIN\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testRETURNDATACOPY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testRETURNDATASIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testRipemd160\",\"outputs\":[{\"internalType\":\"bytes20\",\"name\":\"result\",\"type\":\"bytes20\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSAR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSDIV\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSELFBALANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSGT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testSHA256\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"result\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSHA3\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSHL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSHR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSIGNEXTEND\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSLOAD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSLT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSSTORE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSUB\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testTIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testXOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50612d9f8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610452575f3560e01c806380947f801161023f578063bf529ca111610139578063dd9bef60116100c1578063f279ca8111610085578063f279ca811461115e578063f4d1fc611461118e578063f58fc36a146111be578063f6b0bbf7146111ee578063fde7721c1461121e57610452565b8063dd9bef601461106e578063de97a3631461109e578063e9f9b3f2146110ce578063ea5141e6146110fe578063edf003cf1461112e57610452565b8063ce3cf4ef11610108578063ce3cf4ef14610f7e578063d117320b14610fae578063d51e7b5b14610fde578063d53ff3fd1461100e578063d93cd5581461103e57610452565b8063bf529ca114610ebe578063c360aba614610eee578063c420eb6114610f1e578063c4bd65d514610f4e57610452565b8063a18683cb116101c7578063b374012b1161018b578063b374012b14610dce578063b3d847f214610dfe578063b7b8620714610e2e578063b81c148414610e5e578063bdc875fc14610e8e57610452565b8063a18683cb14610cf0578063a271b72114610d20578063a60a108714610d3e578063a645c9c214610d6e578063acaebdf614610d9e57610452565b8063962e4dc21161020e578063962e4dc214610c0057806398456f3e14610c305780639a2b7c8114610c605780639cce7cf914610c90578063a040aec614610cc057610452565b806380947f8014610b40578063880eff3914610b70578063918a5fcd14610ba057806391e7b27714610bd057610452565b80633430ec061161035057806360e13cde116102d85780636f099c8d1161029c5780636f099c8d14610a5057806371d91d2814610a805780637b6e0b0e14610ab05780637c191d2014610ae05780637de8c6f814610b1057610452565b806360e13cde14610972578063613d0a82146109a257806363138d4f146109d2578063659bbb4f14610a025780636e7f1fe714610a2057610452565b806340fe26621161031f57806340fe26621461088257806344cf3bc7146108b25780634a61af1f146108e25780634d2c74b3146109125780635590c2d91461094257610452565b80633430ec06146107d4578063371303c0146108045780633a411f12146108225780633a425dfc1461085257610452565b806318093b46116103de578063219cddeb116103a2578063219cddeb146106e45780632294fc7f146107145780632871ef85146107445780632b21ef44146107745780632d34e798146107a457610452565b806318093b46146105f457806319b621d6146106245780631aba07ea146106545780631de2f343146106845780632007332e146106b457610452565b80630ba8a73b116104255780630ba8a73b146105165780631287a68c14610546578063135d52f7146105645780631581cf191461059457806316582150146105c457610452565b8063034aef7114610456578063050082f814610486578063087b4e84146104b65780630b3b996a146104e6575b5f80fd5b610470600480360381019061046b9190612507565b61124e565b60405161047d9190612541565b60405180910390f35b6104a0600480360381019061049b9190612507565b611286565b6040516104ad9190612541565b60405180910390f35b6104d060048036038101906104cb9190612507565b6112be565b6040516104dd9190612541565b60405180910390f35b61050060048036038101906104fb9190612696565b6112f4565b60405161050d9190612757565b60405180910390f35b610530600480360381019061052b9190612507565b611318565b60405161053d9190612541565b60405180910390f35b61054e611350565b60405161055b9190612541565b60405180910390f35b61057e60048036038101906105799190612507565b611358565b60405161058b9190612541565b60405180910390f35b6105ae60048036038101906105a99190612507565b611390565b6040516105bb9190612541565b60405180910390f35b6105de60048036038101906105d99190612507565b6113c8565b6040516105eb9190612541565b60405180910390f35b61060e60048036038101906106099190612507565b611420565b60405161061b9190612541565b60405180910390f35b61063e60048036038101906106399190612507565b61145b565b60405161064b9190612541565b60405180910390f35b61066e60048036038101906106699190612507565b6114e4565b60405161067b9190612541565b60405180910390f35b61069e60048036038101906106999190612507565b611527565b6040516106ab9190612541565b60405180910390f35b6106ce60048036038101906106c99190612507565b611561565b6040516106db9190612541565b60405180910390f35b6106fe60048036038101906106f99190612507565b611599565b60405161070b9190612541565b60405180910390f35b61072e60048036038101906107299190612507565b6115d1565b60405161073b9190612541565b60405180910390f35b61075e60048036038101906107599190612507565b61160c565b60405161076b9190612541565b60405180910390f35b61078e60048036038101906107899190612507565b611644565b60405161079b9190612541565b60405180910390f35b6107be60048036038101906107b99190612507565b61167c565b6040516107cb9190612541565b60405180910390f35b6107ee60048036038101906107e99190612507565b6116b4565b6040516107fb9190612757565b60405180910390f35b61080c61175a565b6040516108199190612541565b60405180910390f35b61083c60048036038101906108379190612507565b611775565b6040516108499190612541565b60405180910390f35b61086c60048036038101906108679190612507565b6117ae565b6040516108799190612541565b60405180910390f35b61089c60048036038101906108979190612507565b6117e6565b6040516108a99190612541565b60405180910390f35b6108cc60048036038101906108c79190612507565b611822565b6040516108d99190612541565b60405180910390f35b6108fc60048036038101906108f79190612507565b61185a565b6040516109099190612541565b60405180910390f35b61092c60048036038101906109279190612507565b611894565b6040516109399190612541565b60405180910390f35b61095c60048036038101906109579190612507565b6118cc565b6040516109699190612541565b60405180910390f35b61098c60048036038101906109879190612507565b61190b565b6040516109999190612541565b60405180910390f35b6109bc60048036038101906109b79190612696565b611943565b6040516109c99190612757565b60405180910390f35b6109ec60048036038101906109e79190612696565b611972565b6040516109f9919061278f565b60405180910390f35b610a0a61199b565b604051610a179190612541565b60405180910390f35b610a3a6004803603810190610a359190612507565b6119d5565b604051610a479190612541565b60405180910390f35b610a6a6004803603810190610a659190612507565b611a10565b604051610a779190612541565b60405180910390f35b610a9a6004803603810190610a959190612507565b611a48565b604051610aa79190612541565b60405180910390f35b610aca6004803603810190610ac59190612507565b611a83565b604051610ad79190612541565b60405180910390f35b610afa6004803603810190610af59190612507565b611abb565b604051610b079190612541565b60405180910390f35b610b2a6004803603810190610b259190612507565b611af3565b604051610b379190612541565b60405180910390f35b610b5a6004803603810190610b559190612507565b611b2c565b604051610b679190612541565b60405180910390f35b610b8a6004803603810190610b859190612507565b611b85565b604051610b979190612541565b60405180910390f35b610bba6004803603810190610bb59190612507565b611bbf565b604051610bc79190612541565b60405180910390f35b610bea6004803603810190610be59190612507565b611bf7565b604051610bf79190612541565b60405180910390f35b610c1a6004803603810190610c159190612696565b611c40565b604051610c279190612757565b60405180910390f35b610c4a6004803603810190610c459190612507565b611cab565b604051610c579190612541565b60405180910390f35b610c7a6004803603810190610c759190612507565b611ce8565b604051610c879190612541565b60405180910390f35b610caa6004803603810190610ca59190612696565b611d20565b604051610cb79190612757565b60405180910390f35b610cda6004803603810190610cd59190612696565b611d4e565b604051610ce79190612757565b60405180910390f35b610d0a6004803603810190610d059190612696565b611d72565b604051610d1791906127e7565b60405180910390f35b610d28611df0565b604051610d359190612541565b60405180910390f35b610d586004803603810190610d539190612507565b611e39565b604051610d659190612541565b60405180910390f35b610d886004803603810190610d839190612507565b611e71565b604051610d959190612541565b60405180910390f35b610db86004803603810190610db39190612507565b611eaa565b604051610dc59190612541565b60405180910390f35b610de86004803603810190610de3919061285d565b611ee2565b604051610df59190612541565b60405180910390f35b610e186004803603810190610e139190612507565b611f2c565b604051610e259190612541565b60405180910390f35b610e486004803603810190610e439190612507565b611f64565b604051610e559190612541565b60405180910390f35b610e786004803603810190610e739190612507565b611f9c565b604051610e859190612541565b60405180910390f35b610ea86004803603810190610ea39190612507565b611fd4565b604051610eb59190612541565b60405180910390f35b610ed86004803603810190610ed39190612507565b61200c565b604051610ee59190612541565b60405180910390f35b610f086004803603810190610f039190612507565b61204d565b604051610f159190612541565b60405180910390f35b610f386004803603810190610f339190612507565b612086565b604051610f459190612541565b60405180910390f35b610f686004803603810190610f639190612507565b6120be565b604051610f759190612541565b60405180910390f35b610f986004803603810190610f939190612507565b6120f8565b604051610fa59190612541565b60405180910390f35b610fc86004803603810190610fc39190612507565b612131565b604051610fd59190612541565b60405180910390f35b610ff86004803603810190610ff39190612507565b612167565b6040516110059190612541565b60405180910390f35b61102860048036038101906110239190612507565b61219f565b6040516110359190612541565b60405180910390f35b61105860048036038101906110539190612507565b6121d7565b6040516110659190612541565b60405180910390f35b61108860048036038101906110839190612507565b61222f565b6040516110959190612541565b60405180910390f35b6110b860048036038101906110b39190612507565b61226e565b6040516110c59190612541565b60405180910390f35b6110e860048036038101906110e39190612507565b6122a7565b6040516110f59190612541565b60405180910390f35b61111860048036038101906111139190612507565b6122e1565b6040516111259190612541565b60405180910390f35b61114860048036038101906111439190612696565b61231f565b6040516111559190612757565b60405180910390f35b61117860048036038101906111739190612507565b61238b565b6040516111859190612541565b60405180910390f35b6111a860048036038101906111a39190612507565b6123c4565b6040516111b59190612541565b60405180910390f35b6111d860048036038101906111d39190612507565b6123ff565b6040516111e59190612541565b60405180910390f35b61120860048036038101906112039190612696565b61243a565b60405161121591906128e2565b60405180910390f35b61123860048036038101906112339190612507565b612469565b6040516112459190612541565b60405180910390f35b5f61125761175a565b505f65deadbeef003690505f805b8481101561127b57369150600181019050611265565b505080915050919050565b5f61128f61175a565b505f65deadbeef003290505f805b848110156112b35732915060018101905061129d565b505080915050919050565b5f6112c761175a565b505f65deadbeef005290505f5b838110156112ea57815f526001810190506112d4565b5080915050919050565b60605f600890506040828451602086015f855af180611311575f80fd5b5050919050565b5f61132161175a565b505f65deadbeef000190505f5b83811015611346575f8201915060018101905061132e565b5080915050919050565b5f8054905090565b5f61136161175a565b505f65deadbeef001790505f5b83811015611386575f8217915060018101905061136e565b5080915050919050565b5f61139961175a565b505f65deadbeef003490505f805b848110156113bd573491506001810190506113a7565b505080915050919050565b5f6113d161175a565b505f65deadbeef000690505f5b83811015611416577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820691506001810190506113de565b5080915050919050565b5f61142961175a565b505f65deadbeef001390505f805b8481101561145057600183139150600181019050611437565b505080915050919050565b5f61146461175a565b505f65deadbeef002090507fffffffff000000000000000000000000000000000000000000000000000000005f525f805b848110156114ae5760045f209150600181019050611495565b507f29045a592007d0c246ef02c2223570da9522d0cf0f73282c79a1bc8f0bb2c23881146114da575f91505b5080915050919050565b5f6114ed61175a565b505f65deadbeef00a49050806010525f5b8381101561151d576004600360028360066010a46001810190506114fe565b5080915050919050565b5f61153061175a565b505f65deadbeef001a90505f805b8481101561155657825f1a915060018101905061153e565b505080915050919050565b5f61156a61175a565b505f65deadbeef001b90505f5b8381101561158f57815f1b9150600181019050611577565b5080915050919050565b5f6115a261175a565b505f65deadbeef004290505f805b848110156115c6574291506001810190506115b0565b505080915050919050565b5f6115da61175a565b505f65deadbeef003190505f305f5b8581101561160057813192506001810190506115e9565b50505080915050919050565b5f61161561175a565b505f65deadbeef004890505f805b8481101561163957489150600181019050611623565b505080915050919050565b5f61164d61175a565b505f65deadbeef003d90505f805b84811015611671573d915060018101905061165b565b505080915050919050565b5f61168561175a565b505f65deadbeef004390505f805b848110156116a957439150600181019050611693565b505080915050919050565b600281815481106116c3575f80fd5b905f5260205f20015f9150905080546116db90612928565b80601f016020809104026020016040519081016040528092919081815260200182805461170790612928565b80156117525780601f1061172957610100808354040283529160200191611752565b820191905f5260205f20905b81548152906001019060200180831161173557829003601f168201915b505050505081565b5f60015f546117699190612985565b5f819055505f54905090565b5f61177e61175a565b505f65deadbeef000490505f5b838110156117a45760018204915060018101905061178b565b5080915050919050565b5f6117b761175a565b505f65deadbeef003790505f5b838110156117dc5760205f80376001810190506117c4565b5080915050919050565b5f6117ef61175a565b505f65deadbeef00a09050806010525f5b838110156118185760066010a0600181019050611800565b5080915050919050565b5f61182b61175a565b505f65deadbeef003390505f805b8481101561184f57339150600181019050611839565b505080915050919050565b5f61186361175a565b505f65deadbeef005390505f5b8381101561188a5763deadbeef5f52600181019050611870565b5080915050919050565b5f61189d61175a565b505f65deadbeef003a90505f805b848110156118c1573a91506001810190506118ab565b505080915050919050565b5f6118d561175a565b505f65deadbeef005190505f815f525f5b848110156118fd575f5191506001810190506118e6565b508091505080915050919050565b5f61191461175a565b505f65deadbeef001d90505f5b8381101561193957815f1d9150600181019050611921565b5080915050919050565b60605f6005905060208301835160405160208183855f885af180611965575f80fd5b8195505050505050919050565b5f80600290506020830183518360208183855f885af180611991575f80fd5b5050505050919050565b5f6119a461175a565b505b6103e85a11156119cd576001805f8282546119c19190612985565b925050819055506119a6565b600154905090565b5f6119de61175a565b505f65deadbeef001090505f805b84811015611a05578260011091506001810190506119ec565b505080915050919050565b5f611a1961175a565b505f65deadbeef004490505f805b84811015611a3d57449150600181019050611a27565b505080915050919050565b5f611a5161175a565b505f65deadbeef001190505f805b84811015611a7857600183119150600181019050611a5f565b505080915050919050565b5f611a8c61175a565b505f65deadbeef003e90505f5b83811015611ab15760205f803e600181019050611a99565b5080915050919050565b5f611ac461175a565b505f65deadbeef004590505f805b84811015611ae857459150600181019050611ad2565b505080915050919050565b5f611afc61175a565b505f65deadbeef000290505f5b83811015611b2257600182029150600181019050611b09565b5080915050919050565b5f611b3561175a565b505f65deadbeef000890505f5b83811015611b7b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f83089150600181019050611b42565b5080915050919050565b5f611b8e61175a565b505f65deadbeef00549050805f555f5b83811015611bb5575f549150600181019050611b9e565b5080915050919050565b5f611bc861175a565b505f65deadbeef005a90505f805b84811015611bec575a9150600181019050611bd6565b505080915050919050565b5f611c0061175a565b505f65deadbeef001990505f5b83811015611c245781199150600181019050611c0d565b5065deadbeef00198114611c3757801990505b80915050919050565b606080825114611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c90612a12565b60405180910390fd5b5f6007905060208301835160408482845f875af180611ca2575f80fd5b50505050919050565b5f611cb461175a565b505f65deadbeef00a19050806010525f5b83811015611cde578060066010a1600181019050611cc5565b5080915050919050565b5f611cf161175a565b505f65deadbeef001690505f5b83811015611d16578182169150600181019050611cfe565b5080915050919050565b60605f60049050602083018351604051818183855f885af180611d41575f80fd5b8195505050505050919050565b60605f600890506040828451602086015f855af180611d6b575f80fd5b5050919050565b5f6080825114611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae90612a7a565b60405180910390fd5b5f60019050602083016020810151601f1a602082015260206040516080835f865af180611de2575f80fd5b604051519350505050919050565b5f611df961175a565b505b6103e85a1115611e31576001805f828254611e169190612985565b9250508190555043600154611e2b9190612ac5565b50611dfb565b600154905090565b5f611e4261175a565b505f65deadbeef004690505f805b84811015611e6657469150600181019050611e50565b505080915050919050565b5f611e7a61175a565b505f65deadbeef000590505f5b83811015611ea057600182059150600181019050611e87565b5080915050919050565b5f611eb361175a565b505f65deadbeef003990505f5b83811015611ed85760205f8039600181019050611ec0565b5080915050919050565b5f6002838390918060018154018082558091505060019003905f5260205f20015f909192909192909192909192509182611f1d929190612c9c565b50600280549050905092915050565b5f611f3561175a565b505f65deadbeef005990505f805b84811015611f5957599150600181019050611f43565b505080915050919050565b5f611f6d61175a565b505f65deadbeef003890505f805b84811015611f9157389150600181019050611f7b565b505080915050919050565b5f611fa561175a565b505f65deadbeef004190505f805b84811015611fc957419150600181019050611fb3565b505080915050919050565b5f611fdd61175a565b505f65deadbeef003090505f805b8481101561200157309150600181019050611feb565b505080915050919050565b5f61201561175a565b505f65deadbeef00a39050806010525f5b8381101561204357600360028260066010a3600181019050612026565b5080915050919050565b5f61205661175a565b505f65deadbeef000b90505f5b8381101561207c578160200b9150600181019050612063565b5080915050919050565b5f61208f61175a565b505f65deadbeef004790505f805b848110156120b35747915060018101905061209d565b505080915050919050565b5f6120c761175a565b505f65deadbeef001c90505f805b848110156120ed57825f1c92506001810190506120d5565b505080915050919050565b5f61210161175a565b505f65deadbeef003590505f805b84811015612126575f35915060018101905061210f565b505080915050919050565b5f61213a61175a565b505f65deadbeef005590505f5b8381101561215d57815f55600181019050612147565b5080915050919050565b5f61217061175a565b505f65deadbeef001890505f5b83811015612195575f8218915060018101905061217d565b5080915050919050565b5f6121a861175a565b505f65deadbeef000390505f5b838110156121cd575f820391506001810190506121b5565b5080915050919050565b5f6121e061175a565b505f65deadbeef000790505f5b83811015612225577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820791506001810190506121ed565b5080915050919050565b5f61223861175a565b505f65deadbeef00a29050806010525f5b838110156122645760028160066010a2600181019050612249565b5080915050919050565b5f61227761175a565b505f65deadbeef000a90505f5b8381101561229d576001820a9150600181019050612284565b5080915050919050565b5f6122b061175a565b505f65deadbeef001490505f805b848110156122d65782831491506001810190506122be565b505080915050919050565b5f6122ea61175a565b505f65deadbeef004090505f600143035f5b8581101561231357814092506001810190506122fc565b50505080915050919050565b60606080825114612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90612a12565b60405180910390fd5b5f6006905060208301835160408482845f875af180612382575f80fd5b50505050919050565b5f61239461175a565b505f65deadbeef001590505f805b848110156123b957821591506001810190506123a2565b505080915050919050565b5f6123cd61175a565b505f65deadbeef001290505f805b848110156123f4578260011291506001810190506123db565b505080915050919050565b5f61240861175a565b505f65deadbeef003b90505f305f5b8581101561242e57813b9250600181019050612417565b50505080915050919050565b5f806003905060208301835160405160148183855f885af18061245b575f80fd5b815195505050505050919050565b5f61247261175a565b505f65deadbeef000990505f5b838110156124b9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60018309915060018101905061247f565b5080915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6124e6816124d4565b81146124f0575f80fd5b50565b5f81359050612501816124dd565b92915050565b5f6020828403121561251c5761251b6124cc565b5b5f612529848285016124f3565b91505092915050565b61253b816124d4565b82525050565b5f6020820190506125545f830184612532565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6125a882612562565b810181811067ffffffffffffffff821117156125c7576125c6612572565b5b80604052505050565b5f6125d96124c3565b90506125e5828261259f565b919050565b5f67ffffffffffffffff82111561260457612603612572565b5b61260d82612562565b9050602081019050919050565b828183375f83830152505050565b5f61263a612635846125ea565b6125d0565b9050828152602081018484840111156126565761265561255e565b5b61266184828561261a565b509392505050565b5f82601f83011261267d5761267c61255a565b5b813561268d848260208601612628565b91505092915050565b5f602082840312156126ab576126aa6124cc565b5b5f82013567ffffffffffffffff8111156126c8576126c76124d0565b5b6126d484828501612669565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156127145780820151818401526020810190506126f9565b5f8484015250505050565b5f612729826126dd565b61273381856126e7565b93506127438185602086016126f7565b61274c81612562565b840191505092915050565b5f6020820190508181035f83015261276f818461271f565b905092915050565b5f819050919050565b61278981612777565b82525050565b5f6020820190506127a25f830184612780565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127d1826127a8565b9050919050565b6127e1816127c7565b82525050565b5f6020820190506127fa5f8301846127d8565b92915050565b5f80fd5b5f80fd5b5f8083601f84011261281d5761281c61255a565b5b8235905067ffffffffffffffff81111561283a57612839612800565b5b60208301915083600182028301111561285657612855612804565b5b9250929050565b5f8060208385031215612873576128726124cc565b5b5f83013567ffffffffffffffff8111156128905761288f6124d0565b5b61289c85828601612808565b92509250509250929050565b5f7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b6128dc816128a8565b82525050565b5f6020820190506128f55f8301846128d3565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061293f57607f821691505b602082108103612952576129516128fb565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61298f826124d4565b915061299a836124d4565b92508282019050808211156129b2576129b1612958565b5b92915050565b5f82825260208201905092915050565b7f496e76616c696420696e707574206c656e6774680000000000000000000000005f82015250565b5f6129fc6014836129b8565b9150612a07826129c8565b602082019050919050565b5f6020820190508181035f830152612a29816129f0565b9050919050565b7f496e76616c696420696e7075742064617461206c656e6774682e0000000000005f82015250565b5f612a64601a836129b8565b9150612a6f82612a30565b602082019050919050565b5f6020820190508181035f830152612a9181612a58565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612acf826124d4565b9150612ada836124d4565b925082612aea57612ae9612a98565b5b828206905092915050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302612b5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612b20565b612b658683612b20565b95508019841693508086168417925050509392505050565b5f819050919050565b5f612ba0612b9b612b96846124d4565b612b7d565b6124d4565b9050919050565b5f819050919050565b612bb983612b86565b612bcd612bc582612ba7565b848454612b2c565b825550505050565b5f90565b612be1612bd5565b612bec818484612bb0565b505050565b5b81811015612c0f57612c045f82612bd9565b600181019050612bf2565b5050565b601f821115612c5457612c2581612aff565b612c2e84612b11565b81016020851015612c3d578190505b612c51612c4985612b11565b830182612bf1565b50505b505050565b5f82821c905092915050565b5f612c745f1984600802612c59565b1980831691505092915050565b5f612c8c8383612c65565b9150826002028217905092915050565b612ca68383612af5565b67ffffffffffffffff811115612cbf57612cbe612572565b5b612cc98254612928565b612cd4828285612c13565b5f601f831160018114612d01575f8415612cef578287013590505b612cf98582612c81565b865550612d60565b601f198416612d0f86612aff565b5f5b82811015612d3657848901358255600182019150602085019450602081019050612d11565b86831015612d535784890135612d4f601f891682612c65565b8355505b6001600288020188555050505b5050505050505056fea26469706673582212203c57a6b96f48cb24258b084af1375fb6fc2d63da2324c357edaf799dddc79fb664736f6c63430008150033", -} - -// LoadTesterABI is the input ABI used to generate the binding from. -// Deprecated: Use LoadTesterMetaData.ABI instead. -var LoadTesterABI = LoadTesterMetaData.ABI - -// LoadTesterBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use LoadTesterMetaData.Bin instead. -var LoadTesterBin = LoadTesterMetaData.Bin - -// DeployLoadTester deploys a new Ethereum contract, binding an instance of LoadTester to it. -func DeployLoadTester(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *LoadTester, error) { - parsed, err := LoadTesterMetaData.GetAbi() - if err != nil { - return common.Address{}, nil, nil, err - } - if parsed == nil { - return common.Address{}, nil, nil, errors.New("GetABI returned nil") - } - - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(LoadTesterBin), backend) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &LoadTester{LoadTesterCaller: LoadTesterCaller{contract: contract}, LoadTesterTransactor: LoadTesterTransactor{contract: contract}, LoadTesterFilterer: LoadTesterFilterer{contract: contract}}, nil -} - -// LoadTester is an auto generated Go binding around an Ethereum contract. -type LoadTester struct { - LoadTesterCaller // Read-only binding to the contract - LoadTesterTransactor // Write-only binding to the contract - LoadTesterFilterer // Log filterer for contract events -} - -// LoadTesterCaller is an auto generated read-only Go binding around an Ethereum contract. -type LoadTesterCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LoadTesterTransactor is an auto generated write-only Go binding around an Ethereum contract. -type LoadTesterTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LoadTesterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type LoadTesterFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LoadTesterSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type LoadTesterSession struct { - Contract *LoadTester // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// LoadTesterCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type LoadTesterCallerSession struct { - Contract *LoadTesterCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// LoadTesterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type LoadTesterTransactorSession struct { - Contract *LoadTesterTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// LoadTesterRaw is an auto generated low-level Go binding around an Ethereum contract. -type LoadTesterRaw struct { - Contract *LoadTester // Generic contract binding to access the raw methods on -} - -// LoadTesterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type LoadTesterCallerRaw struct { - Contract *LoadTesterCaller // Generic read-only contract binding to access the raw methods on -} - -// LoadTesterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type LoadTesterTransactorRaw struct { - Contract *LoadTesterTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewLoadTester creates a new instance of LoadTester, bound to a specific deployed contract. -func NewLoadTester(address common.Address, backend bind.ContractBackend) (*LoadTester, error) { - contract, err := bindLoadTester(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &LoadTester{LoadTesterCaller: LoadTesterCaller{contract: contract}, LoadTesterTransactor: LoadTesterTransactor{contract: contract}, LoadTesterFilterer: LoadTesterFilterer{contract: contract}}, nil -} - -// NewLoadTesterCaller creates a new read-only instance of LoadTester, bound to a specific deployed contract. -func NewLoadTesterCaller(address common.Address, caller bind.ContractCaller) (*LoadTesterCaller, error) { - contract, err := bindLoadTester(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &LoadTesterCaller{contract: contract}, nil -} - -// NewLoadTesterTransactor creates a new write-only instance of LoadTester, bound to a specific deployed contract. -func NewLoadTesterTransactor(address common.Address, transactor bind.ContractTransactor) (*LoadTesterTransactor, error) { - contract, err := bindLoadTester(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &LoadTesterTransactor{contract: contract}, nil -} - -// NewLoadTesterFilterer creates a new log filterer instance of LoadTester, bound to a specific deployed contract. -func NewLoadTesterFilterer(address common.Address, filterer bind.ContractFilterer) (*LoadTesterFilterer, error) { - contract, err := bindLoadTester(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &LoadTesterFilterer{contract: contract}, nil -} - -// bindLoadTester binds a generic wrapper to an already deployed contract. -func bindLoadTester(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := LoadTesterMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_LoadTester *LoadTesterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _LoadTester.Contract.LoadTesterCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_LoadTester *LoadTesterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LoadTester.Contract.LoadTesterTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_LoadTester *LoadTesterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _LoadTester.Contract.LoadTesterTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_LoadTester *LoadTesterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _LoadTester.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_LoadTester *LoadTesterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LoadTester.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_LoadTester *LoadTesterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _LoadTester.Contract.contract.Transact(opts, method, params...) -} - -// Dumpster is a free data retrieval call binding the contract method 0x3430ec06. -// -// Solidity: function dumpster(uint256 ) view returns(bytes) -func (_LoadTester *LoadTesterCaller) Dumpster(opts *bind.CallOpts, arg0 *big.Int) ([]byte, error) { - var out []interface{} - err := _LoadTester.contract.Call(opts, &out, "dumpster", arg0) - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// Dumpster is a free data retrieval call binding the contract method 0x3430ec06. -// -// Solidity: function dumpster(uint256 ) view returns(bytes) -func (_LoadTester *LoadTesterSession) Dumpster(arg0 *big.Int) ([]byte, error) { - return _LoadTester.Contract.Dumpster(&_LoadTester.CallOpts, arg0) -} - -// Dumpster is a free data retrieval call binding the contract method 0x3430ec06. -// -// Solidity: function dumpster(uint256 ) view returns(bytes) -func (_LoadTester *LoadTesterCallerSession) Dumpster(arg0 *big.Int) ([]byte, error) { - return _LoadTester.Contract.Dumpster(&_LoadTester.CallOpts, arg0) -} - -// GetCallCounter is a free data retrieval call binding the contract method 0x1287a68c. -// -// Solidity: function getCallCounter() view returns(uint256) -func (_LoadTester *LoadTesterCaller) GetCallCounter(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _LoadTester.contract.Call(opts, &out, "getCallCounter") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetCallCounter is a free data retrieval call binding the contract method 0x1287a68c. -// -// Solidity: function getCallCounter() view returns(uint256) -func (_LoadTester *LoadTesterSession) GetCallCounter() (*big.Int, error) { - return _LoadTester.Contract.GetCallCounter(&_LoadTester.CallOpts) -} - -// GetCallCounter is a free data retrieval call binding the contract method 0x1287a68c. -// -// Solidity: function getCallCounter() view returns(uint256) -func (_LoadTester *LoadTesterCallerSession) GetCallCounter() (*big.Int, error) { - return _LoadTester.Contract.GetCallCounter(&_LoadTester.CallOpts) -} - -// Inc is a paid mutator transaction binding the contract method 0x371303c0. -// -// Solidity: function inc() returns(uint256) -func (_LoadTester *LoadTesterTransactor) Inc(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "inc") -} - -// Inc is a paid mutator transaction binding the contract method 0x371303c0. -// -// Solidity: function inc() returns(uint256) -func (_LoadTester *LoadTesterSession) Inc() (*types.Transaction, error) { - return _LoadTester.Contract.Inc(&_LoadTester.TransactOpts) -} - -// Inc is a paid mutator transaction binding the contract method 0x371303c0. -// -// Solidity: function inc() returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) Inc() (*types.Transaction, error) { - return _LoadTester.Contract.Inc(&_LoadTester.TransactOpts) -} - -// LoopBlockHashUntilLimit is a paid mutator transaction binding the contract method 0xa271b721. -// -// Solidity: function loopBlockHashUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterTransactor) LoopBlockHashUntilLimit(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "loopBlockHashUntilLimit") -} - -// LoopBlockHashUntilLimit is a paid mutator transaction binding the contract method 0xa271b721. -// -// Solidity: function loopBlockHashUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterSession) LoopBlockHashUntilLimit() (*types.Transaction, error) { - return _LoadTester.Contract.LoopBlockHashUntilLimit(&_LoadTester.TransactOpts) -} - -// LoopBlockHashUntilLimit is a paid mutator transaction binding the contract method 0xa271b721. -// -// Solidity: function loopBlockHashUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) LoopBlockHashUntilLimit() (*types.Transaction, error) { - return _LoadTester.Contract.LoopBlockHashUntilLimit(&_LoadTester.TransactOpts) -} - -// LoopUntilLimit is a paid mutator transaction binding the contract method 0x659bbb4f. -// -// Solidity: function loopUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterTransactor) LoopUntilLimit(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "loopUntilLimit") -} - -// LoopUntilLimit is a paid mutator transaction binding the contract method 0x659bbb4f. -// -// Solidity: function loopUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterSession) LoopUntilLimit() (*types.Transaction, error) { - return _LoadTester.Contract.LoopUntilLimit(&_LoadTester.TransactOpts) -} - -// LoopUntilLimit is a paid mutator transaction binding the contract method 0x659bbb4f. -// -// Solidity: function loopUntilLimit() returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) LoopUntilLimit() (*types.Transaction, error) { - return _LoadTester.Contract.LoopUntilLimit(&_LoadTester.TransactOpts) -} - -// Store is a paid mutator transaction binding the contract method 0xb374012b. -// -// Solidity: function store(bytes trash) returns(uint256) -func (_LoadTester *LoadTesterTransactor) Store(opts *bind.TransactOpts, trash []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "store", trash) -} - -// Store is a paid mutator transaction binding the contract method 0xb374012b. -// -// Solidity: function store(bytes trash) returns(uint256) -func (_LoadTester *LoadTesterSession) Store(trash []byte) (*types.Transaction, error) { - return _LoadTester.Contract.Store(&_LoadTester.TransactOpts, trash) -} - -// Store is a paid mutator transaction binding the contract method 0xb374012b. -// -// Solidity: function store(bytes trash) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) Store(trash []byte) (*types.Transaction, error) { - return _LoadTester.Contract.Store(&_LoadTester.TransactOpts, trash) -} - -// TestADD is a paid mutator transaction binding the contract method 0x0ba8a73b. -// -// Solidity: function testADD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestADD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testADD", x) -} - -// TestADD is a paid mutator transaction binding the contract method 0x0ba8a73b. -// -// Solidity: function testADD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestADD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADD(&_LoadTester.TransactOpts, x) -} - -// TestADD is a paid mutator transaction binding the contract method 0x0ba8a73b. -// -// Solidity: function testADD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestADD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADD(&_LoadTester.TransactOpts, x) -} - -// TestADDMOD is a paid mutator transaction binding the contract method 0x80947f80. -// -// Solidity: function testADDMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestADDMOD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testADDMOD", x) -} - -// TestADDMOD is a paid mutator transaction binding the contract method 0x80947f80. -// -// Solidity: function testADDMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestADDMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADDMOD(&_LoadTester.TransactOpts, x) -} - -// TestADDMOD is a paid mutator transaction binding the contract method 0x80947f80. -// -// Solidity: function testADDMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestADDMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADDMOD(&_LoadTester.TransactOpts, x) -} - -// TestADDRESS is a paid mutator transaction binding the contract method 0xbdc875fc. -// -// Solidity: function testADDRESS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestADDRESS(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testADDRESS", x) -} - -// TestADDRESS is a paid mutator transaction binding the contract method 0xbdc875fc. -// -// Solidity: function testADDRESS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestADDRESS(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADDRESS(&_LoadTester.TransactOpts, x) -} - -// TestADDRESS is a paid mutator transaction binding the contract method 0xbdc875fc. -// -// Solidity: function testADDRESS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestADDRESS(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestADDRESS(&_LoadTester.TransactOpts, x) -} - -// TestAND is a paid mutator transaction binding the contract method 0x9a2b7c81. -// -// Solidity: function testAND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestAND(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testAND", x) -} - -// TestAND is a paid mutator transaction binding the contract method 0x9a2b7c81. -// -// Solidity: function testAND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestAND(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestAND(&_LoadTester.TransactOpts, x) -} - -// TestAND is a paid mutator transaction binding the contract method 0x9a2b7c81. -// -// Solidity: function testAND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestAND(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestAND(&_LoadTester.TransactOpts, x) -} - -// TestBALANCE is a paid mutator transaction binding the contract method 0x2294fc7f. -// -// Solidity: function testBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestBALANCE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testBALANCE", x) -} - -// TestBALANCE is a paid mutator transaction binding the contract method 0x2294fc7f. -// -// Solidity: function testBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestBALANCE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBALANCE(&_LoadTester.TransactOpts, x) -} - -// TestBALANCE is a paid mutator transaction binding the contract method 0x2294fc7f. -// -// Solidity: function testBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestBALANCE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBALANCE(&_LoadTester.TransactOpts, x) -} - -// TestBASEFEE is a paid mutator transaction binding the contract method 0x2871ef85. -// -// Solidity: function testBASEFEE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestBASEFEE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testBASEFEE", x) -} - -// TestBASEFEE is a paid mutator transaction binding the contract method 0x2871ef85. -// -// Solidity: function testBASEFEE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestBASEFEE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBASEFEE(&_LoadTester.TransactOpts, x) -} - -// TestBASEFEE is a paid mutator transaction binding the contract method 0x2871ef85. -// -// Solidity: function testBASEFEE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestBASEFEE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBASEFEE(&_LoadTester.TransactOpts, x) -} - -// TestBLOCKHASH is a paid mutator transaction binding the contract method 0xea5141e6. -// -// Solidity: function testBLOCKHASH(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestBLOCKHASH(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testBLOCKHASH", x) -} - -// TestBLOCKHASH is a paid mutator transaction binding the contract method 0xea5141e6. -// -// Solidity: function testBLOCKHASH(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestBLOCKHASH(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBLOCKHASH(&_LoadTester.TransactOpts, x) -} - -// TestBLOCKHASH is a paid mutator transaction binding the contract method 0xea5141e6. -// -// Solidity: function testBLOCKHASH(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestBLOCKHASH(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBLOCKHASH(&_LoadTester.TransactOpts, x) -} - -// TestBYTE is a paid mutator transaction binding the contract method 0x1de2f343. -// -// Solidity: function testBYTE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestBYTE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testBYTE", x) -} - -// TestBYTE is a paid mutator transaction binding the contract method 0x1de2f343. -// -// Solidity: function testBYTE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestBYTE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBYTE(&_LoadTester.TransactOpts, x) -} - -// TestBYTE is a paid mutator transaction binding the contract method 0x1de2f343. -// -// Solidity: function testBYTE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestBYTE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestBYTE(&_LoadTester.TransactOpts, x) -} - -// TestBlake2f is a paid mutator transaction binding the contract method 0xa040aec6. -// -// Solidity: function testBlake2f(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestBlake2f(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testBlake2f", inputData) -} - -// TestBlake2f is a paid mutator transaction binding the contract method 0xa040aec6. -// -// Solidity: function testBlake2f(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestBlake2f(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestBlake2f(&_LoadTester.TransactOpts, inputData) -} - -// TestBlake2f is a paid mutator transaction binding the contract method 0xa040aec6. -// -// Solidity: function testBlake2f(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestBlake2f(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestBlake2f(&_LoadTester.TransactOpts, inputData) -} - -// TestCALLDATACOPY is a paid mutator transaction binding the contract method 0x3a425dfc. -// -// Solidity: function testCALLDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCALLDATACOPY(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCALLDATACOPY", x) -} - -// TestCALLDATACOPY is a paid mutator transaction binding the contract method 0x3a425dfc. -// -// Solidity: function testCALLDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCALLDATACOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATACOPY(&_LoadTester.TransactOpts, x) -} - -// TestCALLDATACOPY is a paid mutator transaction binding the contract method 0x3a425dfc. -// -// Solidity: function testCALLDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCALLDATACOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATACOPY(&_LoadTester.TransactOpts, x) -} - -// TestCALLDATALOAD is a paid mutator transaction binding the contract method 0xce3cf4ef. -// -// Solidity: function testCALLDATALOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCALLDATALOAD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCALLDATALOAD", x) -} - -// TestCALLDATALOAD is a paid mutator transaction binding the contract method 0xce3cf4ef. -// -// Solidity: function testCALLDATALOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCALLDATALOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATALOAD(&_LoadTester.TransactOpts, x) -} - -// TestCALLDATALOAD is a paid mutator transaction binding the contract method 0xce3cf4ef. -// -// Solidity: function testCALLDATALOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCALLDATALOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATALOAD(&_LoadTester.TransactOpts, x) -} - -// TestCALLDATASIZE is a paid mutator transaction binding the contract method 0x034aef71. -// -// Solidity: function testCALLDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCALLDATASIZE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCALLDATASIZE", x) -} - -// TestCALLDATASIZE is a paid mutator transaction binding the contract method 0x034aef71. -// -// Solidity: function testCALLDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCALLDATASIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATASIZE(&_LoadTester.TransactOpts, x) -} - -// TestCALLDATASIZE is a paid mutator transaction binding the contract method 0x034aef71. -// -// Solidity: function testCALLDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCALLDATASIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLDATASIZE(&_LoadTester.TransactOpts, x) -} - -// TestCALLER is a paid mutator transaction binding the contract method 0x44cf3bc7. -// -// Solidity: function testCALLER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCALLER(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCALLER", x) -} - -// TestCALLER is a paid mutator transaction binding the contract method 0x44cf3bc7. -// -// Solidity: function testCALLER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCALLER(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLER(&_LoadTester.TransactOpts, x) -} - -// TestCALLER is a paid mutator transaction binding the contract method 0x44cf3bc7. -// -// Solidity: function testCALLER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCALLER(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLER(&_LoadTester.TransactOpts, x) -} - -// TestCALLVALUE is a paid mutator transaction binding the contract method 0x1581cf19. -// -// Solidity: function testCALLVALUE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCALLVALUE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCALLVALUE", x) -} - -// TestCALLVALUE is a paid mutator transaction binding the contract method 0x1581cf19. -// -// Solidity: function testCALLVALUE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCALLVALUE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLVALUE(&_LoadTester.TransactOpts, x) -} - -// TestCALLVALUE is a paid mutator transaction binding the contract method 0x1581cf19. -// -// Solidity: function testCALLVALUE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCALLVALUE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCALLVALUE(&_LoadTester.TransactOpts, x) -} - -// TestCHAINID is a paid mutator transaction binding the contract method 0xa60a1087. -// -// Solidity: function testCHAINID(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCHAINID(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCHAINID", x) -} - -// TestCHAINID is a paid mutator transaction binding the contract method 0xa60a1087. -// -// Solidity: function testCHAINID(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCHAINID(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCHAINID(&_LoadTester.TransactOpts, x) -} - -// TestCHAINID is a paid mutator transaction binding the contract method 0xa60a1087. -// -// Solidity: function testCHAINID(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCHAINID(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCHAINID(&_LoadTester.TransactOpts, x) -} - -// TestCODECOPY is a paid mutator transaction binding the contract method 0xacaebdf6. -// -// Solidity: function testCODECOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCODECOPY(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCODECOPY", x) -} - -// TestCODECOPY is a paid mutator transaction binding the contract method 0xacaebdf6. -// -// Solidity: function testCODECOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCODECOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCODECOPY(&_LoadTester.TransactOpts, x) -} - -// TestCODECOPY is a paid mutator transaction binding the contract method 0xacaebdf6. -// -// Solidity: function testCODECOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCODECOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCODECOPY(&_LoadTester.TransactOpts, x) -} - -// TestCODESIZE is a paid mutator transaction binding the contract method 0xb7b86207. -// -// Solidity: function testCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCODESIZE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCODESIZE", x) -} - -// TestCODESIZE is a paid mutator transaction binding the contract method 0xb7b86207. -// -// Solidity: function testCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCODESIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCODESIZE(&_LoadTester.TransactOpts, x) -} - -// TestCODESIZE is a paid mutator transaction binding the contract method 0xb7b86207. -// -// Solidity: function testCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCODESIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCODESIZE(&_LoadTester.TransactOpts, x) -} - -// TestCOINBASE is a paid mutator transaction binding the contract method 0xb81c1484. -// -// Solidity: function testCOINBASE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestCOINBASE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testCOINBASE", x) -} - -// TestCOINBASE is a paid mutator transaction binding the contract method 0xb81c1484. -// -// Solidity: function testCOINBASE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestCOINBASE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCOINBASE(&_LoadTester.TransactOpts, x) -} - -// TestCOINBASE is a paid mutator transaction binding the contract method 0xb81c1484. -// -// Solidity: function testCOINBASE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestCOINBASE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestCOINBASE(&_LoadTester.TransactOpts, x) -} - -// TestDIFFICULTY is a paid mutator transaction binding the contract method 0x6f099c8d. -// -// Solidity: function testDIFFICULTY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestDIFFICULTY(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testDIFFICULTY", x) -} - -// TestDIFFICULTY is a paid mutator transaction binding the contract method 0x6f099c8d. -// -// Solidity: function testDIFFICULTY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestDIFFICULTY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestDIFFICULTY(&_LoadTester.TransactOpts, x) -} - -// TestDIFFICULTY is a paid mutator transaction binding the contract method 0x6f099c8d. -// -// Solidity: function testDIFFICULTY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestDIFFICULTY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestDIFFICULTY(&_LoadTester.TransactOpts, x) -} - -// TestDIV is a paid mutator transaction binding the contract method 0x3a411f12. -// -// Solidity: function testDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestDIV(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testDIV", x) -} - -// TestDIV is a paid mutator transaction binding the contract method 0x3a411f12. -// -// Solidity: function testDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestDIV(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestDIV(&_LoadTester.TransactOpts, x) -} - -// TestDIV is a paid mutator transaction binding the contract method 0x3a411f12. -// -// Solidity: function testDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestDIV(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestDIV(&_LoadTester.TransactOpts, x) -} - -// TestECAdd is a paid mutator transaction binding the contract method 0xedf003cf. -// -// Solidity: function testECAdd(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestECAdd(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testECAdd", inputData) -} - -// TestECAdd is a paid mutator transaction binding the contract method 0xedf003cf. -// -// Solidity: function testECAdd(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestECAdd(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECAdd(&_LoadTester.TransactOpts, inputData) -} - -// TestECAdd is a paid mutator transaction binding the contract method 0xedf003cf. -// -// Solidity: function testECAdd(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestECAdd(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECAdd(&_LoadTester.TransactOpts, inputData) -} - -// TestECMul is a paid mutator transaction binding the contract method 0x962e4dc2. -// -// Solidity: function testECMul(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestECMul(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testECMul", inputData) -} - -// TestECMul is a paid mutator transaction binding the contract method 0x962e4dc2. -// -// Solidity: function testECMul(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestECMul(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECMul(&_LoadTester.TransactOpts, inputData) -} - -// TestECMul is a paid mutator transaction binding the contract method 0x962e4dc2. -// -// Solidity: function testECMul(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestECMul(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECMul(&_LoadTester.TransactOpts, inputData) -} - -// TestECPairing is a paid mutator transaction binding the contract method 0x0b3b996a. -// -// Solidity: function testECPairing(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestECPairing(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testECPairing", inputData) -} - -// TestECPairing is a paid mutator transaction binding the contract method 0x0b3b996a. -// -// Solidity: function testECPairing(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestECPairing(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECPairing(&_LoadTester.TransactOpts, inputData) -} - -// TestECPairing is a paid mutator transaction binding the contract method 0x0b3b996a. -// -// Solidity: function testECPairing(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestECPairing(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECPairing(&_LoadTester.TransactOpts, inputData) -} - -// TestECRecover is a paid mutator transaction binding the contract method 0xa18683cb. -// -// Solidity: function testECRecover(bytes inputData) returns(address result) -func (_LoadTester *LoadTesterTransactor) TestECRecover(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testECRecover", inputData) -} - -// TestECRecover is a paid mutator transaction binding the contract method 0xa18683cb. -// -// Solidity: function testECRecover(bytes inputData) returns(address result) -func (_LoadTester *LoadTesterSession) TestECRecover(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECRecover(&_LoadTester.TransactOpts, inputData) -} - -// TestECRecover is a paid mutator transaction binding the contract method 0xa18683cb. -// -// Solidity: function testECRecover(bytes inputData) returns(address result) -func (_LoadTester *LoadTesterTransactorSession) TestECRecover(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestECRecover(&_LoadTester.TransactOpts, inputData) -} - -// TestEQ is a paid mutator transaction binding the contract method 0xe9f9b3f2. -// -// Solidity: function testEQ(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestEQ(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testEQ", x) -} - -// TestEQ is a paid mutator transaction binding the contract method 0xe9f9b3f2. -// -// Solidity: function testEQ(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestEQ(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEQ(&_LoadTester.TransactOpts, x) -} - -// TestEQ is a paid mutator transaction binding the contract method 0xe9f9b3f2. -// -// Solidity: function testEQ(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestEQ(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEQ(&_LoadTester.TransactOpts, x) -} - -// TestEXP is a paid mutator transaction binding the contract method 0xde97a363. -// -// Solidity: function testEXP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestEXP(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testEXP", x) -} - -// TestEXP is a paid mutator transaction binding the contract method 0xde97a363. -// -// Solidity: function testEXP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestEXP(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEXP(&_LoadTester.TransactOpts, x) -} - -// TestEXP is a paid mutator transaction binding the contract method 0xde97a363. -// -// Solidity: function testEXP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestEXP(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEXP(&_LoadTester.TransactOpts, x) -} - -// TestEXTCODESIZE is a paid mutator transaction binding the contract method 0xf58fc36a. -// -// Solidity: function testEXTCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestEXTCODESIZE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testEXTCODESIZE", x) -} - -// TestEXTCODESIZE is a paid mutator transaction binding the contract method 0xf58fc36a. -// -// Solidity: function testEXTCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestEXTCODESIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEXTCODESIZE(&_LoadTester.TransactOpts, x) -} - -// TestEXTCODESIZE is a paid mutator transaction binding the contract method 0xf58fc36a. -// -// Solidity: function testEXTCODESIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestEXTCODESIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestEXTCODESIZE(&_LoadTester.TransactOpts, x) -} - -// TestGAS is a paid mutator transaction binding the contract method 0x918a5fcd. -// -// Solidity: function testGAS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestGAS(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testGAS", x) -} - -// TestGAS is a paid mutator transaction binding the contract method 0x918a5fcd. -// -// Solidity: function testGAS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestGAS(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGAS(&_LoadTester.TransactOpts, x) -} - -// TestGAS is a paid mutator transaction binding the contract method 0x918a5fcd. -// -// Solidity: function testGAS(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestGAS(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGAS(&_LoadTester.TransactOpts, x) -} - -// TestGASLIMIT is a paid mutator transaction binding the contract method 0x7c191d20. -// -// Solidity: function testGASLIMIT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestGASLIMIT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testGASLIMIT", x) -} - -// TestGASLIMIT is a paid mutator transaction binding the contract method 0x7c191d20. -// -// Solidity: function testGASLIMIT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestGASLIMIT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGASLIMIT(&_LoadTester.TransactOpts, x) -} - -// TestGASLIMIT is a paid mutator transaction binding the contract method 0x7c191d20. -// -// Solidity: function testGASLIMIT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestGASLIMIT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGASLIMIT(&_LoadTester.TransactOpts, x) -} - -// TestGASPRICE is a paid mutator transaction binding the contract method 0x4d2c74b3. -// -// Solidity: function testGASPRICE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestGASPRICE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testGASPRICE", x) -} - -// TestGASPRICE is a paid mutator transaction binding the contract method 0x4d2c74b3. -// -// Solidity: function testGASPRICE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestGASPRICE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGASPRICE(&_LoadTester.TransactOpts, x) -} - -// TestGASPRICE is a paid mutator transaction binding the contract method 0x4d2c74b3. -// -// Solidity: function testGASPRICE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestGASPRICE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGASPRICE(&_LoadTester.TransactOpts, x) -} - -// TestGT is a paid mutator transaction binding the contract method 0x71d91d28. -// -// Solidity: function testGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestGT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testGT", x) -} - -// TestGT is a paid mutator transaction binding the contract method 0x71d91d28. -// -// Solidity: function testGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestGT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGT(&_LoadTester.TransactOpts, x) -} - -// TestGT is a paid mutator transaction binding the contract method 0x71d91d28. -// -// Solidity: function testGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestGT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestGT(&_LoadTester.TransactOpts, x) -} - -// TestISZERO is a paid mutator transaction binding the contract method 0xf279ca81. -// -// Solidity: function testISZERO(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestISZERO(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testISZERO", x) -} - -// TestISZERO is a paid mutator transaction binding the contract method 0xf279ca81. -// -// Solidity: function testISZERO(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestISZERO(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestISZERO(&_LoadTester.TransactOpts, x) -} - -// TestISZERO is a paid mutator transaction binding the contract method 0xf279ca81. -// -// Solidity: function testISZERO(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestISZERO(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestISZERO(&_LoadTester.TransactOpts, x) -} - -// TestIdentity is a paid mutator transaction binding the contract method 0x9cce7cf9. -// -// Solidity: function testIdentity(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestIdentity(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testIdentity", inputData) -} - -// TestIdentity is a paid mutator transaction binding the contract method 0x9cce7cf9. -// -// Solidity: function testIdentity(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestIdentity(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestIdentity(&_LoadTester.TransactOpts, inputData) -} - -// TestIdentity is a paid mutator transaction binding the contract method 0x9cce7cf9. -// -// Solidity: function testIdentity(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestIdentity(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestIdentity(&_LoadTester.TransactOpts, inputData) -} - -// TestLOG0 is a paid mutator transaction binding the contract method 0x40fe2662. -// -// Solidity: function testLOG0(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLOG0(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLOG0", x) -} - -// TestLOG0 is a paid mutator transaction binding the contract method 0x40fe2662. -// -// Solidity: function testLOG0(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLOG0(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG0(&_LoadTester.TransactOpts, x) -} - -// TestLOG0 is a paid mutator transaction binding the contract method 0x40fe2662. -// -// Solidity: function testLOG0(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLOG0(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG0(&_LoadTester.TransactOpts, x) -} - -// TestLOG1 is a paid mutator transaction binding the contract method 0x98456f3e. -// -// Solidity: function testLOG1(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLOG1(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLOG1", x) -} - -// TestLOG1 is a paid mutator transaction binding the contract method 0x98456f3e. -// -// Solidity: function testLOG1(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLOG1(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG1(&_LoadTester.TransactOpts, x) -} - -// TestLOG1 is a paid mutator transaction binding the contract method 0x98456f3e. -// -// Solidity: function testLOG1(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLOG1(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG1(&_LoadTester.TransactOpts, x) -} - -// TestLOG2 is a paid mutator transaction binding the contract method 0xdd9bef60. -// -// Solidity: function testLOG2(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLOG2(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLOG2", x) -} - -// TestLOG2 is a paid mutator transaction binding the contract method 0xdd9bef60. -// -// Solidity: function testLOG2(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLOG2(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG2(&_LoadTester.TransactOpts, x) -} - -// TestLOG2 is a paid mutator transaction binding the contract method 0xdd9bef60. -// -// Solidity: function testLOG2(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLOG2(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG2(&_LoadTester.TransactOpts, x) -} - -// TestLOG3 is a paid mutator transaction binding the contract method 0xbf529ca1. -// -// Solidity: function testLOG3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLOG3(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLOG3", x) -} - -// TestLOG3 is a paid mutator transaction binding the contract method 0xbf529ca1. -// -// Solidity: function testLOG3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLOG3(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG3(&_LoadTester.TransactOpts, x) -} - -// TestLOG3 is a paid mutator transaction binding the contract method 0xbf529ca1. -// -// Solidity: function testLOG3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLOG3(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG3(&_LoadTester.TransactOpts, x) -} - -// TestLOG4 is a paid mutator transaction binding the contract method 0x1aba07ea. -// -// Solidity: function testLOG4(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLOG4(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLOG4", x) -} - -// TestLOG4 is a paid mutator transaction binding the contract method 0x1aba07ea. -// -// Solidity: function testLOG4(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLOG4(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG4(&_LoadTester.TransactOpts, x) -} - -// TestLOG4 is a paid mutator transaction binding the contract method 0x1aba07ea. -// -// Solidity: function testLOG4(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLOG4(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLOG4(&_LoadTester.TransactOpts, x) -} - -// TestLT is a paid mutator transaction binding the contract method 0x6e7f1fe7. -// -// Solidity: function testLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestLT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testLT", x) -} - -// TestLT is a paid mutator transaction binding the contract method 0x6e7f1fe7. -// -// Solidity: function testLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestLT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLT(&_LoadTester.TransactOpts, x) -} - -// TestLT is a paid mutator transaction binding the contract method 0x6e7f1fe7. -// -// Solidity: function testLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestLT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestLT(&_LoadTester.TransactOpts, x) -} - -// TestMLOAD is a paid mutator transaction binding the contract method 0x5590c2d9. -// -// Solidity: function testMLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMLOAD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMLOAD", x) -} - -// TestMLOAD is a paid mutator transaction binding the contract method 0x5590c2d9. -// -// Solidity: function testMLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMLOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMLOAD(&_LoadTester.TransactOpts, x) -} - -// TestMLOAD is a paid mutator transaction binding the contract method 0x5590c2d9. -// -// Solidity: function testMLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMLOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMLOAD(&_LoadTester.TransactOpts, x) -} - -// TestMOD is a paid mutator transaction binding the contract method 0x16582150. -// -// Solidity: function testMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMOD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMOD", x) -} - -// TestMOD is a paid mutator transaction binding the contract method 0x16582150. -// -// Solidity: function testMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMOD(&_LoadTester.TransactOpts, x) -} - -// TestMOD is a paid mutator transaction binding the contract method 0x16582150. -// -// Solidity: function testMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMOD(&_LoadTester.TransactOpts, x) -} - -// TestMSIZE is a paid mutator transaction binding the contract method 0xb3d847f2. -// -// Solidity: function testMSIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMSIZE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMSIZE", x) -} - -// TestMSIZE is a paid mutator transaction binding the contract method 0xb3d847f2. -// -// Solidity: function testMSIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMSIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSIZE(&_LoadTester.TransactOpts, x) -} - -// TestMSIZE is a paid mutator transaction binding the contract method 0xb3d847f2. -// -// Solidity: function testMSIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMSIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSIZE(&_LoadTester.TransactOpts, x) -} - -// TestMSTORE is a paid mutator transaction binding the contract method 0x087b4e84. -// -// Solidity: function testMSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMSTORE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMSTORE", x) -} - -// TestMSTORE is a paid mutator transaction binding the contract method 0x087b4e84. -// -// Solidity: function testMSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMSTORE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSTORE(&_LoadTester.TransactOpts, x) -} - -// TestMSTORE is a paid mutator transaction binding the contract method 0x087b4e84. -// -// Solidity: function testMSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMSTORE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSTORE(&_LoadTester.TransactOpts, x) -} - -// TestMSTORE8 is a paid mutator transaction binding the contract method 0x4a61af1f. -// -// Solidity: function testMSTORE8(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMSTORE8(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMSTORE8", x) -} - -// TestMSTORE8 is a paid mutator transaction binding the contract method 0x4a61af1f. -// -// Solidity: function testMSTORE8(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMSTORE8(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSTORE8(&_LoadTester.TransactOpts, x) -} - -// TestMSTORE8 is a paid mutator transaction binding the contract method 0x4a61af1f. -// -// Solidity: function testMSTORE8(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMSTORE8(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMSTORE8(&_LoadTester.TransactOpts, x) -} - -// TestMUL is a paid mutator transaction binding the contract method 0x7de8c6f8. -// -// Solidity: function testMUL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMUL(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMUL", x) -} - -// TestMUL is a paid mutator transaction binding the contract method 0x7de8c6f8. -// -// Solidity: function testMUL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMUL(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMUL(&_LoadTester.TransactOpts, x) -} - -// TestMUL is a paid mutator transaction binding the contract method 0x7de8c6f8. -// -// Solidity: function testMUL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMUL(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMUL(&_LoadTester.TransactOpts, x) -} - -// TestMULMOD is a paid mutator transaction binding the contract method 0xfde7721c. -// -// Solidity: function testMULMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestMULMOD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testMULMOD", x) -} - -// TestMULMOD is a paid mutator transaction binding the contract method 0xfde7721c. -// -// Solidity: function testMULMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestMULMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMULMOD(&_LoadTester.TransactOpts, x) -} - -// TestMULMOD is a paid mutator transaction binding the contract method 0xfde7721c. -// -// Solidity: function testMULMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestMULMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestMULMOD(&_LoadTester.TransactOpts, x) -} - -// TestModExp is a paid mutator transaction binding the contract method 0x613d0a82. -// -// Solidity: function testModExp(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactor) TestModExp(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testModExp", inputData) -} - -// TestModExp is a paid mutator transaction binding the contract method 0x613d0a82. -// -// Solidity: function testModExp(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterSession) TestModExp(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestModExp(&_LoadTester.TransactOpts, inputData) -} - -// TestModExp is a paid mutator transaction binding the contract method 0x613d0a82. -// -// Solidity: function testModExp(bytes inputData) returns(bytes result) -func (_LoadTester *LoadTesterTransactorSession) TestModExp(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestModExp(&_LoadTester.TransactOpts, inputData) -} - -// TestNOT is a paid mutator transaction binding the contract method 0x91e7b277. -// -// Solidity: function testNOT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestNOT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testNOT", x) -} - -// TestNOT is a paid mutator transaction binding the contract method 0x91e7b277. -// -// Solidity: function testNOT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestNOT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestNOT(&_LoadTester.TransactOpts, x) -} - -// TestNOT is a paid mutator transaction binding the contract method 0x91e7b277. -// -// Solidity: function testNOT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestNOT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestNOT(&_LoadTester.TransactOpts, x) -} - -// TestNUMBER is a paid mutator transaction binding the contract method 0x2d34e798. -// -// Solidity: function testNUMBER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestNUMBER(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testNUMBER", x) -} - -// TestNUMBER is a paid mutator transaction binding the contract method 0x2d34e798. -// -// Solidity: function testNUMBER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestNUMBER(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestNUMBER(&_LoadTester.TransactOpts, x) -} - -// TestNUMBER is a paid mutator transaction binding the contract method 0x2d34e798. -// -// Solidity: function testNUMBER(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestNUMBER(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestNUMBER(&_LoadTester.TransactOpts, x) -} - -// TestOR is a paid mutator transaction binding the contract method 0x135d52f7. -// -// Solidity: function testOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestOR(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testOR", x) -} - -// TestOR is a paid mutator transaction binding the contract method 0x135d52f7. -// -// Solidity: function testOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestOR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestOR(&_LoadTester.TransactOpts, x) -} - -// TestOR is a paid mutator transaction binding the contract method 0x135d52f7. -// -// Solidity: function testOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestOR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestOR(&_LoadTester.TransactOpts, x) -} - -// TestORIGIN is a paid mutator transaction binding the contract method 0x050082f8. -// -// Solidity: function testORIGIN(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestORIGIN(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testORIGIN", x) -} - -// TestORIGIN is a paid mutator transaction binding the contract method 0x050082f8. -// -// Solidity: function testORIGIN(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestORIGIN(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestORIGIN(&_LoadTester.TransactOpts, x) -} - -// TestORIGIN is a paid mutator transaction binding the contract method 0x050082f8. -// -// Solidity: function testORIGIN(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestORIGIN(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestORIGIN(&_LoadTester.TransactOpts, x) -} - -// TestRETURNDATACOPY is a paid mutator transaction binding the contract method 0x7b6e0b0e. -// -// Solidity: function testRETURNDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestRETURNDATACOPY(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testRETURNDATACOPY", x) -} - -// TestRETURNDATACOPY is a paid mutator transaction binding the contract method 0x7b6e0b0e. -// -// Solidity: function testRETURNDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestRETURNDATACOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestRETURNDATACOPY(&_LoadTester.TransactOpts, x) -} - -// TestRETURNDATACOPY is a paid mutator transaction binding the contract method 0x7b6e0b0e. -// -// Solidity: function testRETURNDATACOPY(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestRETURNDATACOPY(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestRETURNDATACOPY(&_LoadTester.TransactOpts, x) -} - -// TestRETURNDATASIZE is a paid mutator transaction binding the contract method 0x2b21ef44. -// -// Solidity: function testRETURNDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestRETURNDATASIZE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testRETURNDATASIZE", x) -} - -// TestRETURNDATASIZE is a paid mutator transaction binding the contract method 0x2b21ef44. -// -// Solidity: function testRETURNDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestRETURNDATASIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestRETURNDATASIZE(&_LoadTester.TransactOpts, x) -} - -// TestRETURNDATASIZE is a paid mutator transaction binding the contract method 0x2b21ef44. -// -// Solidity: function testRETURNDATASIZE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestRETURNDATASIZE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestRETURNDATASIZE(&_LoadTester.TransactOpts, x) -} - -// TestRipemd160 is a paid mutator transaction binding the contract method 0xf6b0bbf7. -// -// Solidity: function testRipemd160(bytes inputData) returns(bytes20 result) -func (_LoadTester *LoadTesterTransactor) TestRipemd160(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testRipemd160", inputData) -} - -// TestRipemd160 is a paid mutator transaction binding the contract method 0xf6b0bbf7. -// -// Solidity: function testRipemd160(bytes inputData) returns(bytes20 result) -func (_LoadTester *LoadTesterSession) TestRipemd160(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestRipemd160(&_LoadTester.TransactOpts, inputData) -} - -// TestRipemd160 is a paid mutator transaction binding the contract method 0xf6b0bbf7. -// -// Solidity: function testRipemd160(bytes inputData) returns(bytes20 result) -func (_LoadTester *LoadTesterTransactorSession) TestRipemd160(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestRipemd160(&_LoadTester.TransactOpts, inputData) -} - -// TestSAR is a paid mutator transaction binding the contract method 0x60e13cde. -// -// Solidity: function testSAR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSAR(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSAR", x) -} - -// TestSAR is a paid mutator transaction binding the contract method 0x60e13cde. -// -// Solidity: function testSAR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSAR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSAR(&_LoadTester.TransactOpts, x) -} - -// TestSAR is a paid mutator transaction binding the contract method 0x60e13cde. -// -// Solidity: function testSAR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSAR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSAR(&_LoadTester.TransactOpts, x) -} - -// TestSDIV is a paid mutator transaction binding the contract method 0xa645c9c2. -// -// Solidity: function testSDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSDIV(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSDIV", x) -} - -// TestSDIV is a paid mutator transaction binding the contract method 0xa645c9c2. -// -// Solidity: function testSDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSDIV(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSDIV(&_LoadTester.TransactOpts, x) -} - -// TestSDIV is a paid mutator transaction binding the contract method 0xa645c9c2. -// -// Solidity: function testSDIV(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSDIV(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSDIV(&_LoadTester.TransactOpts, x) -} - -// TestSELFBALANCE is a paid mutator transaction binding the contract method 0xc420eb61. -// -// Solidity: function testSELFBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSELFBALANCE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSELFBALANCE", x) -} - -// TestSELFBALANCE is a paid mutator transaction binding the contract method 0xc420eb61. -// -// Solidity: function testSELFBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSELFBALANCE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSELFBALANCE(&_LoadTester.TransactOpts, x) -} - -// TestSELFBALANCE is a paid mutator transaction binding the contract method 0xc420eb61. -// -// Solidity: function testSELFBALANCE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSELFBALANCE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSELFBALANCE(&_LoadTester.TransactOpts, x) -} - -// TestSGT is a paid mutator transaction binding the contract method 0x18093b46. -// -// Solidity: function testSGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSGT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSGT", x) -} - -// TestSGT is a paid mutator transaction binding the contract method 0x18093b46. -// -// Solidity: function testSGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSGT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSGT(&_LoadTester.TransactOpts, x) -} - -// TestSGT is a paid mutator transaction binding the contract method 0x18093b46. -// -// Solidity: function testSGT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSGT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSGT(&_LoadTester.TransactOpts, x) -} - -// TestSHA256 is a paid mutator transaction binding the contract method 0x63138d4f. -// -// Solidity: function testSHA256(bytes inputData) returns(bytes32 result) -func (_LoadTester *LoadTesterTransactor) TestSHA256(opts *bind.TransactOpts, inputData []byte) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSHA256", inputData) -} - -// TestSHA256 is a paid mutator transaction binding the contract method 0x63138d4f. -// -// Solidity: function testSHA256(bytes inputData) returns(bytes32 result) -func (_LoadTester *LoadTesterSession) TestSHA256(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHA256(&_LoadTester.TransactOpts, inputData) -} - -// TestSHA256 is a paid mutator transaction binding the contract method 0x63138d4f. -// -// Solidity: function testSHA256(bytes inputData) returns(bytes32 result) -func (_LoadTester *LoadTesterTransactorSession) TestSHA256(inputData []byte) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHA256(&_LoadTester.TransactOpts, inputData) -} - -// TestSHA3 is a paid mutator transaction binding the contract method 0x19b621d6. -// -// Solidity: function testSHA3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSHA3(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSHA3", x) -} - -// TestSHA3 is a paid mutator transaction binding the contract method 0x19b621d6. -// -// Solidity: function testSHA3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSHA3(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHA3(&_LoadTester.TransactOpts, x) -} - -// TestSHA3 is a paid mutator transaction binding the contract method 0x19b621d6. -// -// Solidity: function testSHA3(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSHA3(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHA3(&_LoadTester.TransactOpts, x) -} - -// TestSHL is a paid mutator transaction binding the contract method 0x2007332e. -// -// Solidity: function testSHL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSHL(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSHL", x) -} - -// TestSHL is a paid mutator transaction binding the contract method 0x2007332e. -// -// Solidity: function testSHL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSHL(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHL(&_LoadTester.TransactOpts, x) -} - -// TestSHL is a paid mutator transaction binding the contract method 0x2007332e. -// -// Solidity: function testSHL(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSHL(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHL(&_LoadTester.TransactOpts, x) -} - -// TestSHR is a paid mutator transaction binding the contract method 0xc4bd65d5. -// -// Solidity: function testSHR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSHR(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSHR", x) -} - -// TestSHR is a paid mutator transaction binding the contract method 0xc4bd65d5. -// -// Solidity: function testSHR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSHR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHR(&_LoadTester.TransactOpts, x) -} - -// TestSHR is a paid mutator transaction binding the contract method 0xc4bd65d5. -// -// Solidity: function testSHR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSHR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSHR(&_LoadTester.TransactOpts, x) -} - -// TestSIGNEXTEND is a paid mutator transaction binding the contract method 0xc360aba6. -// -// Solidity: function testSIGNEXTEND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSIGNEXTEND(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSIGNEXTEND", x) -} - -// TestSIGNEXTEND is a paid mutator transaction binding the contract method 0xc360aba6. -// -// Solidity: function testSIGNEXTEND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSIGNEXTEND(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSIGNEXTEND(&_LoadTester.TransactOpts, x) -} - -// TestSIGNEXTEND is a paid mutator transaction binding the contract method 0xc360aba6. -// -// Solidity: function testSIGNEXTEND(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSIGNEXTEND(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSIGNEXTEND(&_LoadTester.TransactOpts, x) -} - -// TestSLOAD is a paid mutator transaction binding the contract method 0x880eff39. -// -// Solidity: function testSLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSLOAD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSLOAD", x) -} - -// TestSLOAD is a paid mutator transaction binding the contract method 0x880eff39. -// -// Solidity: function testSLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSLOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSLOAD(&_LoadTester.TransactOpts, x) -} - -// TestSLOAD is a paid mutator transaction binding the contract method 0x880eff39. -// -// Solidity: function testSLOAD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSLOAD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSLOAD(&_LoadTester.TransactOpts, x) -} - -// TestSLT is a paid mutator transaction binding the contract method 0xf4d1fc61. -// -// Solidity: function testSLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSLT(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSLT", x) -} - -// TestSLT is a paid mutator transaction binding the contract method 0xf4d1fc61. -// -// Solidity: function testSLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSLT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSLT(&_LoadTester.TransactOpts, x) -} - -// TestSLT is a paid mutator transaction binding the contract method 0xf4d1fc61. -// -// Solidity: function testSLT(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSLT(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSLT(&_LoadTester.TransactOpts, x) -} - -// TestSMOD is a paid mutator transaction binding the contract method 0xd93cd558. -// -// Solidity: function testSMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSMOD(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSMOD", x) -} - -// TestSMOD is a paid mutator transaction binding the contract method 0xd93cd558. -// -// Solidity: function testSMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSMOD(&_LoadTester.TransactOpts, x) -} - -// TestSMOD is a paid mutator transaction binding the contract method 0xd93cd558. -// -// Solidity: function testSMOD(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSMOD(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSMOD(&_LoadTester.TransactOpts, x) -} - -// TestSSTORE is a paid mutator transaction binding the contract method 0xd117320b. -// -// Solidity: function testSSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSSTORE(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSSTORE", x) -} - -// TestSSTORE is a paid mutator transaction binding the contract method 0xd117320b. -// -// Solidity: function testSSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSSTORE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSSTORE(&_LoadTester.TransactOpts, x) -} - -// TestSSTORE is a paid mutator transaction binding the contract method 0xd117320b. -// -// Solidity: function testSSTORE(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSSTORE(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSSTORE(&_LoadTester.TransactOpts, x) -} - -// TestSUB is a paid mutator transaction binding the contract method 0xd53ff3fd. -// -// Solidity: function testSUB(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestSUB(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testSUB", x) -} - -// TestSUB is a paid mutator transaction binding the contract method 0xd53ff3fd. -// -// Solidity: function testSUB(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestSUB(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSUB(&_LoadTester.TransactOpts, x) -} - -// TestSUB is a paid mutator transaction binding the contract method 0xd53ff3fd. -// -// Solidity: function testSUB(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestSUB(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestSUB(&_LoadTester.TransactOpts, x) -} - -// TestTIMESTAMP is a paid mutator transaction binding the contract method 0x219cddeb. -// -// Solidity: function testTIMESTAMP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestTIMESTAMP(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testTIMESTAMP", x) -} - -// TestTIMESTAMP is a paid mutator transaction binding the contract method 0x219cddeb. -// -// Solidity: function testTIMESTAMP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestTIMESTAMP(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestTIMESTAMP(&_LoadTester.TransactOpts, x) -} - -// TestTIMESTAMP is a paid mutator transaction binding the contract method 0x219cddeb. -// -// Solidity: function testTIMESTAMP(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestTIMESTAMP(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestTIMESTAMP(&_LoadTester.TransactOpts, x) -} - -// TestXOR is a paid mutator transaction binding the contract method 0xd51e7b5b. -// -// Solidity: function testXOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactor) TestXOR(opts *bind.TransactOpts, x *big.Int) (*types.Transaction, error) { - return _LoadTester.contract.Transact(opts, "testXOR", x) -} - -// TestXOR is a paid mutator transaction binding the contract method 0xd51e7b5b. -// -// Solidity: function testXOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterSession) TestXOR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestXOR(&_LoadTester.TransactOpts, x) -} - -// TestXOR is a paid mutator transaction binding the contract method 0xd51e7b5b. -// -// Solidity: function testXOR(uint256 x) returns(uint256) -func (_LoadTester *LoadTesterTransactorSession) TestXOR(x *big.Int) (*types.Transaction, error) { - return _LoadTester.Contract.TestXOR(&_LoadTester.TransactOpts, x) -} diff --git a/cmd/loadtest/uniswapv3/types.go b/contracts/types.go similarity index 60% rename from cmd/loadtest/uniswapv3/types.go rename to contracts/types.go index a6e6e62b..a95ff55d 100644 --- a/cmd/loadtest/uniswapv3/types.go +++ b/contracts/types.go @@ -1,4 +1,4 @@ -package uniswapv3loadtest +package contracts import ( "context" @@ -6,6 +6,6 @@ import ( "github.com/ethereum/go-ethereum/ethclient" ) -// blockUntilSuccessfulFn is designed to wait until a specified number of Ethereum blocks have been +// BlockUntilSuccessfulFn is designed to wait until a specified number of Ethereum blocks have been // mined, periodically checking for the completion of a given function within each block interval. -type blockUntilSuccessfulFn func(ctx context.Context, c *ethclient.Client, f func() error) error +type BlockUntilSuccessfulFn func(ctx context.Context, c *ethclient.Client, f func() error) error diff --git a/doc/polycli_rpcfuzz.md b/doc/polycli_rpcfuzz.md index da2c9bb3..3bba32f8 100644 --- a/doc/polycli_rpcfuzz.md +++ b/doc/polycli_rpcfuzz.md @@ -103,7 +103,7 @@ $ docker run -v $PWD/contracts:/contracts ethereum/solc:stable --storage-layout ## Flags ```bash - --contract-address string The address of a contract that can be used for testing (default "0x6fda56c57b0acadb96ed5624ac500c0429d59429") + --contract-address string The address of a contract that can be used for testing. If not specified, a contract will be deployed automatically. --csv Flag to indicate that output will be exported as a CSV. --export-path string The directory export path of the output of the tests. Must pair this with either --json, --csv, --md, or --html --fuzz Flag to indicate whether to fuzz input or not. diff --git a/rpctypes/schemas/README.org b/rpctypes/jsonschemas/README.org similarity index 80% rename from rpctypes/schemas/README.org rename to rpctypes/jsonschemas/README.org index b5e5dfb5..c4e3cb9b 100644 --- a/rpctypes/schemas/README.org +++ b/rpctypes/jsonschemas/README.org @@ -15,3 +15,10 @@ into unique schemas for simplicity. cat openrpc.json | jq '.methods[].name' | sort cat openrpc.json | jq '.methods[] | select(.name == "eth_syncing") | .result.schema' #+END_SRC + +Or you can run the following from project root folder: + +#+BEGIN_SRC bash +make gen-json-rpctypes +#+END_SRC + diff --git a/rpctypes/jsonschemas/debug_getBadBlocks.json b/rpctypes/jsonschemas/debug_getBadBlocks.json new file mode 100644 index 00000000..03b6a9e2 --- /dev/null +++ b/rpctypes/jsonschemas/debug_getBadBlocks.json @@ -0,0 +1,731 @@ +{ + "title": "Bad block array", + "type": "array", + "items": { + "title": "Bad block", + "type": "object", + "required": [ + "block", + "hash", + "rlp" + ], + "additionalProperties": false, + "properties": { + "block": { + "title": "Block", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + }, + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "rlp": { + "title": "RLP", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } +} diff --git a/rpctypes/jsonschemas/debug_getRawBlock.json b/rpctypes/jsonschemas/debug_getRawBlock.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/debug_getRawBlock.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/jsonschemas/debug_getRawHeader.json b/rpctypes/jsonschemas/debug_getRawHeader.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/debug_getRawHeader.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/schemas/rpcschemahexarray.json b/rpctypes/jsonschemas/debug_getRawReceipts.json similarity index 100% rename from rpctypes/schemas/rpcschemahexarray.json rename to rpctypes/jsonschemas/debug_getRawReceipts.json diff --git a/rpctypes/jsonschemas/debug_getRawTransaction.json b/rpctypes/jsonschemas/debug_getRawTransaction.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/debug_getRawTransaction.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/jsonschemas/engine_exchangeCapabilities.json b/rpctypes/jsonschemas/engine_exchangeCapabilities.json new file mode 100644 index 00000000..53b04f82 --- /dev/null +++ b/rpctypes/jsonschemas/engine_exchangeCapabilities.json @@ -0,0 +1,6 @@ +{ + "type": "array", + "items": { + "type": "string" + } +} diff --git a/rpctypes/jsonschemas/engine_exchangeTransitionConfigurationV1.json b/rpctypes/jsonschemas/engine_exchangeTransitionConfigurationV1.json new file mode 100644 index 00000000..809fac5c --- /dev/null +++ b/rpctypes/jsonschemas/engine_exchangeTransitionConfigurationV1.json @@ -0,0 +1,26 @@ +{ + "title": "Transition configuration object", + "type": "object", + "required": [ + "terminalTotalDifficulty", + "terminalBlockHash", + "terminalBlockNumber" + ], + "properties": { + "terminalTotalDifficulty": { + "title": "Terminal total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "terminalBlockHash": { + "title": "Terminal block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "terminalBlockNumber": { + "title": "Terminal block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } +} diff --git a/rpctypes/jsonschemas/engine_forkchoiceUpdatedV1.json b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV1.json new file mode 100644 index 00000000..f45103b7 --- /dev/null +++ b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV1.json @@ -0,0 +1,42 @@ +{ + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } +} diff --git a/rpctypes/jsonschemas/engine_forkchoiceUpdatedV2.json b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV2.json new file mode 100644 index 00000000..f45103b7 --- /dev/null +++ b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV2.json @@ -0,0 +1,42 @@ +{ + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } +} diff --git a/rpctypes/jsonschemas/engine_forkchoiceUpdatedV3.json b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV3.json new file mode 100644 index 00000000..f45103b7 --- /dev/null +++ b/rpctypes/jsonschemas/engine_forkchoiceUpdatedV3.json @@ -0,0 +1,42 @@ +{ + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } +} diff --git a/rpctypes/jsonschemas/engine_getPayloadBodiesByHashV1.json b/rpctypes/jsonschemas/engine_getPayloadBodiesByHashV1.json new file mode 100644 index 00000000..7738d7d9 --- /dev/null +++ b/rpctypes/jsonschemas/engine_getPayloadBodiesByHashV1.json @@ -0,0 +1,60 @@ +{ + "type": "array", + "items": { + "title": "Execution payload body object V1", + "type": "object", + "required": [ + "transactions" + ], + "properties": { + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": [ + "array", + "null" + ], + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } +} diff --git a/rpctypes/jsonschemas/engine_getPayloadBodiesByRangeV1.json b/rpctypes/jsonschemas/engine_getPayloadBodiesByRangeV1.json new file mode 100644 index 00000000..7738d7d9 --- /dev/null +++ b/rpctypes/jsonschemas/engine_getPayloadBodiesByRangeV1.json @@ -0,0 +1,60 @@ +{ + "type": "array", + "items": { + "title": "Execution payload body object V1", + "type": "object", + "required": [ + "transactions" + ], + "properties": { + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": [ + "array", + "null" + ], + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } +} diff --git a/rpctypes/jsonschemas/engine_getPayloadV1.json b/rpctypes/jsonschemas/engine_getPayloadV1.json new file mode 100644 index 00000000..11c5b1f2 --- /dev/null +++ b/rpctypes/jsonschemas/engine_getPayloadV1.json @@ -0,0 +1,96 @@ +{ + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } +} diff --git a/rpctypes/jsonschemas/engine_getPayloadV2.json b/rpctypes/jsonschemas/engine_getPayloadV2.json new file mode 100644 index 00000000..b52a5186 --- /dev/null +++ b/rpctypes/jsonschemas/engine_getPayloadV2.json @@ -0,0 +1,248 @@ +{ + "type": "object", + "required": [ + "executionPayload", + "blockValue" + ], + "properties": { + "executionPayload": { + "title": "Execution payload", + "oneOf": [ + { + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + }, + { + "title": "Execution payload object V2", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + ] + }, + "blockValue": { + "title": "Expected fee value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } +} diff --git a/rpctypes/jsonschemas/engine_getPayloadV3.json b/rpctypes/jsonschemas/engine_getPayloadV3.json new file mode 100644 index 00000000..9d3a8e89 --- /dev/null +++ b/rpctypes/jsonschemas/engine_getPayloadV3.json @@ -0,0 +1,203 @@ +{ + "type": "object", + "required": [ + "executionPayload", + "blockValue", + "blobsBundle", + "shouldOverrideBuilder" + ], + "properties": { + "executionPayload": { + "title": "Execution payload", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals", + "blobGasUsed", + "excessBlobGas" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + }, + "blockValue": { + "title": "Expected fee value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blobsBundle": { + "title": "Blobs bundle", + "type": "object", + "required": [ + "commitments", + "proofs", + "blobs" + ], + "properties": { + "commitments": { + "title": "Commitments", + "type": "array", + "items": { + "title": "48 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{96}$" + } + }, + "proofs": { + "title": "Proofs", + "type": "array", + "items": { + "title": "48 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{96}$" + } + }, + "blobs": { + "title": "Blobs", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + }, + "shouldOverrideBuilder": { + "title": "Should override builder flag", + "type": "boolean" + } + } +} diff --git a/rpctypes/jsonschemas/engine_newPayloadV1.json b/rpctypes/jsonschemas/engine_newPayloadV1.json new file mode 100644 index 00000000..a088aa2a --- /dev/null +++ b/rpctypes/jsonschemas/engine_newPayloadV1.json @@ -0,0 +1,29 @@ +{ + "title": "Payload status object V1", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED", + "INVALID_BLOCK_HASH" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } +} diff --git a/rpctypes/jsonschemas/engine_newPayloadV2.json b/rpctypes/jsonschemas/engine_newPayloadV2.json new file mode 100644 index 00000000..31a8a13f --- /dev/null +++ b/rpctypes/jsonschemas/engine_newPayloadV2.json @@ -0,0 +1,28 @@ +{ + "title": "Payload status object deprecating INVALID_BLOCK_HASH status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } +} diff --git a/rpctypes/jsonschemas/engine_newPayloadV3.json b/rpctypes/jsonschemas/engine_newPayloadV3.json new file mode 100644 index 00000000..31a8a13f --- /dev/null +++ b/rpctypes/jsonschemas/engine_newPayloadV3.json @@ -0,0 +1,28 @@ +{ + "title": "Payload status object deprecating INVALID_BLOCK_HASH status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } +} diff --git a/rpctypes/schemas/rpcschemaaccountlist.json b/rpctypes/jsonschemas/eth_accounts.json similarity index 100% rename from rpctypes/schemas/rpcschemaaccountlist.json rename to rpctypes/jsonschemas/eth_accounts.json diff --git a/rpctypes/jsonschemas/eth_blockNumber.json b/rpctypes/jsonschemas/eth_blockNumber.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_blockNumber.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_call.json b/rpctypes/jsonschemas/eth_call.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/eth_call.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/jsonschemas/eth_chainId.json b/rpctypes/jsonschemas/eth_chainId.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_chainId.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_coinbase.json b/rpctypes/jsonschemas/eth_coinbase.json new file mode 100644 index 00000000..b551ac82 --- /dev/null +++ b/rpctypes/jsonschemas/eth_coinbase.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" +} diff --git a/rpctypes/schemas/rpcschemaethaccesslist.json b/rpctypes/jsonschemas/eth_createAccessList.json similarity index 92% rename from rpctypes/schemas/rpcschemaethaccesslist.json rename to rpctypes/jsonschemas/eth_createAccessList.json index 7532d398..eed03d51 100644 --- a/rpctypes/schemas/rpcschemaethaccesslist.json +++ b/rpctypes/jsonschemas/eth_createAccessList.json @@ -1,6 +1,7 @@ { "title": "Access list result", "type": "object", + "additionalProperties": false, "properties": { "accessList": { "title": "accessList", @@ -8,6 +9,7 @@ "items": { "title": "Access list entry", "type": "object", + "additionalProperties": false, "properties": { "address": { "title": "hex encoded address", diff --git a/rpctypes/jsonschemas/eth_estimateGas.json b/rpctypes/jsonschemas/eth_estimateGas.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_estimateGas.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/schemas/rpcschemaethfeehistory.json b/rpctypes/jsonschemas/eth_feeHistory.json similarity index 81% rename from rpctypes/schemas/rpcschemaethfeehistory.json rename to rpctypes/jsonschemas/eth_feeHistory.json index d77f6437..db3061f0 100644 --- a/rpctypes/schemas/rpcschemaethfeehistory.json +++ b/rpctypes/jsonschemas/eth_feeHistory.json @@ -7,6 +7,7 @@ "baseFeePerGas", "gasUsedRatio" ], + "additionalProperties": false, "properties": { "oldestBlock": { "title": "oldestBlock", @@ -24,6 +25,17 @@ "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" } }, + "gasUsedRatio": { + "title": "gasUsedRatio", + "description": "An array of block gas used ratios. These are calculated as the ratio of gasUsed and gasLimit.", + "type": "array", + "items": { + "title": "normalized ratio", + "type": "number", + "minimum": 0, + "maximum": 1 + } + }, "reward": { "title": "rewardArray", "description": "A two-dimensional array of effective priority fees per gas at the requested block percentiles.", diff --git a/rpctypes/jsonschemas/eth_gasPrice.json b/rpctypes/jsonschemas/eth_gasPrice.json new file mode 100644 index 00000000..289c0810 --- /dev/null +++ b/rpctypes/jsonschemas/eth_gasPrice.json @@ -0,0 +1,5 @@ +{ + "title": "Gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_getBalance.json b/rpctypes/jsonschemas/eth_getBalance.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBalance.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_getBlockByHash.json b/rpctypes/jsonschemas/eth_getBlockByHash.json new file mode 100644 index 00000000..7298d4c3 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBlockByHash.json @@ -0,0 +1,713 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Block object", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getBlockByNumber.json b/rpctypes/jsonschemas/eth_getBlockByNumber.json new file mode 100644 index 00000000..7298d4c3 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBlockByNumber.json @@ -0,0 +1,713 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Block object", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getBlockReceipts.json b/rpctypes/jsonschemas/eth_getBlockReceipts.json new file mode 100644 index 00000000..8090542e --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBlockReceipts.json @@ -0,0 +1,200 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Receipts information", + "type": "array", + "items": { + "type": "object", + "title": "Receipt information", + "required": [ + "blockHash", + "blockNumber", + "from", + "cumulativeGasUsed", + "gasUsed", + "logs", + "logsBloom", + "transactionHash", + "transactionIndex", + "effectiveGasPrice" + ], + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "to": { + "title": "to", + "description": "Address of the receiver or null in a contract creation transaction.", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Recipient Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "cumulativeGasUsed": { + "title": "cumulative gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The sum of gas used by this transaction and all preceding transactions in the same block." + }, + "gasUsed": { + "title": "gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of gas used for this specific transaction alone." + }, + "blobGasUsed": { + "title": "blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of blob gas used for this specific transaction. Only specified for blob transactions as defined by EIP-4844." + }, + "contractAddress": { + "title": "contract address", + "description": "The contract address created, if the transaction was a contract creation, otherwise null.", + "oneOf": [ + { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "name": null, + "type": "null" + } + ] + }, + "logs": { + "title": "logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "logsBloom": { + "title": "logs bloom", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "root": { + "title": "state root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$", + "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." + }, + "status": { + "title": "status", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." + }, + "effectiveGasPrice": { + "title": "effective gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." + }, + "blobGasPrice": { + "title": "blob gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account for blob gas. Only specified for blob transactions as defined by EIP-4844." + } + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getBlockTransactionCountByHash.json b/rpctypes/jsonschemas/eth_getBlockTransactionCountByHash.json new file mode 100644 index 00000000..b894ff02 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBlockTransactionCountByHash.json @@ -0,0 +1,13 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Transaction count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getBlockTransactionCountByNumber.json b/rpctypes/jsonschemas/eth_getBlockTransactionCountByNumber.json new file mode 100644 index 00000000..b894ff02 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getBlockTransactionCountByNumber.json @@ -0,0 +1,13 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Transaction count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getCode.json b/rpctypes/jsonschemas/eth_getCode.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/eth_getCode.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/schemas/rpcschemafilterchanges.json b/rpctypes/jsonschemas/eth_getFilterChanges.json similarity index 98% rename from rpctypes/schemas/rpcschemafilterchanges.json rename to rpctypes/jsonschemas/eth_getFilterChanges.json index a19d0bad..d99dfae6 100644 --- a/rpctypes/schemas/rpcschemafilterchanges.json +++ b/rpctypes/jsonschemas/eth_getFilterChanges.json @@ -28,6 +28,7 @@ "required": [ "transactionHash" ], + "additionalProperties": false, "properties": { "removed": { "title": "removed", diff --git a/rpctypes/jsonschemas/eth_getFilterLogs.json b/rpctypes/jsonschemas/eth_getFilterLogs.json new file mode 100644 index 00000000..d99dfae6 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getFilterLogs.json @@ -0,0 +1,85 @@ +{ + "title": "Filter results", + "oneOf": [ + { + "title": "new block hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getLogs.json b/rpctypes/jsonschemas/eth_getLogs.json new file mode 100644 index 00000000..d99dfae6 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getLogs.json @@ -0,0 +1,85 @@ +{ + "title": "Filter results", + "oneOf": [ + { + "title": "new block hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + } + ] +} diff --git a/rpctypes/schemas/rpcschemaethproof.json b/rpctypes/jsonschemas/eth_getProof.json similarity index 96% rename from rpctypes/schemas/rpcschemaethproof.json rename to rpctypes/jsonschemas/eth_getProof.json index 61021867..4828969c 100644 --- a/rpctypes/schemas/rpcschemaethproof.json +++ b/rpctypes/jsonschemas/eth_getProof.json @@ -10,6 +10,7 @@ "storageHash", "storageProof" ], + "additionalProperties": false, "properties": { "address": { "title": "address", @@ -56,6 +57,7 @@ "value", "proof" ], + "additionalProperties": false, "properties": { "key": { "title": "key", diff --git a/rpctypes/jsonschemas/eth_getStorageAt.json b/rpctypes/jsonschemas/eth_getStorageAt.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/eth_getStorageAt.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/jsonschemas/eth_getTransactionByBlockHashAndIndex.json b/rpctypes/jsonschemas/eth_getTransactionByBlockHashAndIndex.json new file mode 100644 index 00000000..5d1b9916 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getTransactionByBlockHashAndIndex.json @@ -0,0 +1,508 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getTransactionByBlockNumberAndIndex.json b/rpctypes/jsonschemas/eth_getTransactionByBlockNumberAndIndex.json new file mode 100644 index 00000000..5d1b9916 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getTransactionByBlockNumberAndIndex.json @@ -0,0 +1,508 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getTransactionByHash.json b/rpctypes/jsonschemas/eth_getTransactionByHash.json new file mode 100644 index 00000000..5d1b9916 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getTransactionByHash.json @@ -0,0 +1,508 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getTransactionCount.json b/rpctypes/jsonschemas/eth_getTransactionCount.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_getTransactionCount.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_getTransactionReceipt.json b/rpctypes/jsonschemas/eth_getTransactionReceipt.json new file mode 100644 index 00000000..f92ffee5 --- /dev/null +++ b/rpctypes/jsonschemas/eth_getTransactionReceipt.json @@ -0,0 +1,196 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Receipt information", + "required": [ + "blockHash", + "blockNumber", + "from", + "cumulativeGasUsed", + "gasUsed", + "logs", + "logsBloom", + "transactionHash", + "transactionIndex", + "effectiveGasPrice" + ], + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "to": { + "title": "to", + "description": "Address of the receiver or null in a contract creation transaction.", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Recipient Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "cumulativeGasUsed": { + "title": "cumulative gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The sum of gas used by this transaction and all preceding transactions in the same block." + }, + "gasUsed": { + "title": "gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of gas used for this specific transaction alone." + }, + "blobGasUsed": { + "title": "blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of blob gas used for this specific transaction. Only specified for blob transactions as defined by EIP-4844." + }, + "contractAddress": { + "title": "contract address", + "description": "The contract address created, if the transaction was a contract creation, otherwise null.", + "oneOf": [ + { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "name": null, + "type": "null" + } + ] + }, + "logs": { + "title": "logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "logsBloom": { + "title": "logs bloom", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "root": { + "title": "state root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$", + "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." + }, + "status": { + "title": "status", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." + }, + "effectiveGasPrice": { + "title": "effective gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." + }, + "blobGasPrice": { + "title": "blob gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account for blob gas. Only specified for blob transactions as defined by EIP-4844." + } + } + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getUncleCountByBlockHash.json b/rpctypes/jsonschemas/eth_getUncleCountByBlockHash.json new file mode 100644 index 00000000..4558d3de --- /dev/null +++ b/rpctypes/jsonschemas/eth_getUncleCountByBlockHash.json @@ -0,0 +1,13 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Uncle count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] +} diff --git a/rpctypes/jsonschemas/eth_getUncleCountByBlockNumber.json b/rpctypes/jsonschemas/eth_getUncleCountByBlockNumber.json new file mode 100644 index 00000000..4558d3de --- /dev/null +++ b/rpctypes/jsonschemas/eth_getUncleCountByBlockNumber.json @@ -0,0 +1,13 @@ +{ + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Uncle count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] +} diff --git a/rpctypes/jsonschemas/eth_maxPriorityFeePerGas.json b/rpctypes/jsonschemas/eth_maxPriorityFeePerGas.json new file mode 100644 index 00000000..7313b519 --- /dev/null +++ b/rpctypes/jsonschemas/eth_maxPriorityFeePerGas.json @@ -0,0 +1,5 @@ +{ + "title": "Max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_newBlockFilter.json b/rpctypes/jsonschemas/eth_newBlockFilter.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_newBlockFilter.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_newFilter.json b/rpctypes/jsonschemas/eth_newFilter.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_newFilter.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_newPendingTransactionFilter.json b/rpctypes/jsonschemas/eth_newPendingTransactionFilter.json new file mode 100644 index 00000000..ce5d2e3a --- /dev/null +++ b/rpctypes/jsonschemas/eth_newPendingTransactionFilter.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" +} diff --git a/rpctypes/jsonschemas/eth_sendRawTransaction.json b/rpctypes/jsonschemas/eth_sendRawTransaction.json new file mode 100644 index 00000000..ba347e08 --- /dev/null +++ b/rpctypes/jsonschemas/eth_sendRawTransaction.json @@ -0,0 +1,5 @@ +{ + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" +} diff --git a/rpctypes/jsonschemas/eth_sendTransaction.json b/rpctypes/jsonschemas/eth_sendTransaction.json new file mode 100644 index 00000000..ba347e08 --- /dev/null +++ b/rpctypes/jsonschemas/eth_sendTransaction.json @@ -0,0 +1,5 @@ +{ + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" +} diff --git a/rpctypes/jsonschemas/eth_sign.json b/rpctypes/jsonschemas/eth_sign.json new file mode 100644 index 00000000..a8ba4b7a --- /dev/null +++ b/rpctypes/jsonschemas/eth_sign.json @@ -0,0 +1,5 @@ +{ + "title": "65 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{130}$" +} diff --git a/rpctypes/jsonschemas/eth_signTransaction.json b/rpctypes/jsonschemas/eth_signTransaction.json new file mode 100644 index 00000000..fa7bb84a --- /dev/null +++ b/rpctypes/jsonschemas/eth_signTransaction.json @@ -0,0 +1,5 @@ +{ + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" +} diff --git a/rpctypes/schemas/rpcschemaethsyncing.json b/rpctypes/jsonschemas/eth_syncing.json similarity index 95% rename from rpctypes/schemas/rpcschemaethsyncing.json rename to rpctypes/jsonschemas/eth_syncing.json index c6a3a17b..cafaaaa9 100644 --- a/rpctypes/schemas/rpcschemaethsyncing.json +++ b/rpctypes/jsonschemas/eth_syncing.json @@ -4,6 +4,7 @@ { "title": "Syncing progress", "type": "object", + "additionalProperties": false, "properties": { "startingBlock": { "title": "Starting block", diff --git a/rpctypes/jsonschemas/eth_uninstallFilter.json b/rpctypes/jsonschemas/eth_uninstallFilter.json new file mode 100644 index 00000000..dd97725d --- /dev/null +++ b/rpctypes/jsonschemas/eth_uninstallFilter.json @@ -0,0 +1,3 @@ +{ + "type": "boolean" +} diff --git a/rpctypes/jsonschemas/openrpc.json b/rpctypes/jsonschemas/openrpc.json new file mode 100644 index 00000000..8dbdb117 --- /dev/null +++ b/rpctypes/jsonschemas/openrpc.json @@ -0,0 +1,9443 @@ +{ + "openrpc": "1.2.4", + "info": { + "title": "Ethereum JSON-RPC Specification", + "description": "A specification of the standard interface for Ethereum clients.", + "license": { + "name": "CC0-1.0", + "url": "https://creativecommons.org/publicdomain/zero/1.0/legalcode" + }, + "version": "0.0.0" + }, + "methods": [ + { + "name": "debug_getBadBlocks", + "summary": "Returns an array of recent bad blocks that the client has seen on the network.", + "params": [], + "result": { + "name": "Blocks", + "schema": { + "title": "Bad block array", + "type": "array", + "items": { + "title": "Bad block", + "type": "object", + "required": [ + "block", + "hash", + "rlp" + ], + "additionalProperties": false, + "properties": { + "block": { + "title": "Block", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + }, + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "rlp": { + "title": "RLP", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + } + }, + "examples": [ + { + "name": "debug_getBadBlocks example", + "params": [], + "result": { + "name": "Bad block array", + "value": [ + { + "block": { + "number": "0xd", + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x02c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41", + "stateRoot": "0x861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5", + "receiptsRoot": "0xccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x1", + "totalDifficulty": "0x1", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a488", + "timestamp": "0x5f5b6824", + "uncles": [], + "transactions": [ + { + "blockHash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "blockNumber": "0xd", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a49e", + "gasPrice": "0x3e8", + "hash": "0xdd8cf045113754c306ba9ac8ac8786235e33bc5c087678084ef260a2a583f127", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0xa7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7", + "s": "0x130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fca" + } + ] + }, + "hash": "0x85c2edc1ca74b4863cab46ff6ed4df514a698aa7c29a9bce58742a33af07d7e6", + "rlp": "0xf9039df9025ca0544a2f7a4c8defc0d8da44aa0c0db7c36b56db2605c01ed266e919e936579d31a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0861ab7e868e3c23f84b7c4ed86b52a6a4f063633bc45ef29212c33459df84ea5a002c387e001cbe2a8296bfa2e18afbc3480d0e49588b05556148b0bf7c17dec41a0ccd2d33763dc0ac3fe02d4ecbbcd7d2bdc6f57db635ba31007184679303721d7b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d86ffffffffffff8301a488845f5b6824b86100000000000000000000000000000000000000000000000000000000000000008c6a091f07e4ba3930f2f5fabbfc5b1c70986319096760ba200a6abc0d30e33c2d501702d1b58d7f75807bdbf981044557628611319121170b96466ec06bb3fd01a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a49e8080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da0a7a15050302ca4b7d3842d35cdd3cbf25b2c48c0c37f96d78beb6a6a6bc4f1c7a0130d29294b2b6a2b7e89f501eb27772f7abf37bfa28a1ce300daade975589fcac0" + }, + { + "block": { + "number": "0x8", + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x98ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x8ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486", + "stateRoot": "0x140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3bac", + "receiptsRoot": "0x2b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x2", + "totalDifficulty": "0x2", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701", + "size": "0x3a0", + "gasLimit": "0xffffffffffff", + "gasUsed": "0x1a4c9", + "timestamp": "0x5f5b6b80", + "uncles": [], + "transactions": [ + { + "blockHash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "blockNumber": "0x8", + "from": "0xfe3b557e8fb62b89f4916b721be55ceb828dbd73", + "gas": "0x1a4c9", + "gasPrice": "0x3e8", + "hash": "0x675e336a4281b29c619dfd4ccfbd2f930f3728b20caf9e0067284aa3224e6758", + "input": "0x608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033", + "nonce": "0x0", + "to": null, + "transactionIndex": "0x0", + "value": "0x0", + "v": "0xf9d", + "r": "0x2e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4", + "s": "0x50e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0" + } + ] + }, + "hash": "0x601a3ae9b6eceb2476d249e1cffe058ba3ff2c9c1b28b1ec7a0259fdd1d90121", + "rlp": "0xf9039df9025ca098ae440cd7b904d842daa6c263608969a3c8ce6a9acd6bd1f99b394f5f28a207a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0140a9783291704223eb759e3a0db5471a520d349fc17ac2f77ff8582472e3baca08ee998cc699a1f9310a1079458780b3ebee8756f96a0905f5224b89d0eb17486a02b5c77f6e7764d2468178fab7253346b9b8bb6a34b63946f6bdc2f5ad398bfc3b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020886ffffffffffff8301a4c9845f5b6b80b86100000000000000000000000000000000000000000000000000000000000000004d04551bdd9ae08af1fd661e49d4ab662c98c532c7ec0e4656a27e4de7d330af578ab1e4f5e49e085ff1d78673c7388ed9ccf017fbe89e53066bfa4018142c0701a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f9013af90137808203e88301a4c98080b8e6608060405234801561001057600080fd5b5060c78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063b05784b8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050607e565b005b60686088565b6040518082815260200191505060405180910390f35b8060008190555050565b6000805490509056fea26469706673582212208dea039245bf78c381278382d7056eef5083f7d243d8958817ef447e0a403bd064736f6c63430006060033820f9da002e30624c0305e64812e1d9e325ba6e50410314634b008edcb50f45be71fa0d4a050e205faed23c219ba15610de2451d458cbd4221207b2168344cfc972a7973c0c0" + } + ] + } + } + ] + }, + { + "name": "debug_getRawBlock", + "summary": "Returns an RLP-encoded block.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Block RLP", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "examples": [ + { + "name": "debug_getRawBlock example", + "params": [ + { + "name": "Block", + "value": "0x32026E" + } + ], + "result": { + "name": "Block RLP", + "value": "0xf96096f90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9bf95c56f8ac82d51f8502540be4008303c9e294a68d4c1e3de1b721ad1356bbf827d6bc8cef304f80b844b1bb4d351300dbc7e12342566318001b83aefc9f20080000f3ef25472407fe9c9c69a1470000000242692bb4cd506c409651ab80eb3acfa54551d3dbc9af4493605d79871ba01e474fb147b16b9538d7a59a57738e406158d9cc306a9062b1b7a9f544c35abfa061aabb714c760f2243a16a024811679d402c8822e8b25dfd0038d84298fb5205b87502f87283aa36a754849502f900849502f9108302222794102554afa6b5dbccc86176faef2b2d854201756e8084e2bc7b43c001a04f2398f24bc950db1f5439de3cf6431ea277236595ae8dc5815c0cc671c9f97ca029898786a59c56f086fc0f7a16859f366cf46084add999fe137cbf43693712e8b87c02f87983aa36a7830293748459682f00850165a0bc008255f094fafb56bb5b37c3b0b0ee9d7c31f018aac91dfb778806f05b59d3b2000080c080a0b069dd8967533a773e592c26b1b36df0793d0b9f6eceba34da246f602c2fae58a002009dab32ab63a25b705d9a00e311f7cd5d85e73f9b2c03ffd0e5135c0bb2c6b89502f89283aa36a7018459682f008459682f0983011fec945b9fedd37f0b92e7e282b19cebcf06f57b77c60480a46a62784200000000000000000000000019a1fcc6fcc5832cd2db7704d75efbc800f5a742c001a0c65eb0e48090a8f8830de47f430b9ad11071a62a5db9555619a990d7e9b81738a05a6e826610a5b2ee529a22942ebcd3abd2a8a10228098c8158380e8fcceb962fb9028002f9027c83aa36a7178459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e17852000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f168270000000000000000000000003aa4d7eb55ec2539f5305eb27ea42f6f90f16827000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c080a004f8666c8e5d0f3c7110994f624d24aa47a1327814289698c3e2777284a5cfdca04ff05f1b8c5beb58972d40e5a7b894d5e28ad2f15a3429c7d2bee6b6a9633730b9019f02f9019b83aa36a70b8459682f008459682f098303644f944284890d4acd0bcb017ece481b96fd4cb457cac88715c0f4db6e0ea0b90124ee1490b20000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d40000000000000000000000001e8c104d068f22d351859cdbfe41a697a98e6ea20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000222e00000000000000000000000000000000000000000000000000015c0f4db6e0ea00000000000000000000000007847f2e0262512206333ffb200f6d9df2da319d400000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000c080a0e5270f6291acc162885656bedf64fbcb904c41951221dc0cbbbdca03bb33ce43a01f08c7ed3c231403b55f37a157d80e121b653baa810add8c02aea722631450dcb87c02f87983aa36a7830293758459682f00850165a0bc008255f0948d247f4fbbe81429d3d164a5c9ae0063210edbdc8806f05b59d3b2000080c080a0bb83dd6181c9a7ae3069af3bdf1820b5e556eaf99e385b8d7b3571321fb2966ba02ac193773704524adcd02824796df83407a42cdd81e786b591eba43c4ffc6c40b9028002f9027c83aa36a7048459682f008459682f0983017ac9942ab7c0ab9ab47fcf370d13058bfee28f2ec0940c880169964394fc8860b9020496e178520000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac6790000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c00000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac67900000000000000000000000062d23ed77d0e5d0205edabe4ce3a27adc49ac679000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000650cb3772886000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c001a0fc882968005f717a74a2c2fb345f691091cab084f4bd3934358741807bd5a66ea03f81c68d05d06bf851a6ef5ea6874557a221cbadde24f3fa51f777699b5d2804b8d802f8d583aa36a7822c0b8459682f008459682f098303534f943367dfa11e3148a07c2da773e1f65b155b0abe5680b864ad58bdd100000000000000000000000053844f9577c2334e541aec7df7174ece5df1fcf0000000000000000000000000e9e12c660e77a732940bab3c2cf385c843b834b800000000000000000000000000000000000000000006015d637c177581800000c001a0a292e7723d3c950aa8a557bd91dece34ec527d9efe2cc413d582dcd9fc6bf6eba03386ce6f58e862f329946bf32897f7df5d1c8f818fecfafc1223052fb251d97eb8b602f8b383aa36a7138459682f008459682f09832dc6c094ba175fdab00e7fcf603f43be8f68db7f4de9f3a980b844095ea7b300000000000000000000000084a0cc1ab353da6b7817947f7b116b8ea982c3d20000000000000000000000000000000000000000000000068f365aea1e440000c001a0968ed0274829918071d9cef28e1adbf1fd15ec76e5a4f809971e887b4c9f34b6a001ce26485bc7e3ea71fb99866bd43002b264b2ed80e10850203c2f07b78856bdb87c02f87983aa36a7830293768459682f00850165a0bc008255f0946d3b93db4e4078cf6541a68532d00705d9a4da618806f05b59d3b2000080c080a083c831630788e7ee57c87128d18582e29aa51f1f233e91d916c06d0750578156a0549b5a00477f3fb4d8fbf95ba3a636c3a14ff011c1bbf3a717e00d61735cbf34b87c02f87983aa36a7830293778459682f00850165a0bc008255f0940d3a7d69859a0dd6971d39703b15379e05ae2ec48806f05b59d3b2000080c001a0082660b5db2d3a8a58c0b863673ab27f7cfe4c049dcc52c76a00ab45b0358db5a05a7519a2d399cb534480383ac21262fbde2dd85241495d7832dee8bb02c49c87b87c02f87983aa36a7830293788459682f00850165a0bc008255f0941be13f64a2463fc7a76b4092c53328cc965a77fb8806f05b59d3b2000080c001a0e6ee9b85c3b729518524fdaeb25d47f89f6fc6c4d2c4df707187bef74d73f958a0756bbf4ab119805b77466957b5895c1d5bf422c5f65d8a06f7efd37dcb2c87afb87c02f87983aa36a7830293798459682f00850165a0bc008255f094a90b28fd6f8e46ac668fcb688414184a163e2cd28806f05b59d3b2000080c080a0d394dd43c58591e5dda8a7f3a2f4eae1bfd65655b9e9eec5facc6dcb39aa77baa002eeabf3fe9c0a56eae476d2f6452ea72e63a9c9b1180290b792883258f939f5b8f802f8f583aa36a7830283818459682f008459682f1082962494d0f723c6b2226df56fe41e63b9eaa66eb540bcb880b884abac047b000000000000000000000000000000000000000000000000000000000103e9f0f3471dc445d8f209ef546e0d20eaccc12ed0a5b4100007f57d9bc8638dacaf6480000000000000000000000000000000000000000000000000000000001d209b1ea11d77d1ab457eb3e2954cb2b98e77b5b07e2a4f48507af0adc61329ddc210c001a0efa10ab60f3bd1e7c4a8d52a275a568fbe2f5edc9e1eaf386299577ff9ddbd6ba06e62cf2f66b58f655ddd3eae47ce40408445b086f6ea858edb7bd847ee206207f86f82e6e582014482f618949ebf6b12e7e33b8672788e7b2b3330356f6f2c41880de0b6b3a7640000808401546d72a008d6be7aa21be0a43e08e960620f4c40c44010a743ead9919ef9423863c08b12a06a63a7caae4504ee5528e50387ca09974f7124035328a62d1085da2fee6618f9f86f82e1c382014482f618949c68eb31c4d00b94c3e3d4c2887946f8b076b24c880de0b6b3a7640000808401546d72a0c22d48d72c70ccf0a44d0950daf16741838f9333ee0bc5e05ff02b058da1e010a06a20c9f74cbc14c0d5bf3b3c38d3c33a5ace9194cddc2c533afb16459eaa7647f86f82e4cb82014482f61894d531e7aa3c0bee832aaff22642c7a3128d48a81a880de0b6b3a7640000808401546d72a01dbaeffc8e11964c06a722bae73e35bb5de55b8f959592868f2ff5fc13b69bd3a002acadc04665570a2032cdb616de15bdca79127f21302d62db5baf96ae4734e6f86e830176e381d882520894ad346e81c5b26fe563ab1ba2aa4ff811655882ca872386f26fc10000808401546d72a0b6de11598824e338100d5ebe70c0b0f4d6893fbb36f11ad55cf74b2f43afc5dda05101e65e7e84ea9edba6e5bf1a1e07028ae3fa5213240e812e57cf6b29080726b9235302f9234f83aa36a7830137d564748315f52194ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc00000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5000000000000000000000000000077770000000000000000000000000000000191c15235c348207e935e72b9151056a9661d73631d1e2c3f89ffddf8e74efe8a42ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000030ef2c000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000ec15abee257256da1a964434000f59ddd45b1ce67d5df44f1c82fd5bfe95c3b31dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000000000777700000000000000000000000000000001d4b5b35d93f51c8143f6a4cc3d7b320d37ce03989cd88c28601f4ea94cd6554249cff83e4dd8e99a8ef9004b2ac7518996f4784af1f9e52debb6223a697e9652530feda219f333e01f8cd0b31ee83b9c250ee51fde9718ef5fa305cbcd01901200200100002020000400000280000006004000c0020000000000000000000100000000029000000000000000090000000000008000200040000012004020000800000000240002400008000800000020000000001040000000000040824000000000000002040000400000002000080000000000000804000000001001000c84000208000000000180020000014000000000210100510008000082c0000000001200002000000024000008400000000220001800400000008010000052000200000200028000000000800000040200000110000010000010000001020000210004100002000000000900280000010008001000000018004000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc0000000000000000000000000000000000000000000000000000000000034bfbc00000000000000000000000000000000000000000000000000000000002ddb24000000000000000000000000000000000000000000000000000000006436f8d800000000000000000000000000000000000000000000000000000000000002e042ab8767076a555a049372055c846097c99e69c26ab0a24553d21c15de29ea900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b2a7122720155935f15da0807d0054f1a4c3db2a92ec4124bf590ce7a16594f3f1812f260acb049d01ad534a937840a80c0f56fd9a54ca5a8628ed896d14a5f8b2570f5813e35c990656f6300a1a1849429135ada6337646248f6ea03a7f70ac426c1d805216d154ea5a8e5ff953bc04b71b049b4b5bd549b6b0cfa7f8b21dba72a3805c7093d8589f2d4c55b6211441041e8bd7916daed5093fcebd377c31e810a6499e6e26840e3afadc9b339c6abc86b7f89fc3559f4242d373a71389db20219195f6e13069701f6d539dcf63a049726cdd8cadc412d1c43cf3fc0095ae5e2157dc668bdb924d7d7afc2b4632ab8a0e4ef71941a0a6a65645f6cd8570302f90b98bbdd01be238dc07780ee9b93e22ab87f26170d7fc5531347fb9fadcb65dc2ca20442a70be9e785292d533fa9496308a7b1588b50b45c17ea765de525259f036edd3984782399b46793acd5abb9f49e38b309c2363aead57264ac1a44e6432b81127a0bfdc29f01bd04e7db2b2545ed8426d2fe9b3e561793ec8fc875f2a71f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f11fcba848e01c60438611958101321898e95c8fdc936d31389bdba8073b382e5b1e2cd25993ad31586d7525f165fb25a1cf8c22623f983c025d21f0e52ecfec5f0232a753addaad88340ca39f00e9722f35dd25fbe8fdd8846bfc0288215d0638004009396bfcd5e6eb0c587797ae8297decbca48b02407219b910ce163552ed230438292cec430007886beabe7cdf5c6f9c3740a3dd6c52ba88e6d652ce43f90044193c4a42335291795c2cc160dc68b6225edb425a88d27cae159f77df3a2241fbe809c8f1122d245bf439df0761bec97358b96d6653bc83702b559bde5a2d12f771a2a11bc9dc32580bc3ccf9dfacd0a5379587ac5160b45d333a85cde46810ad2875b406f00438aee245ecc63815528a185e9e2a029147db7fcffcb8875e5259f15c3e467de02e035891b131bc715e54e7e27a7acc437bb9f6f84fa4456aa016b3578a73ed8a4706efb935be8b6abe0697e46d878d9c74e274f2816d2fd88146b316731719e125d227e002af95aa13f468a9bae4ff41a4a6036ee7fc321b3249aed4dfb6e75089ec0656ee4e87e1fffefbd74edf55a20d752a85caccf583c0d9e2ef1040b4d36a8e992ad50ce1c4bd2b300b344ca881725c164886a5f8f18035f6e75e67a3eaa2064fc24ff79897edb624e1a67f34deb414d5efaf4c55d482da108aa2ab7504fd5d7f78d91da5c20230380ec013b910b01a26b8bed8a05a004d52db30b7fb01f16347692e9f19f303f48ea8cbbed2d3a3eb277ddf4e9ed8026af5ce92a618c8942caf28b3249044347e14e5c3c2ed5ec0f9cccf1d11a5b290c00773e12c25feafbcceeb8ae6c25a88c9657c627187af6fe0bfea0b3cc36c908a76f90e965bc4135c8596534f444c91aaaaaa6277985e36248bd53ef0f74f103eeac98ba92c5350e4a0c586c851ad25df982e16b2d408de37c687efc6915a41197df379614aa657ab5100627c47896b51b000cb95505bac77e4e440ecd1fe50252fc98f15ee41cafbf717e144da35f424e141639de04ebe5d333e9df8c06821c689d1ef2abbfd12e8a1edc059a9279db7ff44bac1962b5f7297da5c989528229e98a91a3a2e351f371dfa34d4c3676725baa5fa4696f67f4239b5fe1e3fa351d66aa5a2df992426d94ba049bbb4eea0ab22e3b9a7409f2b6719ede64353f4112e4da3919adc16dcd99c545966256493d2699ae529e365c20515d95c013ba2627576fb75a030ffd25b85ed3fc40dbbedbca54427f8dc2255c16b742b3e2b82e1bb634ae73a402927e6dc424d1908942b9b0f2cc17909ed050defe85d24a1986291facbb4ecf9b7ff66c27f8e771d28ec6866e3d24bc97e7be388013df8ba8f407b9147ed9b3581784003a22eeada55656d2be271afce06ef3fca32ac9b77b4f2420d60e892c95418b2a1b7d3dae2738a073ef105e66c08488e8a91e8ebdb5a10e979611bd29245c13cc4c0f5b33eedc5263edd6c27666e0c3f02161114120230511406f9f82102fd8c37c36d4e383e445df4afc6e7dbaa570cfe05b3f6038ec1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5006f155ac97d6757728caceba5530eb745e72277723ad34268b34008a97a27c370e9bc006aeaca4ac36414f35aa41ff400f698623a447c949f7f004f3c3fdb09f2af3c96042e215f0d4bbb23fda72d4f01dd9a55dbdec930919715a23e2cd772a260e2b91324c244d88ce1b83c92dce1aa0e0c255b80ed9325dec0e677563984a1c559ddb4a544eadeb2a38e8ed7736174a30d2bee6e0b65f3766e0b7a4e4d8022dd9f82493a9b1fadd1907147ac29edeb8cf8c7c58fbfa9b82ed3d9f9f05bfc900e52e29a05ca8d445b5245b16928dd61800ebb63933d9c471c2fb38776459641e9debdc606abf6ccfdf8fb41da88ba0745d96fd4557a879fee82e33df32d18b18d7360529f89f3dea680a5cb0c6a7652ee38589e1997f3e64ce4db1d3c04cd628fc0fd6e7ef1944108d48eb742a28467fa4bca693dbc8f923945256da2a83222d172286c82b1949803c54409de4653f258d0cf4266c83d5675ca9b5b3a3fb322b9c493ed7bff0a6165babb19c94d9e2014b13b099f09894fbcf32959b9d4ce71ddf9d24dee8bc40d6be92ee6e1220d84d68ecf1a0424132315c0612802b477b0acabcf346b0ad5ea329ea72f4de7524530bc00ad36baeee835908655faecd350463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea0908c560e84b404afb45f69169d28348ca20bb4f5693db19304d154f60a91ec4e9255be05739f5dc7e0b420d4bde4b188a8520bf39202f81dd3e2f4adcc6f4b4be16880103e0ab232f509729c91ddf0006d6a099a769b38affb89d7489b3bf261106aec362c77acdbb0a71c3da369067eb0f2ee9866a0bbdc4ee41ae81a88d860f1784565b7b1cdd350e8e12241103ff9d57c86c368775530773bafc058cbcea6309bd6d9c144cf6657cac5084ac5fe63ef038a71b3d79e6b7a32cc70039e182052f5cd5e415128e9ab1f553f13c165ea122d089975c1daf617766e12d9f3abb2501571eefde182b767e4b63568d37a8c553671adcee2ee4c7c6d77493e4599cd70d002a718fe0d7c31b7df3893f8b9993c90d7d55eea1c38292f1eae3a7887cfd182977403d5c029a42809f2c6fb8d04aff1c60106ba36367ecca0699866e5ec922ebaeffc4e624d0cc2c748f9c446da0c293d8ba7a28125145ce0936a2dd47172c4502ccf050145fc0584ad8608ee8f6c34c3e718fa5ca616722c5b3549ddb5e2f6a96e82c3d706bf255afda0272c199da51f9a4a869ce8b164694f6ef7593ce08b4bb0afda822eed4a0a7863f532fc0a22de9de5d3456574021b711c42eb1c9190de35ea592568f8ba5528c0f5fadc38e10b14a89a1e49fba9a76ca2478dcca20f8a3c78bb3e1b9869b7375d0deb87819ce7209ad4d73d84a92d08d23649bb50ecb4a1763050b7860afb055461b3158647b453d7977bddde0fac9415327e7eb2ea373fc8abd6793f576e72a47c92d6f6e19fadfdf2c6912365b74929d9b483c19f5146ac5a8dd943caf50b2e0a95fb19066a63a71862a540b2e41731ea66697094e51d309589ce9d25a37c06c9a12839c4c08a050a3ff9e502514f20d573c610466ac5399e11b0153954428f25d16958ab48614d34f768991f84411c401e6900fb0dfaab4108db0ad42fc9ae0a255e60fa4d92747ddda47d07de9f847e7a2be289798c5d34924aae419abdc41d30fb095c6ccabe5c5d5be73ec6197371ea74e08f0583b21901bd748db5348282cabaf57d883f5c55311f1304d7fcd30a9f0b22f810b1a7f089860e4ca0f23ddce9a23d7167762734b10b995d5bd2cf3b31f8f24b18d0a2f7ce1101d3a32d18988f162e91ac94b0f521f24fa287b0d2b97c408079336b89af9e842cf31886c701018ba98d5b0eb0e6d41b67b499f4c466cb1412db0e5937f7ffa83426c9234c713096444d0fc65d1b45f166e54d2a54bc103de110669fbc34555a6d16714ca37651e976b06a7ee96d80af9ff50162016a998451e2ce5819f3346b1fcdf6fe9ff3ec8420d4860a9980ce28fd8c55660983a3fb02cbedb5c638a49e5cdf0b69b71d78e071f1200608e235e6ed0ee8fea5567be12018bcd026412db0538c28bcd4a9afe799d5c677298646943c4200a039d2fced71d985d188f84dfd3132b6a015c50b8a60d712a97c89e0cd7d3a1740244c1522b117dad1220463f5d4af1004c1a2ad6b5708d7d6b28f8ae1e1e7dd1b2d3798b8c2e27a3559c7202aa268099eb3bbdf7c42d0d20b47e5623dba8e6aa1392ff532113c32bd836f4160abb287aefe648aaff6bb0a23928f580347046b64babf354790704538c6ce83f117ac7e83e1e0f54054466cc82b2144cf135be31f24f1b224e2a956827c303b0d82964e284b968c5ebe97688e49ca793a4aba81a3d36eefd8c12e3ce9409be63c3a308636a7b296b804d8125b4f29068ef44d3f2a3c9eb13e61d6365bb96d6973e88a70757b1d9213511d357d252df58d1e848d534d9517165263e803855e8caf387579f1ff0e7e9c3c8e532a2025d8016b70a45c24a546f0b21acf38d16b27eae6466e22396097090291184a7719beb4a55beb89275c6893e01f2075d3b73e165c39335d34a5aa7b280386e30a6df9ba917e1dc6774e2edaa0c87e8f5fcf89306a6fdbcf8cf52cf25f5df473fe350325d510421546765acd00b34ef53e56b01445deea042282e7d6ce20c8f967204c26bda9f2596fa378dc611091ab6db9e1e8d4e9b5c1cc4c4d6ee2ad82b32d08f8cb5a9dd9b03f7aa754f2738ddf2dc0c3318974ff3810765917c251c74ce3d7132c26b5f2ede12a6f62f2e8ddecd5e0d02f99f2ed8ac15641c586d68e093fbe80cefd6a7dbdac6d43e261160807eb82fc2aea870a22b25148d256a083325a5b97bcf0187f748b6c0a1691867344efdd53809fb9edea57669c33780a4aa9e65149937817d3d845d9fccae1876575d5383d06adeacd0f3371209a30e1a9c98446174b0b98560652d0643f120bdabd5484435871b42ad0ce36aa8330c7edd26e64e89eb84e0c72a2c6e49fb24088ae2bdaf7ef07af9bfe381dd6a9ed430a553de1bad4dcefd5239b389090925a69e44e25800d9fccda11ff4e1e4d3049386397f1145c3595ab5115255bc1c1eabb379a37504eda27b1a103b88ae8f174e1d182e3dfbb0b8317d05d6e08c191661b04537421fd84057a9ff5a6eceb68c5bf1f0e356df6e93d936bb6bdccb42127cba43e7615d522242df13f08e5fa162a641430c1431a7d7181dec65202fb618a690c2bf3361d7dc689d5e4a97a550a9b17c8a5ada8f32db3f774e9ed047c02eb7d1ba7add29fa07ab90f290e77bd91ee9b5208b1fb19a37f29dd1a492fa32156a7d43146a336fe6144d19228f975c54ab304565269124e069e864873c0eef23f2e7b012e84ad0c71d76e1b23b8b9a0a66edcd59f4b203a9773ce26baee206254b49efb10cc48bad814b2e299bd478fd4bd8b1ae2c8bd99070b259a9e204e42fc5f65f9e25cb4e4a1a3b67872314fcaeede2abbbc6978660c3e685f6dccb53160d1f7517bbda54177495c23fcf45cdd66363a70a84f2699e239b5071c9e6cb19069f3e0be9f4390c8028ae9960851e34ea18ff88d36ee826c0a4db4e33e94f0ec6651a728a1a2b0c15b30a1783ad4b1d224d87264779a817d107d40c75b77c25addd7b7d6a8b73b2d551f125daed95786920c4130d2061178604f9604a0e2f1c6cdbf3066fd28bf276ee0aee379bc049bc8eba361f4052bd2a698da312c991015c0fbc43ea1d2e72426279fc5181851a15a2f4883018ab01ff8745625f388f05f5fa9abc5d87a710a1227322626115b60f781f4ddd91e205c1cca582a5e37e005396703375846be4f36fdb76c277dc1a2ff1f183cbafc6db485a562f4d08262a207844a3d12261fa0ac479abca76f417df42b037e611b1b6acfda94d5dacc620c3edf5744db24bcc41ef1722dc0e620f8a35c50585a7cecfc97f05bfec21f919420e62a9c4f28ea9585cc056aee08ed8891d077a9647d9c0b5c3141f8c517f13b05bf0a18b99111d2d6e7b4892e78fab35d882e4e153060f0c44cb946d20ad0897a34d2a24d3800b54acd68fdd797aa362560dcede6d12909948bd6f4726a20142eec9c6b78d224b2c24885490bfb492217c6809e0628164579d2c2c16a90f28aa5393ad44c45d4e1500fccdcc684023d7cac4e2cca889333f048cd9a29de018e958d00553c77c74ab50d974df5f654233fb923e809ef6ceabe6a860386603003cc376e90b8bee74f2477343a5ae923aea4ffe99a91b9d9289ddcc3ca316b026b3d369aca474b7941588fc6e9cb062528b10f13b90dd55afd64f7b0ab79163163ce02aed379af25740ac5e37c5628c0b868b7ccfed0ae521c964846f0287d3006952539b2dffaf891bd01fe98a1685e71536d7f33ae85775d11545eb379e0916be616206968605e5033267f6f79cc651c2ce71a790ae5cef19fea7604e479c0793f82db1f8e85bec40d8c6a2dbc9bf76d02a616aced611ae1a7a3756d87dab2855ca585d0048e1e4222ed9d6fa24e3e13677256fbb9959b965727c192696a11474a7f6a6b6c8efb649b1f601c76576f36996ec7a20eee84208232c20e8502903d4e303e4ad7139c654b7e5d2aa262d75672cbb4f653e62ed8e4d28835f7d6d0efb3f39c40558d9cbf19f250681a5c8a59143fec80d6a69d8a265835d6562ef248fa4ac508bd60c9283f6e731baa786828d0f7a635e1d14a448383c8b0243570df4a42799afe03143c227e3fcf0b1393bdf8bacbd26f1041d5e3112c84755942fac77981fe16f048cd882243a8787b09bdc38847a5a9cc9aaf4d30544181ff014dca8b2892c00a933333df6d8ef79041483f2d8c6416897ae7897ca1da85e8f0a493be4520595cd0dd7d32c87999e703704ba0ac7d8b444dba807746123100e2cf7573843a0a755eebad6045d2970a0ef8c9adddff093e79731d5e506f1c43318fb25144ff5fb63041574e89216ebe0ac75d7dcffc35d095691723493c94dcc11d4480bf3fe7b76ba53cae5b409c002f2d1bb5eab08ac993054ec297543798700fe3e2877a4a0cce53599a66eb4f1fef5cafc774277f0e694ebd7f8748fb5140735282e5e0b9bb35b8aeb098775a33820c9b8decad3ad6ce36f79c347dcc2c60a5442d2eab4368827acae1f0ccd52f0475fab95ac57c3c9d7c2649d355756140d5a1e8c6eab8b67a5c169cb899230c4be1dc702323f2b07ee1fcf5657361e250ccbe93bb403abd857eee4335e454e8485a3b055c908c957dca3f9a288299729216103089910386fb994285602ce12b04be1819a2c80394b2410767d9aabdb591e4c4dcd08d1d5bc1bcb532496ff1fc968ac3ff59bc7266d8ecbb67f34b681331685a99b781c9752dfe83d145bd4f3c8ec634f028e850e246aa81f1d03aef40d000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a0bf32b9037b600aae3ecd3dd1838bc9f18ae1661f615cf3d70bc270b6c31f55fb80808080808080a0a2381991afea644ece5cba0d8d69f838f7b123d2e0057a54509e0c61e8b293028080808080808080b8b2f8b030b8adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a0529f2d89256fc038782a4d70b40bf127de906cbe211e7acaa3e928e0fd5cf11d80808080808080a0b4f4d0be01c65da5308bab41d52d8a7c93a1693c170c44d1f619b8364d40e3428080808080808080b90190f9018d30b90189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edbf808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320266d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa5830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05f3b41e975b46e86d5365943cfe25ae960fc2c7c1bb4eb0025eac5eb0bc6639c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000800000000000000000000000000000000000200000000000000000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320266a0d6b1b655f66cf8f99d35432492f8fbedfa97a2a48f0efaae65de6738e2594aa50000000000000000000000000000000000000000000000c080a0ae5e67673b90f2d6802e8dba26aadb2e8b81e059d1611afd1908e743e3c0b75da004886b0ac3a810519aa2395bffdd94fbcfe4a2de989ec95d1aea0fcd09afd931b9235302f9234f83aa36a7830137d664748315f42594ac9251ee97ed8bef31706354310c6b020c35d87b80b922e48ed7b3be000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000009d69394bd71906a235f9113cc04321f573958d3e00000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc10000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000007777000000000000000000000000000000010012f20d5ba20a09e185d452c999c129d712b83c75480e2e029fc895986d361a781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000004f9456000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000bbe20eedcc0216c615d3a0550a5507bdb2f9912eba7b608300486e871a4e42491dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000007777000000000000000000000000000000014852ab81d236f35c396d4836a6f82239f5672a4b6136ab9ebdd8669a9f9e831b87a26944e5c04f16b79426135ac11b155922c14178bf3d1ecbb1fb12ccc8119a22df5003de2d5956c745f9e825a8f0ca1bb1e265d4d431781b00765e0fe37280000000000004a00000000000800000020400004002001000000000000000010000000002800000000000100009000000000000a000000050000010004020000000000000000412000008002900000000000000000000000000000000820000000000000002000000400000000000080000000000000800000000001000040c0400000000000000010000000001400000000081000001800800008280000000001200002000000000000008440000000000001000000000004000000000000200200040028000000000000000000200000000000000000010000000020200290004100000000000000902080400010000001000000008000000000020000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001edc100000000000000000000000000000000000000000000000000000000005364e600000000000000000000000000000000000000000000000000000000004456ed000000000000000000000000000000000000000000000000000000006436f8e400000000000000000000000000000000000000000000000000000000000002e0781b2045b8b5226f9c1fd712d8b1a5f1faca84f5fcee87a7d1dd2b57f55617df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b21ad05b7c1eb0d208d17426c52831c6347a8db75b12bfeb2970c4dc6666e4eba0492d2ec318089b11ee7ec6087ab6a3df335770526cc0c1679b764d847b4ec1e303d400c12e690aa26a3771e5676e7ac95e2dc7a1b33be698f077c598f880d4203defa26ad36b84573e923af347475c7c7671be245e9859ca1db3c047faeee4b1c0e81d8a92915c2b94ff300e18f77f70ffec15631161e0bc3cdc9143c43422c208187652c1ec83c5d282e10587216eaf56689e5fe236f72c13eb9574afabc622a739cefbbe11aaa4e2e3d4c5415818914fe554a07be374f565d9bcebc0134940e8921b87bd4f6b42a6432e6e176be5ec82bb8eb6bdb7e4acc1f1e99725bd3ab2e3fa52e02c2741dfe6eddf5a3846dfd57f6a72e834faa048cb007826a293d9e163d47f9ea635871b25afcc3561dfce77b3a2604b3c8de90aa24916f41aed62d2e0c0d18f9c259bf614f1321c5b7cf7b5bd73cec408dd85f046bf36302e20f3603b7832071796022e893386de4e3b170135a591b1a44117240ba85876dba586b1f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f12f7e30e74b0329222f6067cad3b4324a80f570506985d729f7780955333f40e615f065023fb607d975d7a2b9f234137e72260d8f6b586baecf42819f8328dfb3304441f2c9e97d1fab9a3625073ac3d2bff6ba2f8d659cbc6f66e8d9afde1ef229ff39bac1ecd65eddc4953e2726a72daefa76f00d58e11c9a9ba3448fbe0d3a03db78d70ed9c574ddc45de5c73efdf3113ee70a4b42cea9884f85c1b995516912800abeb70f3022d5de6d9f49469161a36a6a309099ca43e388908635ed4ae825a14b7cf5213454a1f345497008ed417e5d33ef84c4934368b36f27606072192a1b43396f89647f0541dd25f55b42c5295d3ab2a22355664608b8dfec3c9d76045b27d8c2bdba7f376a44826bbf4044aed0d57068489fd32a2bf52f8613aa150185aafe655d2b86bf8867a6f7728c4133fb95776545b19767a0d7144f60f5ef038eac390d1cac6f9882211d7302137efc82b93b8f9c55db629f47a2c61931c21d01d5ad967c9dc6c1abfd496a74df2ac4714cfb027bc4d8c0153543ca663ded2af64f7396ed3b2ebd1976386814e94b7f7fcc3a19a4dd876288b905c381bc8f008de145083d6404890a863e1af1dd897aeef2516b20df50befb6c708c9728a22cb31d80b0e953aa71230d2462bb0668dd8701e11bc5240d85184f9298e2c5a3257b5dcc3e138df8b7d4162d6253fb5c21a65e952600c8764c613c6f43d22c861d4380cd688c286e9ffad6bb8582421fcab96b075769cf48b3160f056dfac4041b08287533a769bed0f08fdee9a16c5c8f414eb35830793c7b64341fef79dbc529a7b99f85d4e2e88b64954be967c5ee6386f9131b80b454ce70209f78f2101d0ca71da273735bcbcdc5ea5d3d54b607820b9bc852abb1b733cb7bb5018276d30c4c0a7f9ffcd318499a2041043494b82456ca8ac6f07678a8b770329b7c00f31e70e97ce48bc796570be27577e8986ee4c7fa51da44bdecfddfcf18686cbddc02ca206d9132d451ab55cce8069f631412ad2ae02b1a8245d31c0a65854d07370259f632fe253b2412c5a785148248d660d7cb6bef5240749d6ac4a4ac59384b27e7019c6cae15ef7c82e5a952f4da079b6205f9e16f3d3c84e94b490530c5b602d4bf5e9d34f2a785cdb7f7755d6d467a9d88071bbdf8c79195730db7d0b7872cbdcdabab02bd4b8487b726c5ce6492344ae7e900a21893e7b840b46380ba99278ce95322dc23daa97995d1149d425952913428c8ef8659dd2cc2895f12b08e0532a254fd5674fcac1b0992472ef75337d8d77f6fef3720d4b7b17302478c7d2e3b8dec7af4c681aba5e25d8aa3f4382b0082066c3f7a0b4e42c4637df90d9a1e2f3fd1cffa7e0d5577f5da89353521ed02cb1c39eb5746cef10ceb74c3fdba13199b42516ebfe29af40da64ad81b46b7bf04bf25994255c7a51f6839848810025bb52fe7500cf1ef628a07747894e3b73d53e6b2997d0654f1ffd0c070455400fd7e9d670984ac807a0f8131977ed1806fd3c0927c34b7b4dabf011d31e86b1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5020d266b1ccea774955484405f58ad161251d879a87c43d5dbaecd976ac5d04dd2586d70031a86b0dcade14028f36a04508494c7a20e98b3b21f7765e7b3ef68f10960709e63eea35a26ff47424e18df8cc271ff3049262c855d6a131695a395f2ba2f1b039012ac8a2abdf6d9f6b0c432f0ae78b9bccb99f89759434477257ce1f44cc61e95b9c9843ec8efb17c640fc4c837ec125fb25323d3f0644615d21721607fee4d68e2dc9bd29f5b13fafe39b0710d0365dccda35e3c937aed1b6949b2a0a7523011eb706357b85e174376ea7cadbd01ed0dd1bc6a8e5a5a11bc6131f0661dd6365b13c6e2de50b98cba1cde58a921d19936c711424eb625b7c35cba01a0f7dfa8d6f86a2a02425ab48e2c28f8f2f61adbb744c221b9c4f35b16c749c227bcee1202e87537c7441f421c855ce87d858a679f09dcf814bfa1f26f7d9ce18f723d2f84d4b25ec60adbb6367e92270836d03c71ed43413767342a4fb8d6801b8755bf65e7947ed4459ad6486fc1cca1f1cc89df3d307f01d8ac68aa1d08d18aa35a46bf245589c599eddc6337e764c36426f7b7f5d2afde0a76fd3aa536d1a165f9f23cfc65866f574f2289aa5be056dd32c72a204ba8328dd9b0b4643790463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea09160db3fa7477a2fff436ecee95aa2d51ff42ca9d4fcf021b6e501410fd41098a1a8f6021636ece98c27bd74740b7280d3a5e13d9850fcf7f2118c4c91572ba5826fcc4b0837d0b394f6683cba38fa35a5e2bd242041533bd25939cc873d1f5852a2f57cb172eb17c2e3c351240a0b2b334978b90ac18041b09aead26649b1c1c019e41731e77c6b2211d7da94630507bad027561dc625b7e84094378e599a57b09eb32c2a67cf5f2f0bf9250e6da07b165f97dca10517e9f3fe3561d02ec83a722b544bd6e25ef27d9825d13651443c4d984d7e5d0fd70c2a7f983b3ae8c698d27a2a0bf2d35655f477adc99c56f48773922831746f8af58de941a020986ad7c23fb7d31c2f17f305174db26b40447e64c66216dce98e7a8316dd91dee468e602206a4d1d18fa7827f733037fa87dfc9c74c9df0960867087c776382b94db9420a19e5338e17e8a68cb7621f0b56984610bedd3d9b77dc5447cdb129ecc33596079cf206e93904368cae07f0d449e2095f8abd95f26603d2db047647babc8342200be0095aa5489fd18cd00a52f59b70ff04c4b1e572db76d08bad419abbabb00b9e485e3f017807c12b427b5e0e648cf7b16065e313c1c073ce354a5fc6812c02b8d4b6aa1168c575dad9875087fe9f61702309febfb99b895387cc1104c35e123b713019b5e51c320fc2521cdb5cfca20f617773fd46d3872128b87df6f66a21fb3fa16711245ab65eef629c5e6073efaff5b707657f4442f2eb2637fa71000f14fc691a71aacf902c0c1a1a5d7d8d351b8b3cad57acd0a9e47a1abdcaf2b70aed8b7370a6bb2bb4f3d679c4f9793e4b256deefaef1e6dbcdbb648b917e34822d833d2ac1614aebcf360d328d9271f27c52c93de4a9455ce6cd8d2140ebf6b21c9b172cf47556efc5dff9afb913e328a708292bfb65c96d668f4d0b3a9a21b222039156cba9980d6bf11efbd8dd893378e5dc1b323c57d8f702076c22d125d1489bab2553c5521631c35f7b5236007ce8f37012cace78d6eb39718904b5dc31ddcb6f4f175e52bcf6c6008f6f5a572925600194b9af7ae074dbf85119e3afd141b2ff2652a58f043e97f11b77997a9da1c96c18b5254a107f24e997a3ea61c2069b9d04d49bd1bcd2495b19bc71848f28bfb4f0346b682a1b474e040b056e60a32b5e8aa532103101cb45ca41c6a690c8688523b8566d507f29eb44fe2d2490e81f4343ca61c8783b83e40e3ce66532f186e9d09bd2667cf974a763072a910121aa5e86e151d92a868508b680f795bc30b4502769f41e3afef5f321be9ce2f1cff3eb3308d65aa0ed780cc889f605f35eb5e02ba772d08db2579f8561c61fa09a8e23ea1416fb95ca0c7e139ddd16f04b0c872499e44cb5a03868d6c5fa1300c19a96b8586b8f33bd760c6350713696b7d3236acb0eb35bde2e6378e9ef9b117b02290ead7824d42452e332f6ec95a7f871da9ebdf6ad02c959a1a36ba33ff0089a4f5217b7bfa5379a507b1e994fb7b8fef489f1f2cf6fdedf0e530635ef31faaa1a37457c445836376dc5cdefc7770fbbad8c326955655efe4ecde89bd2f1dc62a2551a45206fd7d42605aa1c0fc80476b741bd7df1f0f2db0fc387614240e78427bb3a8cbbaf9bb112da06ea6942335f88c65d42d17816136509ec39b51079b5eb2a8cd15c3d1fbc56dd72c3499c101e2fc9126e8f194c6c8006faef30917c5e535439c6b0d78be52a4d17a3a25d0878649b668db027eecbbafcfac7a612138c77d1511f9cc5e763eaddbad6d9d8770705ef7b4d062b4c6dc72f30d1d272dca8700ae03a4c6d2cc6a0a03f9bfb2615b2b294515ca80827ec9cbaa7746112530f5e70f236a641c05bbc8647dd130f02db3561f9dfaa1d687235bccb0498202af478a6070dfa49df99785a61eb5fe5f18777569c18b08d2042ae8639abbc225b832a2fbcd95ff43a3fee4fb2962983af8304ef995716110a7ad35c538697c109c01c427ca6cefef3a842fcf74b1c49a3f2da88b85fdb1d05e20cd567538942fa2f0ffbb5d2ff73d60d562d9a0a6894bec3d85a709b43e42ab64e2306cb96919e078b899f3155af56390d06ddc662afe8d2c91fc091e2c5cbbfab3fdb3f49423a5a5f7741f2d70c6736adc66e7c2caa89c6bbc678bb4b445a8a63d120867f01f164dc87adc853633ca7bd4b9d585c2a637d1469da612b5210476fc8d66f90029bdbf7fa5eddc8335cd23deb4bb47e1582e64a03dd021292d34435419af80af178cdfab0fb9374fa0fade48108cd3a571b814231784ac37c9f6071fc6ac0bb018595c9d8afbfcd6f31832b2581f7f7ce7c45d22817aab8ac6df0e0995e12dbd1595c3377b707b816c96ceb1893b9e7c747a577bb7540b89eb3ff7cac878a7a121a37b38fcd3248abfd24b50e25948dcaeff8c1c7ab8b745a93adb87cd54fca223dd940ef4d7eca9dd69243c74ea128ed624e52c7a2257f3950d0c7409d665d912495f8a8a2cf2482c1d51cd7793d3d31f32ffc24374d8606daa2a423931d97019ba2fd3ba773645b7fd01cf75e8201dd29f694a72136b585d940bff8867654223c28d0603d85fe4472d93ee30e35f46e27b8f40f9a9ad03992d9ff23305fc062c7d95971baae1ab074df88d41e09ec9752efff012c482e0cf9aea2b78cc26db146a278d584575ed615f5d168e6df7a832322da093f0aea706cee594207427d3005fd910843f3dc54b14f8b187e3b495b7474792743fc2e43f62bbc7fd50a76513f1fa4073b15a42d1e78a708134238f2521c749d086deeef512823b514aa64122b365efd51e11415de40826971c234d571c3e2a0507226c6ccc540e43a9aa32244b29784ac824c20d3d1b72dc7262f61cce4eefbe9a4ea4cb1061e4a71925aa13f31d6ce80bb7c56bf47b91cf107ab17168dd4fb60614757d7c7f4ebe0320692235fb502621ed9b15b9b3fa23aa1bf266a2a2c3f2386b52625e42e0cd85c37319e3266185419bcf6dea997e52ec8fca5887a68530002fcc5b3619e88d4dc9a918cc36bac2416ffa9b9734ac4e67a93a800f36d7aba4ecfed8d65f62cf6ad13d184a8c6406e3ba17b8aee6af0721ed091e1d225d044629a4ef5153c294a3e87e243e03bdcf6eaf7ee56d9d969a1f054d5774a7e2c363b160386b909c89717aa7015385f4ab8b6c97805c12c37d981ca945134cb1306d39a4d136b42c36d8aacd2c37575a11b17fa50ede8072d667f64bb55e3b54aff2c3c61782e442e088db7c1ce62287477132bef00c17e9992dd42f35b5e098eb97724fc4e697d75812635203abe8f96000d9553012be065980fb16d6d1c0c80457585c6eb699b0e8a6e36c1cd518dd1ffc517afcb9114a4ff629d06cd2f0be1495c4ee09243e96529e6c3a228c923ca2a703930ea94f7a5803645324ba9ea1a08e6c3241fe57a80bd24f780566342561189baed15e85ba9257b701d651754ff534e51279961ff379974e34010d80773b169a140e0ee7c5e2c0312c9dee46fb7b309710d448a43805c7eab513e84e346411b7145f77ff4ced7b32eb641528f78d88af0fe88e0840e9c16f2210e18c1da605bb04a4c963441c06fa839f722b0c67345168bc0fbb1c826f20472c7551a1327eae9eddbc24e63814fb81320cbc6f03488d64587f3e5f53c03db02cb15412e622f9ec9944643d4b5530b0cd4d577489d8ee499ecf2b74fb72423412aca8530fe53c3fc584ed8e39f900843ac73e36fb113c343cc197cd689a09e12f29203c1dfe839630f6932f3a29de81ba787f6044e70dff8981b71fe82f8a4d01f45770a53b090026a003b3e639eca0e6a1e5bdd0aad456e89d83012ea1f53e1a5fe848b33528f7195a7b0c36d4315f1b96b62d5603e87a13e12a97ec335e3922d4339d9575cb26d5691da78a738aa5c84aecc22a93033a6912f84360d13e2e23b0185bdc2cd331bd26ababcc91894935db5c7e1800b8a10db884a7614ceea91f38bbf623c5e7e7238eef06cd9fc9e43507c56e8d6212b7d03ef2db0dfceb040c0b206e1b7eee6ae564b15e4c02e9c3e4179d78bc68a9fbc2166cb8458342f218dc631705602b2ef1c6716dbc08f30810c9e2ab3ac7a03e300e9c21cd2a0240025ed5eda13e6daa246241669acfae65302dbca5c579d3b5c3a4c16a976209e22845337f9ca033329f849f3ccebc69ff01b301d99dbe9e79058fade67bf881c70283f41eaca130d1423e733ccd520f26ebbe8d304cbb8fa2f4bf67e2e041e5e90e840d5510d33a9f700219fbead699901ea3b3f8aa3d5ff0c028ceee5b5e711c29e7740bc98f4b78f15f2aa1e01449f1f15e68023861f540d2ae0541273c641914ea0e6abadbb2f11618bb678c8b7abff1f6d4e9f789706cdbd8dcc1acd4bbd506e42e928d134366d3f32d8caa4b86736bb065b1a3f89354835b7ba5ae1e53cc1bd9f5dfa3e0d49c0a0a8d32670c382712e30f8f4cb8fc980785fb6012df752e02c923d3f56f5764a41629646f9fd7641c8365f0917f85a64d0ba36179e2c2b3045d7b3c6ccfdb60cd5c365c43d88e231465c6616f7d2cab0db88cd79268e5ba0cecb98875958ee3827af7842e35d9cc89c3776e5640f2433a6afccf0e6fff9321e31802746639bf2bf77f375dd6799baa184b48815f24d3fca5d534dfe61d1306d15e97d3a320457ddd2239cc52fb31dbf98709cf090ae59afabbda6da75f4e1373a28bcadc2405e0a7f6dbf9a3e26511fc600a496b4623593213283a1fd33f000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a04dd5a916917c46969db2e2093e73972daa52d5582e183eb0bd08362e7aca1dc280808080808080a03605d0d2c4765be29883abb71f1c4b162f9d6786835ccabb068a243ff819909f8080808080808080b8b2f8b030b8adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a087eef6c6fab228bc280138441d870592a3910f042806b16f257faf5f1542f9a280808080808080a00ac60a3a5bafa4560edb7bd978a6b8980fa818c5edea7c010986328de4d9b4ba8080808080808080b90190f9018d30b90189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d674400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab8301edc0808303d09094000077770000000000000000000000000000000180b844a0ca2d080000000000000000000000000000000000000000000000000000000000320267dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d6744830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05a4ba290d849b719839872aa1e6999ee672fff37d450956de85fe07c96f172d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000080000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a00000000000000000000000000000000000000000000000000000000000320267a0dbfbf2c535ffc52117d4cc616b8d97bd07cdd8585ab67d9095c067e9de6d67440000000000000000000000000000000000000000000000c080a0d86a71e8e531bae3b2a2e70d98e516ccf31b6583d936ffa31c3772ac265db828a0420f5a8067c7eec5214117647da149eaa4e7c78a10d8ee6fa62001ee1b680f9fb9060002f905fc83aa36a7823d3f647482a9c494bac000000000000000000000000000000000000380b905930001536cb8da3dd105e94414690798c7f100000000057b78da8ccffb3bd38b03c0f12199bb964b426dd6b091efd7dc3ad1a9d321d1713b2ea1189d39280b4791c5c858729090c3b6182ac75951eef74b38191686b35c4669656ca9dc5a0ce7e9399f7efffc03afe7fd6e7485887f6264e97e9856a6978b65c5db3b4ce57cf4812abeba0de10d0d6ee5a2cbc9885a2163a58d1895524adbfd86d795eac74ec74d783b599861bf4b7b3e6daf70b3ae0e5740c88a4dc15b893f76fe074a718bcead52fb2a06d6e5f1cf3ca344ad05dcf5ca10bd9bc2809cd8ecd40a2dd0e03200dadd8f921f0e9953a7e6d8c7dc99e60cf6fe81465175e0cf99b702ac6a13706e64ac349a1119796eb0b6e7d5ae48ad74a5c997d679ef9c637c619587cb98ecf88e620dacdc57701500c74e087533f978831a78bf3857cb6044a8c66e41645cdee74ac7cdac69a8484083eb003827ccfd6b92c77b7097a15f38a419f6f0578f3568465e6fb639f1a8d6e52e9d17a0413100ca8d08b210a2e5adb2bead3dfaada14b2513113802f3996daccac89014dafd1368700300053ad7daeea2a4d4d9e8502aa44337c6ff91165a25de84fe5273b2e5b7f4dda3a0410900125e7778d5c2a59a2ca2ce36bacc9e95812ae1b69a478fc7ecf5ded14b68a80a010d6e03e07137d5de8082773f8a422390cd0a592d81e6e623a42bc69547e6b343e1d9a14e64ac3486116e29a8315486a2324d93d3e33a8344ffdbc2655b76dbf72077e43c13961a6a52f0565f2000881576c7a113e7aa6e9a6ed4679014533f8d1bf80ff44ae5599813e80d2c1f2fd0a03400864952137916724a4504bb118ccaf9236f217a1e43c97e471397a3f86672226dd0e02e00d4dcbfe4dd250a97d0c830b3d93213fd048fed38ea8378018c726be68728e22c687037000e3bb6d2858fba82db877c2e28fa1e2cca4ce57b6bdfdba7513dcd2649da93544083d06f85c8f4d21559e8e7651dcaa0c3aafc4a691fdfb27f2f39ea08ea62feff43cf0d80061500b0b00cb246f3641d83f5c934c477ca641a5c545da8aa0e4662c4c5f26ee70525a04125006cf268fbdcaddb151168bf24d3fa2e09f7445d859ff9e5ba2fe71e7ef8861ba61834a80280ebddf1bc99e8d00ae5d2a0893d64774d4cea1bad7146fc964526b6c4617cd70a68500d00f7e8131b976b9537ab4e2b9c9cf086fcfd82e235cf6c6eabbf8030cc3fd1e395071a840120bfbd7fd4a54397eca0c0f7adc1231dd539950f508f92e237e3aeb91468c38d4083ea0068a89abd38178e2e9f67559758419b6908d48d58967547c9edfe98ba016e050734a809807957936c079272b238748593ee3a73f5c7647d0ece20a5c208769c484474aa2f192b6dcc780a770c9b40b42348219a34a746cb495f3f1efb710a816ac142121461c6f7bf82fb00b0dec5bfbcaa2e32983075c84989e439154bfc7df1d0549680a6c1a4999c18aa010dee074028fcade2995b7daec4562449ccbced0caf7a660f49ac4ea07d485b22348948a0415d001ce8e16f70ca5813141f7f7544586da1364d2f77dd8fbb7cc937c6d46136f93d68f000009a72d59e5a9bdf1de5e60bbb17358bc65e8ff1566fabad6d6eb42ef2781f6d6d40837000bce21c64847942319b4ac1c92b2ee02fe2bfbf43b685908b92a0c3cd25f21641a0417d0084138599419cf73489312bda0d53e1fa748e1f7927380961470ec9fda73b36978c953661c8065aaafe09fb847fb54e35b3c68f771b6953941b2b4e619b486d81761ee187bf828700301cd34529763c60738c12e1ccce6ddff8b8338cda8fda245e5d8d5613d20734408306df96bd65c7b8d5c27299269dd9335ef7cb1f3357145983f365ec2f933686fc6d77d0a01100ca3a3773d3f0a52559ee691776b714fedc8c7b2cd672c7065c295693d0616d37408318007c18e9a9f6e4929e20d8efd4c2428065720ed1938af8e5348c14b373b0a845d1063468d2f96f000000ffff86f9aa5001c001a08f785a1c8e4c549c415dd948da80f86e3aaabc4e7a784604b6362208e0fb6b85a011d366d57b6ad95cda2eb6b618704859b4d433ad7557cad177eff6f6bae578cbc0f90200df8345de7e8203e494e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de7f8203e594e276bc378a527a8792b353cdca5b5e53263dfb9e82168cdf8345de8082062294388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de8182062394388ea662ef2c223ec0b047d41bf3c0f362142ad58212cadf8345de828201949425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de838201979425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de848201999425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8582019a9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8682019b9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b8212cadf8345de8782019e9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de888201a29425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de898201a59425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8a8201a89425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8b8201a99425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8c8201aa9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08df8345de8d8201ac9425c4a76e7d118705e7ea2e9b7d8c59930d8acd3b820f08" + } + } + ] + }, + { + "name": "debug_getRawHeader", + "summary": "Returns an RLP-encoded header.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Header RLP", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "examples": [ + { + "name": "debug_getRawHeader example", + "params": [ + { + "name": "Block", + "value": "0x32026E" + } + ], + "result": { + "name": "Header RLP", + "value": "0xf90236a09f73691f6dabca4f0a99b05d0a701995506aa311dcaa9ce9833d6f4ca474c162a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794c6e2459991bfe27cca6d86722f35da23a1e4cb97a078103ea8c47231886481d72ec1afae6eeb06c3773ce24a91323d5c9eed69d4cca0008992da2531db404f07b0871dd620a94ba346963e1b1c6dc7b00748e8593a1ea0b6c3890d9604434fc52f722848c84d1770add20cd75bbc28cdedff42940dbb56b90100200800000400000002000e0000000401000000440100000000c0400600000002000801000000040480020840048000000000400000000000000020004220000011002000000000000204000800000010010002000002000000000040a000000000000400020000010885000000000808000000008800001004002010020300005000000010002110410402000000000000000890000008000000000000000000020040000002000000000000810400000040006000004000004080020000000000000022001000000000000840400000000220250000000000080402000420000418000000000000000400040000004080040010200000000000108020020000808332026e8401c9c380833e3c3c846436f93899d883010b05846765746888676f312e32302e32856c696e7578a0112d8f15793e7df7f8dcdb21c891cff78c0d1839cb5b6dcd06116cdbb99536ae88000000000000000008a0cdb97712af6685bb9650d21d609525913293c48adda7c45990926daada335c9b" + } + } + ] + }, + { + "name": "debug_getRawReceipts", + "summary": "Returns an array of EIP-2718 binary-encoded receipts.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Receipts", + "schema": { + "title": "Receipt array", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + }, + "examples": [ + { + "name": "debug_getRawReceipts example", + "params": [ + { + "name": "Block", + "value": "0x32026E" + } + ], + "result": { + "name": "Receipts", + "value": [ + "0xf901a60182c70eb9010000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000002000000000000000000000008000000000000000000000000000000000040000000001000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000100000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000002000000000100000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000020000000000000000f89df89b947753cfad258efbc52a9a1452e42ffbce9be486cbf863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000828d0386c1122e565f07dd28c7d1340ed5b3315a000000000000000000000000021849e99c31e3113a489d7eb0fd4d8c0edbe47afa00000000000000000000000000000000000000000000000000000000029b92700", + "0xf901a70183018e1cb9010000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000002000000000000000000000008000000000000000000000000000000000040000000001000000000000000000000000000000000000000000000000010000000000000000000000000000000008000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000002000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000020000000000000000f89df89b947753cfad258efbc52a9a1452e42ffbce9be486cbf863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000828d0386c1122e565f07dd28c7d1340ed5b3315a000000000000000000000000069cda9d6cc6ce05982d0b4fdf9480f2991f39b5aa00000000000000000000000000000000000000000000000000000000029b92700" + ] + } + } + ] + }, + { + "name": "debug_getRawTransaction", + "summary": "Returns an array of EIP-2718 binary-encoded transactions.", + "params": [ + { + "name": "Transaction hash", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "EIP-2718 binary-encoded transaction", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "examples": [ + { + "name": "debug_getRawTransaction example", + "params": [ + { + "name": "Transaction hash", + "value": "0x3a2fd1a5ea9ffee477f449be53a49398533d2c006a5815023920d1c397298df3" + } + ], + "result": { + "name": "EIP-2718 binary-encoded transaction", + "value": "0xf8678084342770c182520894658bdf435d810c91414ec09147daa6db624063798203e880820a95a0af5fc351b9e457a31f37c84e5cd99dd3c5de60af3de33c6f4160177a2c786a60a0201da7a21046af55837330a2c52fc1543cd4d9ead00ddf178dd96935b607ff9b" + } + } + ] + }, + { + "name": "engine_exchangeCapabilities", + "summary": "Exchanges list of supported Engine API methods", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md#engine_exchangecapabilities" + }, + "params": [ + { + "name": "Consensus client methods", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "result": { + "name": "Execution client methods", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "examples": [ + { + "name": "engine_exchangeCapabilities example", + "params": [ + { + "name": "Consensus client methods", + "value": [ + "engine_exchangeTransitionConfigurationV1", + "engine_forkchoiceUpdatedV1", + "engine_getPayloadBodiesByHashV1", + "engine_getPayloadBodiesByRangeV1", + "engine_getPayloadV1", + "engine_newPayloadV1" + ] + } + ], + "result": { + "name": "Execution client methods", + "value": [ + "engine_getPayloadV1", + "engine_getPayloadV2", + "engine_executePayloadV1", + "engine_newPayloadV1", + "engine_newPayloadV2", + "engine_forkchoiceUpdatedV1", + "engine_forkchoiceUpdatedV2", + "engine_exchangeTransitionConfigurationV1", + "engine_getPayloadBodiesByHashV1", + "engine_getPayloadBodiesByRangeV1" + ] + } + } + ] + }, + { + "name": "engine_exchangeTransitionConfigurationV1", + "summary": "Exchanges transition configuration", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_exchangetransitionconfigurationv1" + }, + "params": [ + { + "name": "Consensus client configuration", + "required": true, + "schema": { + "title": "Transition configuration object", + "type": "object", + "required": [ + "terminalTotalDifficulty", + "terminalBlockHash", + "terminalBlockNumber" + ], + "properties": { + "terminalTotalDifficulty": { + "title": "Terminal total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "terminalBlockHash": { + "title": "Terminal block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "terminalBlockNumber": { + "title": "Terminal block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + ], + "result": { + "name": "Execution client configuration", + "schema": { + "title": "Transition configuration object", + "type": "object", + "required": [ + "terminalTotalDifficulty", + "terminalBlockHash", + "terminalBlockNumber" + ], + "properties": { + "terminalTotalDifficulty": { + "title": "Terminal total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "terminalBlockHash": { + "title": "Terminal block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "terminalBlockNumber": { + "title": "Terminal block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + "examples": [ + { + "name": "engine_exchangeTransitionConfigurationV1 example", + "params": [ + { + "name": "Consensus client configuration", + "value": { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + } + } + ], + "result": { + "name": "Execution client configuration", + "value": { + "terminalTotalDifficulty": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "terminalBlockNumber": "0x1" + } + } + } + ] + }, + { + "name": "engine_forkchoiceUpdatedV1", + "summary": "Updates the forkchoice state", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_forkchoiceupdatedv1" + }, + "params": [ + { + "name": "Forkchoice state", + "required": true, + "schema": { + "title": "Forkchoice state object V1", + "type": "object", + "required": [ + "headBlockHash", + "safeBlockHash", + "finalizedBlockHash" + ], + "properties": { + "headBlockHash": { + "title": "Head block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "safeBlockHash": { + "title": "Safe block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "finalizedBlockHash": { + "title": "Finalized block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + }, + { + "name": "Payload attributes", + "required": false, + "schema": { + "title": "Payload attributes object V1", + "type": "object", + "required": [ + "timestamp", + "prevRandao", + "suggestedFeeRecipient" + ], + "properties": { + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "suggestedFeeRecipient": { + "title": "Suggested fee recipient", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + } + } + } + ], + "result": { + "name": "Response object", + "schema": { + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + } + }, + "errors": [ + { + "code": -38002, + "message": "Invalid forkchoice state" + }, + { + "code": -38003, + "message": "Invalid payload attributes" + } + ], + "examples": [ + { + "name": "engine_forkchoiceUpdatedV1 example", + "params": [ + { + "name": "Forkchoice state", + "value": { + "headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a" + } + }, + { + "name": "Payload attributes", + "value": { + "timestamp": "0x5", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "suggestedFeeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" + } + } + ], + "result": { + "name": "Response object", + "value": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": "0x0000000021f32cc1" + } + } + } + ] + }, + { + "name": "engine_forkchoiceUpdatedV2", + "summary": "Updates the forkchoice state", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_forkchoiceupdatedv2" + }, + "params": [ + { + "name": "Forkchoice state", + "required": true, + "schema": { + "title": "Forkchoice state object V1", + "type": "object", + "required": [ + "headBlockHash", + "safeBlockHash", + "finalizedBlockHash" + ], + "properties": { + "headBlockHash": { + "title": "Head block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "safeBlockHash": { + "title": "Safe block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "finalizedBlockHash": { + "title": "Finalized block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + }, + { + "name": "Payload attributes", + "required": false, + "schema": { + "title": "Payload attributes object V2", + "type": "object", + "required": [ + "timestamp", + "prevRandao", + "suggestedFeeRecipient", + "withdrawals" + ], + "properties": { + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "suggestedFeeRecipient": { + "title": "Suggested fee recipient", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + } + ], + "result": { + "name": "Response object", + "schema": { + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + } + }, + "errors": [ + { + "code": -38002, + "message": "Invalid forkchoice state" + }, + { + "code": -38003, + "message": "Invalid payload attributes" + } + ], + "examples": [ + { + "name": "engine_forkchoiceUpdatedV2 example", + "params": [ + { + "name": "Forkchoice state", + "value": { + "headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a" + } + }, + { + "name": "Payload attributes", + "value": { + "timestamp": "0x64e7785b", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "suggestedFeeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ] + } + } + ], + "result": { + "name": "Response object", + "value": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": "0x0000000021f32cc1" + } + } + } + ] + }, + { + "name": "engine_forkchoiceUpdatedV3", + "summary": "Updates the forkchoice state", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md#engine_forkchoiceupdatedv3" + }, + "params": [ + { + "name": "Forkchoice state", + "required": true, + "schema": { + "title": "Forkchoice state object V1", + "type": "object", + "required": [ + "headBlockHash", + "safeBlockHash", + "finalizedBlockHash" + ], + "properties": { + "headBlockHash": { + "title": "Head block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "safeBlockHash": { + "title": "Safe block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "finalizedBlockHash": { + "title": "Finalized block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + }, + { + "name": "Payload attributes", + "required": false, + "schema": { + "title": "Payload attributes object V3", + "type": "object", + "required": [ + "timestamp", + "prevRandao", + "suggestedFeeRecipient", + "withdrawals", + "parentBeaconBlockRoot" + ], + "properties": { + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "suggestedFeeRecipient": { + "title": "Suggested fee recipient", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + "parentBeaconBlockRoot": { + "title": "Parent beacon block root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + ], + "result": { + "name": "Response object", + "schema": { + "title": "Forkchoice updated response", + "type": "object", + "required": [ + "payloadStatus" + ], + "properties": { + "payloadStatus": { + "title": "Payload status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING" + ], + "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + }, + "payloadId": { + "title": "Payload id", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + } + }, + "errors": [ + { + "code": -38002, + "message": "Invalid forkchoice state" + }, + { + "code": -38003, + "message": "Invalid payload attributes" + }, + { + "code": -32602, + "message": "Invalid params" + }, + { + "code": -38005, + "message": "Unsupported fork" + } + ], + "examples": [ + { + "name": "engine_forkchoiceUpdatedV3 example", + "params": [ + { + "name": "Forkchoice state", + "value": { + "headBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "safeBlockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "finalizedBlockHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a" + } + }, + { + "name": "Payload attributes", + "value": { + "timestamp": "0x64e7785b", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "suggestedFeeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ], + "parentBeaconBlockRoot": "0x11f780a954bcba8889998e4e61deaae6388dd2391e9c810bd9c94962cc1eadc1" + } + } + ], + "result": { + "name": "Response object", + "value": { + "payloadStatus": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + }, + "payloadId": "0x0000000021f32cc1" + } + } + } + ] + }, + { + "name": "engine_getPayloadBodiesByHashV1", + "summary": "Given block hashes returns bodies of the corresponding execution payloads", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadbodiesbyhashv1" + }, + "params": [ + { + "name": "Array of block hashes", + "required": true, + "schema": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + ], + "result": { + "name": "Execution payload bodies", + "schema": { + "type": "array", + "items": { + "title": "Execution payload body object V1", + "type": "object", + "required": [ + "transactions" + ], + "properties": { + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": [ + "array", + "null" + ], + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + } + }, + "errors": [ + { + "code": -38004, + "message": "Too large request" + } + ], + "examples": [ + { + "name": "engine_getPayloadBodiesByHashV1 example", + "params": [ + { + "name": "Array of block hashes", + "value": [ + "0xd5f1812548be429cbdc6376b29611fc49e06f1359758c4ceaaa3b393e2239f9c", + "0xfe88c94d860f01a17f961bf4bdfb6e0c6cd10d3fda5cc861e805ca1240c58553" + ] + } + ], + "result": { + "name": "Execution payload bodies", + "value": [ + { + "transactions": [ + "0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", + "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ] + }, + { + "transactions": [ + "0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", + "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29" + ], + "withdrawals": [ + { + "index": "0xf2", + "validatorIndex": "0xf2", + "address": "0x00000000000000000000000000000000000010f2", + "amount": "0x1" + }, + { + "index": "0xf3", + "validatorIndex": "0xf3", + "address": "0x00000000000000000000000000000000000010f3", + "amount": "0x1" + } + ] + } + ] + } + } + ] + }, + { + "name": "engine_getPayloadBodiesByRangeV1", + "summary": "Given a range of block numbers returns bodies of the corresponding execution payloads", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadbodiesbyrangev1" + }, + "params": [ + { + "name": "Starting block number", + "required": true, + "schema": { + "title": "hex encoded 64 bit unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + }, + { + "name": "Number of blocks to return", + "required": true, + "schema": { + "title": "hex encoded 64 bit unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + ], + "result": { + "name": "Execution payload bodies", + "schema": { + "type": "array", + "items": { + "title": "Execution payload body object V1", + "type": "object", + "required": [ + "transactions" + ], + "properties": { + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": [ + "array", + "null" + ], + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + } + }, + "errors": [ + { + "code": -38004, + "message": "Too large request" + } + ], + "examples": [ + { + "name": "engine_getPayloadBodiesByRangeV1 example", + "params": [ + { + "name": "Starting block number", + "value": "0x20" + }, + { + "name": "Number of blocks to return", + "value": "0x2" + } + ], + "result": { + "name": "Execution payload bodies", + "value": [ + { + "transactions": [ + "0xf865808506fc23ac00830124f8940101010101010101010101010101010101010101018031a02c4d88bfdc2f6dbf82c33d235c4e785e9fc23b2d0fc7b9d20fc5e9674f1f9d15a016d6d69b925cf26128683ab4a096e196fbb1142d6c6d4e8d3481b9bef1bd0f65", + "0x02f86c0701843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a039409b4e5603dd8c3cf38232348661a8e99ac518396eeaa128ec9ec2a3eb8127a06b21ab956f5f138cb44fda1a9055bd08980ea4f8040d877c00dac025608d0d95" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ] + }, + { + "transactions": [ + "0xf865108506fc23ac00830124f8940101010101010101010101010101010101010101018031a0d9712a3c40ae85aea4ad1bd95a0b7cc7bd805189a9e2517403b11a00a1530f81a053b53b0267a6dcfe9f9a1652307b396b3e8a65e65707a450e60c92baefdbcfbe", + "0x02f86c0711843b9aca008506fc23ac00830124f89402020202020202020202020202020202020202020180c080a071d36bc93c7ae8cc5c01501e51e5e97a51aa541d1a89c809a2af7eb40e9bc2cba071644230e21c075c1da08916aff5efe9f95a6f6a4f94dc217f6c1bb4a3240b29" + ], + "withdrawals": [ + { + "index": "0xf2", + "validatorIndex": "0xf2", + "address": "0x00000000000000000000000000000000000010f2", + "amount": "0x1" + }, + { + "index": "0xf3", + "validatorIndex": "0xf3", + "address": "0x00000000000000000000000000000000000010f3", + "amount": "0x1" + } + ] + } + ] + } + } + ] + }, + { + "name": "engine_getPayloadV1", + "summary": "Obtains execution payload from payload build process", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_getpayloadv1" + }, + "params": [ + { + "name": "Payload id", + "required": true, + "schema": { + "title": "8 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + ], + "result": { + "name": "Execution payload", + "schema": { + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + } + }, + "errors": [ + { + "code": -38001, + "message": "Unknown payload" + } + ], + "examples": [ + { + "name": "engine_getPayloadV1 example", + "params": [ + { + "name": "Payload id", + "value": "0x0000000021f32cc1" + } + ], + "result": { + "name": "Execution payload", + "value": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } + } + } + ] + }, + { + "name": "engine_getPayloadV2", + "summary": "Obtains execution payload from payload build process", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadv2" + }, + "params": [ + { + "name": "Payload id", + "required": true, + "schema": { + "title": "8 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + ], + "result": { + "name": "Response object", + "schema": { + "type": "object", + "required": [ + "executionPayload", + "blockValue" + ], + "properties": { + "executionPayload": { + "title": "Execution payload", + "oneOf": [ + { + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + }, + { + "title": "Execution payload object V2", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + ] + }, + "blockValue": { + "title": "Expected fee value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "errors": [ + { + "code": -38001, + "message": "Unknown payload" + } + ], + "examples": [ + { + "name": "engine_getPayloadV2 example", + "params": [ + { + "name": "Payload id", + "value": "0x0000000038fa5dd" + } + ], + "result": { + "name": "Response object", + "value": { + "executionPayload": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "blockNumber": "0x112720f", + "gasLimit": "0x1c9c380", + "gasUsed": "0xbad2e8", + "timestamp": "0x64e7785b", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x1256f99fb899c2de0aeac0c5aa6aad69de188b6a0f4ac29f2d075a53aa3ed0e4", + "transactions": [ + "0x03f88f0780843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a0010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401401a0840650aa8f74d2b07f40067dc33b715078d73422f01da17abdbd11e02bbdfda9a04b2260f6022bf53eadb337b3e59514936f7317d872defb891a708ee279bdca90", + "0x03f88f0701843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001521d528ad0c760354a4f0496776cf14a92fe1fb5d50e959dcea1a489c7c83101a0a86c1fd8c2e74820686937f5c1bfe836e2fb622ac9fcbebdc4ab4357f2dbbc61a05c3b2b44ff8252f78d70aeb33f8ba09beaeadad1b376a57d34fa720bbc4a18ee", + "0x03f88f0702843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001453362c360fdd8832e3539d463e6d64b2ee320ac6a08885df6083644a063e701a037a728aec08aefffa702a2ca620db89caf3e46ab7f25f7646fc951510991badca065d846f046357af39bb739b161233fce73ddfe0bb87f2d28ef60dfe6dbb0128d" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ] + }, + "blockValue": "0x10a741a46278014d" + } + } + } + ] + }, + { + "name": "engine_getPayloadV3", + "summary": "Obtains execution payload from payload build process", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md#engine_getpayloadv3" + }, + "params": [ + { + "name": "Payload id", + "required": true, + "schema": { + "title": "8 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + } + } + ], + "result": { + "name": "Response object", + "schema": { + "type": "object", + "required": [ + "executionPayload", + "blockValue", + "blobsBundle", + "shouldOverrideBuilder" + ], + "properties": { + "executionPayload": { + "title": "Execution payload", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals", + "blobGasUsed", + "excessBlobGas" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + }, + "blockValue": { + "title": "Expected fee value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blobsBundle": { + "title": "Blobs bundle", + "type": "object", + "required": [ + "commitments", + "proofs", + "blobs" + ], + "properties": { + "commitments": { + "title": "Commitments", + "type": "array", + "items": { + "title": "48 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{96}$" + } + }, + "proofs": { + "title": "Proofs", + "type": "array", + "items": { + "title": "48 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{96}$" + } + }, + "blobs": { + "title": "Blobs", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + }, + "shouldOverrideBuilder": { + "title": "Should override builder flag", + "type": "boolean" + } + } + } + }, + "errors": [ + { + "code": -38001, + "message": "Unknown payload" + }, + { + "code": -38005, + "message": "Unsupported fork" + } + ], + "examples": [ + { + "name": "engine_getPayloadV3 example", + "params": [ + { + "name": "Payload id", + "value": "0x0000000038fa5dd" + } + ], + "result": { + "name": "Response object", + "value": { + "executionPayload": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "blockNumber": "0x112720f", + "gasLimit": "0x1c9c380", + "gasUsed": "0xbad2e8", + "timestamp": "0x64e7785b", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x1256f99fb899c2de0aeac0c5aa6aad69de188b6a0f4ac29f2d075a53aa3ed0e4", + "transactions": [ + "0x03f88f0780843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a0010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401401a0840650aa8f74d2b07f40067dc33b715078d73422f01da17abdbd11e02bbdfda9a04b2260f6022bf53eadb337b3e59514936f7317d872defb891a708ee279bdca90", + "0x03f88f0701843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001521d528ad0c760354a4f0496776cf14a92fe1fb5d50e959dcea1a489c7c83101a0a86c1fd8c2e74820686937f5c1bfe836e2fb622ac9fcbebdc4ab4357f2dbbc61a05c3b2b44ff8252f78d70aeb33f8ba09beaeadad1b376a57d34fa720bbc4a18ee", + "0x03f88f0702843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001453362c360fdd8832e3539d463e6d64b2ee320ac6a08885df6083644a063e701a037a728aec08aefffa702a2ca620db89caf3e46ab7f25f7646fc951510991badca065d846f046357af39bb739b161233fce73ddfe0bb87f2d28ef60dfe6dbb0128d" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ], + "blobGasUsed": "0x60000", + "excessBlobGas": "0x0" + }, + "blockValue": "0x10a741a46278014d", + "blobsBundle": { + "commitments": [ + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x85103a5617937691dfeeb89b86a80d5dc9e3c9d3a1a0e7ce311e26e0bb732eabaa47ffa288f0d54de28209a62a7d29d0", + "0xabc07739e8026f10eeb9a014f804934b7b8179be4d0cc36be461163862f6a575c564a3acd27de42dc50aaf4cf214ef7c" + ], + "proofs": [ + "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x80c5f2e1eb23939cf3600f61872e3e9964d0acafb440634e530d6139a193b889c56a0c07d737729dbe0626706fc9f25f", + "0x98daeed734da114470da559bd4b4c7259e1f7952555241dcbc90cf194a2ef676fc6005f3672fada2a3645edb297a7553" + ], + "blobs": [ + "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x722662154e6d76b2b2b92e70c0cac3ccf534f9b74eb5b89819ec509083d00a503ae5c198d17634e79059c2cd735491553d22c4e09d1d9fea3ecf214565df22847267ddd7c47030f8667b61a9860b085c060c07eb215a4de991a8fed0cae3821f0ee8de64d25d2de4a710ea9fd89f8f4666fcc7451e6d69a02098bbe5d5b87c60720f6db75bcbad49fc11512930d9d97bef3f2b4bf6c8fcbc414bf61c98d6bff23ba6ab1d76e044908135e6c8720d3d8ca18be1e013c275ba9f2a5d7eef5c2b5f3868df470b4e7848f79d98cfd7381c8e38e9ddbdf213af8d3eacbdd1b7d0fea5724fa5aee5f5b819f35f8fdaffbddc2a2bb2fd21f07f24fbe11f98ebcdbf6e327257389fb0bcb43108092945312d767d4485358fd543215807db5e5e3cb3741c722f2581d15ec8d6eea7c0e7db2ab6f9b5a774be8341d32a3739d103929ce0547208b324b7b29a85552d2fc90b40f9e510680ace1447720c98002f7ef7b7fe09308ff3a8f75036c48afbb09daf42f1f36f477e64606c3322f987fb05603bc62d2171de0fcfe3090c32234a712d7f2483806f192771cd0e2ab1472efdf428f5fa72c2c5a5ca73e3f095ad763054ed2a4a8fa6a05bf3b029646c5f8b61033ed851727e7aa4d120f9817ab2420a7cbdefb67d6d1666cc00a1a37b564ceacd14c37c72e0ae06fa1a09bf6307e226d29942db1ef31c65de6a49922f8f4860ec2d8a71726f74cc29496a85a775bb29103f75247b2b34718a89010dd9371557c1ed466772087bfe3148d17f8279de1fe8387104d0e25bb36e0187b2e1d4df9df3efc52d72f896e5aae4e5371bde4571421bdd1e47b1ece2a8fadbf27f27b87d1689f4453d87d4bdc1f411bfa13789478f4b2f6203af19c7c24063e3d2663dc7a3c97d1255862ec5121e4cc733e7e6929847f32353a4bcf6897f1ff52dcc66d8c9923f0d525a22699ebbebcc80fb1f158beb8c61511698ee9fe9b40a2ddea746c7a921e8532281b46bf4ef7183597e208aff1784d79436cc69ef5bddc0db29fe2da84bce72c78b23dc94c1e76598dcd6ce8c24c0bd72cb581605c4d8a4e711efb957952f7266f9faaad1e0258462eb68de681032d3dcc3047bbf1c7f1f3337bb67d9563a7212a42a90dc93647b636540c774a680e8ae8958f386d4639fa9d61e02fa5293540f6f733de496a0548eaec3d510ee6e1ae2822d348793693e1dc38dd3e69394720adba55b6792fad47817a9ba0881572b4ecb1a91cc7fed3e2dfc51569419777270437988bb74e5eeb888d5850f9de432ebc6a201546325df68f10049d54c9672b3f5271eb5cb37a995d9ff04162a5320a480c457409b28a663ed71b2b40ad22b541b5ffddc62d08b8d4c8da62d21fa429a6d658b35432a73651ad9f9c2121e72e172dcb51ae6ee4f2bbb50c51a97ce7c742fad786e465de42cf569f543c4cc2a37942bf3455a31fcecaa6c1e2718d00478871dc9d0ddb6e984701196f49ac972a3fdd50e631e828c823a3546198efe5f8ca312e31fb2a6baf148cabd595ab8720657f8dd99b792976e6e087b711977ef17efd4e0d28d9cee48ec113c5092567248b25bcfd5bbada813642323a7fd7a76356cde8dabbbea44cde6ce1fcc1e667280e5932f0cd08b3d2399a574629e1eba98b0a0db467a6649945f8e271cfef1223006baff8511b554b9c1181d74c499e3516c03103cb6ccb1e549e9e57be80f72e392508bc624d9af47d2da2ba898fc32608a4df1a5ac4954d819e17ba938a57237c699abbde80e4a73aa42a4ca855c8108d4658b0293f09a94fe192a5c040472b56dfeeb18c3563c86f325b8305e9ab84b276811af6e07bc15aa3ed3e4781931452258d387e284a4dd23b7884b8e9f0a3ae41779a20b18607d692283a413bc4338ad9312499fcf8b17a6f28eab8ddc3151ae89805400a1096164063653267f724c8b712452cbe999386c45e54d94916e0a8017e0dadb21ad27c8059214d97d32c76fc47dbbdf528745ae9e55cc5da5ff0f9aeb46d1b79654600fa3c7df49ac723c0fc457440862b4c6138d577fb8d74ada728be3c5438f5c2c1da853305efe72a917c4dfd89735e8fa5c07c9cc4452b6844463a18781bd9accdda74b1e958e1ca7de9f49c900079ab6108670cc5519b6744ad2d105f6b0d4ec5b5ee88cee9b4e3148da1dbc9c813ad96e911faad349151d6843954d89572c17f63b83cd2def722859980a43cb112480a70af211617d8e346e961abf2f5df65136da1619e0f07247b1a8589f00e9deef61970a23edd6b96b330e54c98e0df0e602724d00368c729f09a21d1b52932276b1aff4e63d00acb3a341f16999d5a013c2454f95ced30f0d22f6c88f672ffc3e61d5223da39266f62ebae5dd75a489efeb6df0862d1172cddf0e365f75c18dbc848f6746a3ccae1684752a217409b8b57a91aa05eea272f8c96a09594956c3e5d917cd6156c096c26dbd93f9a4fa5c8a411092c0c1c63be9403f19d6c6a9a052fc4a6acf46c9fdaaf8a662591f754c309c2d5f6275e92f64b6f81649fbf5e8f05c7e72842ea62acc9b8ab8c82e49b8e96af2219b2b92722cd5a628ab14f7483f8f56261aac17e7b8bd1016a4a9616075829c20eb540672ca8d829470c0050d8f08417cdf4eb417ea0c5864e9e7cb8caca88832cb245f726d60a46004f4bf71f107330d634b86d9fa89051573ed947e7e095d8cfd677d72396912aa12b9fb8dd7d4f21dc0bb28f2d1e290476787f63fa3e4eed2469cf772cfa7451fdf19674a0100d60ffc535cda86c248de1f17c60cde104b974105ec6edc9b7e40822a96b3c7e6018e60db2493d3e53aa0cb9ca9e359940644347ae23fe53c98062e74cb991ad7e03342614f8696bbfc097b1ba768e04449dcb3298d72e50a0733a644a6c06d06e8274d90e3d9994ed7b928ae7c7efad145e2306ebf3a2f258223afe8f1d4219bf37da3670026264d4dc1d2928c1b7865bf99b036de7289286ec6abd1235ada7c4efb349d21f79ca0562ce3e931eb50d4116a4af7bf72bcf2f390341412c77cbdeba26cabab50d0576a00b313fec424ba03d4de19a372326b171e251700a72121d7fa0009e4e8c94e186a7be365ba1568d993ac16b9720764806197b2eeac2d7565783b938a6fbaba57cb60062b53c1e8ce226983a972deea93ced7b88c2e87920a0156c1b94a4bec0e47fcfb30e1972f047b56252b69df22f121758a49b08d8e5147a761143e6ec5e2a4322f9feda4dee59b268c4872550a76c5bc0c07232a77c7d04c47b30ef6965840756e007cc872f71e9faf194a62b69787e017762fd4f9148f7a43b9d50d8abe4290fb986864ccf24f9f52f8483c87e5e4e45c4e935f4f337b7d88baa38b9039fdf03ce40a9ffdc6e111fe692f38c650752019db283668560fd31349c5849183f0d91de0d2b88931ed393a3172624649937fb1afb04a92ff2c4469041679057762ddd15a4c8a4501b6116c9a72a2260b2e8588948fae691303c5a7041027ce4a5827c39edc6a8714434b537d724884fbb9a39bfbf887e945157ca2ee990fded68e30604af9942f8e39195c5972a532333ef4d5eacbc9be8534273854503a0eb94eb6007d4f7ef386c6aa37a866e1c12c0f34f5db2a92b1e3ad467c7e1f75bdad36e05474e15816bd1df4ec85259262d3ff7a5184f80122b13de208e87bd9b2c607e6efae864569a2d8b464fc0473dea65351f4e3d52a497452c79740c458450914eda689474367217d18d62042e63487cdab70eef512f6681a2aef4d2359783936cae2a5c3df843c93c7f35f7208b386b9822f79d21154a1edf2568b4b355ed7da3cf7e5e7954ca7582217a2728bc1c427610a3831d67b931f296b3c30b372d19fcb4d60b3c0b8bfe0f667503dc7cd70d41df629ff139d0f66952901f42795c4babc68f653ed080bc895f56f4053aecb97f6603926a2ae285df8cf20c57e34e56965eaadd4f7bd1b20308f8072508390724cae5611f0574d1e83c0dbdfbc61ab06fdcc0e65be32bf272ead8672545a8145bb1179511c8822c63ff1e7bfbb3b8527c48ba5be283078ebfcaa2f72eaf0a362ff747e226c4f228281fe5e3606eb826f4161828ee1a501d48c6a362749ba4302b8941d81be751f23cd27b040c2d890c9a6a2047b3a1f7a33fce612725e7d8319decc545803a420099ad5a7ca52b41b0f51e588d3583e71244d75027237107713dda0803055314c1fae8fcd8993632a7ed91bb0fdcc791cfb3d720372d2f506986989051a6d32777c2d1aa025246788f30f54c144c0535989333d57723f9ff54a691d043f2c2d84ae95272807860d6c576a0c6dfd90c4bae6b650327225078ac2bd96dc5d646a873a6d7543c2e1265b71f99d3c9f1e2a06a3059c06727c0f5196419afc19a455bc3adb4ae23e69ea0073e7c600fc5dfd7050bbab8850ba35b25de6dbbd8f7f7b395acb6b6d460e7b7883e93508c42d7f2afa4c8f9a26f769f1a0d31fe888ca7ca2771e1c1287314d2833ebd53726af856e4658a0bb6ed55c41ac04b434a3e6736cd9261300b9315ad364c467238487ba0108aceedd1c8814f7fa9e14b82243164e84760887a2419e1559123e9d5f941bd41c8833ca72390d33a27d45b6e73ab4ee02f23b3b01ee0f94b4a98304671f1aab423feecd2879fb6196503b6eb499f20144c56836c3cef788d0ae530e8aeacaf9c01ae40172297c5f46f70b085417bb1c4217ef6b0f3400b4994e57cef7116feeac37c929392ab6bb95ffe92f643f64ec7e036af2656f84727cc308354091c1cd7eaf4df17244b1a04514d4f8e1629881c84cb6f5be182b40b498c3faa55b28a786436929728da528e60150034e1466b60a7ebcf37958455eb09686965c81b585bdcaaadc725ace191deda3b0d0fb3e6363f28b626c14e45918bc314684682b68c51fdd127235c1dfaa021dd9625ce84ad3dc3acb7978f57825a6faae9e704b9ab51772da6119e184ae1bc99ee29bfadf8abc83ab6805488e89ce22a201400c1d9def057462da34cefd8ff96ab767dfb7d2df3b9d2f137fc400338fe88a6c18f8577507f1188dcd5bc975f0412396b1bd5c11f6f6065e058af459835ff942ae4f80ae4c117239828b98b3b34d092cc8cd53a7f7e804d2e337c9fd857228e52c6370eed766729553fd9dcdb643a0127ae1cfca8fe8b3811380b3327c3128db4b6695a6b4a572af57ce3e5e9af156f3c384becabb58717849f493aca027b6f69d6062ccdb3a2fb8230770b229b0ad7098273521675654dc773ff906463e1f3ad49bcb6a418f4d5fac59377fcb804e3961475b38a25e3763c699eb40f33aee021e41d443f1017256cb851ca61b1370239f4b03a34ca4f37c74f6f6c22512debef1be3f4f9bad72f8afe5e15b43685b128d3572a72a4fc33d32aeda6083f2653c7929dd49b5b52c9a686c0d981cd7ad501f137cb66af04bd05188d937c4d6fc0444e119a50f07721a297dd9eb1973d530f9b38715555d91c1eec6225c64b1f9093c903a0ba2b9723b644ce3d551a6ff5f9321ba199b3aae1fa76d478024308ddd8f13c8e177bd725efce52fe97dc5675c7b6916e8589d5e4ec332893e5182a539099c9401b7eb724ea77c823e92465de46d8506c47eba0855bd20f44b0481c4e5aac4dffeaa9e72c236b9021a4f3e40d87d7458be37200b9d53fff411464c3ca836fe28e228cc1ba779f1389f2e71054227bfbfdb43b609e097153ab9e6261468406b34c79688726a4aaa9d768dd5908f762792c833d95d8e194b2fad756aee5c37de5f4e2ed44170d1f80080a562e7a107f0ff741707efdcdcfc116f5d623aacd314b91438ca72f46a4000c0427eeff855d6531c8bd33cafbe7431778b7314519a30712901e0023b24aa992fdd04d537cb0d100761a09977b374209d78ee4a7167f8f36c0ccd7282fc96317f9a1ae0999a71b0291b4fb3cd9bd5f6ed6e78d25f3532394cd167135732b24157d0ac1fc33576ad1823ae1d194a204ded34dfe469ffebe7dc990b72482e9be7351717592fe2f2bec5ecdc91129927b221ad24011c6d11bf3a35f3727f9343726101841a1897aec82d3cd3b08cb95ff74115b202b036373a72416b72c16e4ffdb612a659ceaf00c477078be9cb4a744b45230b8e8269d23c2276ef488825fe04954d85fecee29d72ed7174f8369b7c7a92cd0a1146b8b01b292aa44556d3f4f0ebcd7c551de21462c37e2fb248a5944fee3b730b4bad7c98a095c6726b053c55a55939e08338025cfb41d2397c919aa9ca24e99aad7e262e04f307720ca07ff1216adfe9768c95ea2f31268b15e554968e0de7698d920e6b3c885a7289df3c060501d14822eba963db261b7ac90bc04b1153069580963acb0a7eaa35023bc710d5cf4b5795f6735fa0c8fe7b5b8c82a9b25b9902b2beae749c305a3f7350a85d3913d50cf277e3a0cb2b4c97abe7f6b751c7a541e20ae8b95c112f72a57aa2a793d96b7344fcfa8f2ae7dca3c77b0002489b2bc9986b08c93bf13f72fbccd659056a078da51fad2b3e9374fe1fbfb5fa2c1b5d929e806ff19c23ff30a34c17fb42fe2c9758b0b6b9ad11b63c70a906357b954568e1f67a86180c8b727a6d6153aa544e1f8825f67d8d3e34a5b2de4881bb8fa6120d3817eabbf8dd720012d82975f3343bb2214c138beb912ba8c823b945e89b87c3777f300ea40172b2f5c6e92d1f084e485fd7310408a7ddac1152e1ae7a2a1842121db65dfe8f7205f5bc346a35d3f8feb1f12bf63773417479f8d77b91b5d08ca33c5fc448726a9e874a18aca01384468788d1c76a375960707e27a96f414d56e75d301609c172cf73f8674b44fc19889d02764727b3f00b72b19cfb011821985bf5b6c404a87238b6b4f5b5aeec031af043e0ad241b75f2217d39e388c8194c81e1865707b166e8d3305ddaaba522984c2f16adc97a0e5b03803748f4407c6d4458d3ef4d4324fe24df2ab497000f70e0950c6d9d15bc9e6244e6114b7164d9f9785ee7003172b381284a9a047e78ff4f24700a96cbc204c4fd2551db3053e39ed9b40ae5f7721942dca9e69da31ee7b525010f1b05e574fa2bd0accc49c332fef85c4a62b934c23be43dc5d57d7616d315b8872fa25c565b42da8aac84419f89d8914099bc721e8aa67fa922570c8ebbcf32062db11e2564024707dcff5f9f1c442f7f4062729e5a2154d190d98bf30e60c9716905da3c6cd526b44d8424e17e26b20843704a8b8757130f18c89f533118a4894f0ad2df09c5bd5f8f9f6913a5e67d2b2ef215576dc32227618136e680c1088c5f14cff5cbc717a963fc387d8bb19e01e7fd7256d0695995ca54363328194a5f1650fa13b594ece69a133fa545bdafc26f93725a87ccf2f60072a8135b94f50bdd6bf525b2e584f2923b8ee8c2b583286d9928115e91e0bbc097e5c15853e39f1b07a5709db8d67e19d7ebe86feb74fdabcc65f0abdac0c18bf865851639950680a44a2dbafc3b82e5d901518734d81063c6728442089150aeeeb6e1fde66966456570bfea301cf9f231d4d9d85a7f50a9647248b26d930dc67bb301a4ee15db3c73bccc7c3430f5587bcf5544a7d3dc16994ad88ada2e1f86c08cd13aa9bf59740c3d53b56729137eaf274e3b211cbe09ef72c70d2e975a79bdc7ac33b65d913af0bad759097dc689509a6ec3eae7de87d6720484f7d3dff6671c4c34f8c154467c6ab82234556ca835507f9c01b29c624f498a2a1a4220128f9fb94e0aba663ae81f8538db88b9637a507d7e160ec07e0e0de58869281fc25e6d523bc095868f3e86902095dacbe62da72c5cfca8a4634067e7fd8c932fd65cad326f5054a5ca19e658cf16e8d389d2b67d0ed89a959d30727c804844cb0f7091d18f5a727cfc58207e3156a0edb3d7934fd1b040a3e74072545b77dbf3430ee883a713917c82a721773935ae3e4167b272c1c6b2a911e872e95804e3ee667c63c1cd44b7be371eb5206558f92eedc6362e793d5d6164d745fe1e6447a33636639c46db25865707ba137c57d2aa40931da57d603f5b2681728ed29c9e33fa0a20c2c7738974f4010262b29dd80a16d89c5b6f647bc740f44925be33d0fe2745f1f851d33354252f678c48a125ad6dfe6e415488c6cf5e5472a8eddabf37db4f3083766fe31072c68867122086d05f5f4a7ca181620ded5b20907cb6675e3923e9bc930cddbc38a35f1e5c45fddd75447d6887242b0c69ed72e2f5d57bf97f5ecb94ef2a99870963d7f2ed3d5c682cddb2e12075200b762072031eafae33b40b88fb871d2fb0c9599ea598beb4be4268991c47218488133e7299ee4f43ffb7f3c144c8b0984dfb74448696ac72f37b678aef102845c27b951c0ec031f25c192176b9262a2c81bb5adfbf52c461767e8a63d80a80b0d51491521214b845ca333059f174daeb9879952344dff8eeb7c35b3a1d4d426fbbc8b772a1ff091577f031413cb2f19e96d04dd4b53bea75723105746248ef6f91d80f4f2009ec370debad1fd2f646cd5dfb0c2c162ca8a92535b35bc526161d3643561fe3abd951a4f00fa8abb19ce7c8d9733b2629fb9ff8c7f5cc6037c70c228dc625606104e01f93c81e9bcdc07e2378a8d79bbba35e7a5fad47279932ca03e00472d36e66f55491c860b3a2b0ac3b8863dd453e2f62ebab7288f9ea395e7c165b72139c9b5c5da1ff9f3204bb05a9df069ff12a9908b752d3de38c17c865790ce6da43ce01beb565ab3d18c6220d2c433552f431e536158f4bc38cc4d6dca18d172c1475db6dd16ba788373bb0193094208bf5de4da76d68026448fe1625325ca72d511aed2f0c5c58918cc0207106858a804de142eca9883504449c950479e7f725903aaa55c5fc3ce0e77e9be43de16f636e9e3352aa9c0f3f3cfecaf95b159724faecff96b575143ab2c42489f3c34daf215b85d64f8bc41ff4ddf065c605872ede24be716bf588fa2b8c04162baeda5e2d204efd5b838842507b7b06f68e4721eaf34be7b1f657ceebd981622df84d536ea6f4838b3643b40304664673ec64fb9174f38547d2481e3e851f9b3cedf71310a9832d1cadb9c63cb8c81516eee72fda00b7bda35301844c0c026a166ef8716608e57bd04013e7a8aa93b23c70272bf2c145d66851d25783ae26da22fe9a756d79ac42c82fb0df0e150c1f9ee8d72b219046c462b1abe8a2ac1773efe1134b6c6cba637a6cfe5359c5d853777d139a662a4c19d014d515f00d024609ba54b1e1ec845cb414824dfd3aee1381eac65cbed7d0768f94e1024796397f2fec000e18deaba42e7e27f62fdc0213fcb15720214a51a1ae0e3aa0ef5d723b01d63b8cea2324549b1cf15336d331a9cfb2c727504947db5aaa1af52a6fa1225b9e2031b48fe5267a4407d07874b5b1471504d495f51d6ee6c87624672f8ff8d10fdc20ff538b518fee6286e460dfe861eeb72d31fad3edae3bbffd723153935b054a709f3cd48f9400d7ca9458beb67acd544406ffae187de4e17480994c97775a2ff137834282a250104254076bcf502084c35c24b223f69b2d510829c852a09facc27da5cb47fa027eb2f358b66e389085df181ffdd4a957382ebce4a10c2a2f272aab7f451ad89e9fb12a8823267d6eb62662caf594ab3ab196c7d6c8c757491b41f278619c3fa0bb3badd91f58be36a2efef3dad05317dc01852b04209d4420b5c2a6161b94a9ee5e6f55cafc79660572e02f2d41358004c75f56448bd7016c87a590d2bee38b2cf4d7c302c2c9430972ab03d07a8098b16c046d04c14cc80e5b59e16ffd870a55277a074840aa28c9727f6e77997f2617005616d79c2dd03e7019078917d5e0e5d2e638ea3d214a391670c4512818a4cb8040dfc25fd0264fac6abed2f131ccee0ad7f8caa26957d6498a3f23015ef4da19e915dce6e40f0de5be101857a843d6d60dcd2a12e1dad659c4ac3ae494e382a73b2b3c8cec58e0f35f768521ee89ee39f155ffd74ceb50262bc86dfc3b00e3bfcbca32694d20e1f4167959206e12864921c76f8ad7f46272397428bf84beb8b86e4417086fa2905a744bcfc9d9d32a3c9b9eb92dac9cfb283ac49f4dc172e8c1b05c6597dbe6afd9260d63317143d962e56023e343671b725f28a3a2a2d482b40a919b8271443a6089d28732b999e359ebdfb02024061e1c33f383a8fbf4bfc083885812c4761ced88489465792651b0fee9e208d0e04172abd728a5b9d4c75c221ad4aea8792384f6a6184c1027ab30e6b94322751adf724930aa77c8fccfd7f27d5dfa8bb2afa100d008864adf087165c40f7480614172304686e694796669a4f8a1195b96a7a55583c87c97bbdfd3f38679bf1430b8724a7f29fc23b36fb8ac4dc421bb848bdab1823d4003a3973d4ecae8894cdeb67222e70e36a3d5ab9be292b8c78878cf2b61210724d5cc1a2d8466e6526b7e325834635d6ef11a243c1af025164ea104051aff08fd713c1fd38c3c07d5c8e6bb1618c7638d7a58412fae59db6ee9dac6ff70f90b3ae6b5322153663ab5b724b7727e6c79cd9cdeb3e047c35bd3db80594567050d5e0974df7df04a1e474c17a35e8ba2708d7579bae959f0c0ad5c255132b0cd6701ae0453c097bea87d4dfb310ece09c086e2b1a375a79f6f181f16a2c35742e09edd7b003298e4b805d983a0725e825b36d027c6ac0aae07962dc20c9b39989bfab054fab17139d05ce14e3363c20367883626231f7e602d5c7bf8afbe07a0b8c90854e6f6ec3d8afea616340267e3b757d0facd4b70131233232e91a74a8f93539bc7dbd66ee49bd2c85946661b3a1b6b1b2229e223d59ec7eb742e9c68abad97a7c1b968e7e7b555dd42b56c8ff9d7803ef77b1368e798a984babd1bbe488366f5a8bc1cea0b687b84fef77224dabf4fafa99fa0a53b95e5bc5d804fc80b237b1b941a70921fae76a4e10e6468fef9e04e46ca16c00087aa356aa90cb0dab4bc7ccddeb1af7744d461a8b672ee3321a71f62bfe3cdd21d32f185ba5c2701f9efb32f28063c42925751ea8f3f3d6a4469f94e004cf2b21738bb206f410529a846d6765adf4a22a9179774e245e242d13c2be27c631410a16e754ac18699b6fc8530ce72967bb14327ab286372b65d740ce8d25d5fdd2c4030ce7d20d67d945fb8558149ece75006274e5adf72d078522e81a2623aaacd45a5eced756ea6c0aef163871e514686ab742c000d726eb2dd6a127a3f5aafa8e0ce6ed49d3aa96526eaaf619f940824a341c5c445072fc345ca71f77a2fe313e11f281419136b764fa5130825b2c5109dfe3fe3891a71a181a7a05ea1cd6c098edba4d1b049fd5626eddb35f0d8214424d9ed6c0f7202ec32519a49c9cb435f7a80986b65469f8b5b8c2cb21d00ba499de6160b3d1ff5c4b94dd917da88fef2a11492da8c9ec1020debb4b74f0ff920f62f99705f726c6b74b97b617de69d4330e72f3859f0250b81c6dfb45eec737769cc2af88956d1205523a954ccff10e5c6455c3ac53da19e2ee5ea05418b4aaa9d87014b9e723074c30e5dc326977f3351c88dd3d5c930bdb9cc592a08bc3267d255dba18172809c96b83b88feeb86619abd15fbe4f33d8bcc68b0ae41977513151d6237b1720230507aa59e4535ca1c433dca37d7aff430e545659a5ed458f33efc8f8e4c342ff8e0e8dd8cf19503d7127ca1c011231fe9945c86ce702463f15641f066e26d10e74173f9d374e9f20d268211487113568170772205d2ee9eaae88671a52972411d5910c7e2ba4f5689d9dc76a43c33bd3e542d8c72db08b3b16e2cba009e7212c800b0292f526b61ed350bcd531c5a61cdd462405a5438a214986298582472731ad982f9c8ea1e089ab33d7a105e824139261fc40468870a7a6a5b910f2c29fea513d73966e3b8ea3062af73f61199266f6683e0d7c99981a150b205d20f7223c194bfe90714cf529bd28f8086d387bfac2bea03cf625eff5129183443752b4b823f03fd1188fc5e92bb2bf2fa153a5ae95cddcd422d6008d5243762007b077897a27e2d0834c0a46ed0b5d090b51747696e30911fd88453eb002e1c0c892bb0a0e19864b7e604ea03578b5420b937cfde1b41fbfce4ed40f51d481a468e7238077637e010d4c4ab122a5b2d5736c9dbbf287dde274216d311f24586093572fabfa4f019ae4c2d7db60744d49deaf5f320d1abaddf0e11b2d1727385198e70fce6e6a9c7ff29cee07e39cd1efd20efef866e8064e745984133e39e26a71c0b8eb3ea21a89c2440ccfb44de8dd748962b0ebd3c942e82f65e05f076902e7572809e88fb1aabc5fd39afd427379bf132da8b887c8b53870c6d42f326f37e543ea86a21b9b8a6eae5ba1d0ed7f416f70eaf328b0166b03cbad0fc01a751bd0a729f1e3994795bbd0e251606a57aeea7a99de5f08bbc09a486767e28658091d4687a45f5d31c62a340e92f289f59ef8a16f84ba5e94f2bf12981bc1c6cb883af7283d9e25e31089b51af39b85f1e3c10d8dece04b7df8021d009dd47483928f07260acbc359dc8abe54699d8e4ab1dd208e164ae9685e141a567e3c08daa02b77215d7c8eaf12a791d5af5a3cc79de8b3e40e7348f1f35b7c8498cafd2d1320b720d84e6f38abb8248c5755a922d4423eb639303624a6ebc93d2ae7710c8e1ad5bf1e1fc55c543a2a6016c2f4c9e44ac1a11710ba2a9b0c41edf53adb33c08ae729891ac4483ae648942b14b8516d80968411068a3fb69808be7d2889da2a9633b2680006f5f8f35dc8b44a739c065b5d32d7ed78f3c75b6b5914888a6e6b89972baca4c4b04f48f9dc42f539d694bc72fe6adf4b855b4cc90e922d3967e17997230ce42ac72989c2e575cd5b69c1bc9541617964a919e80a2ac3f353f1541257225860231a656d71408184fea81e017b4c380bd9197c43ff2011f966d83c5f072b3091988a8e087a604c0837a32a03bc6d0050e521cca1b3cafcb90731dab417228c5df9760777edbfb20e134301e6e9965fb289c2a85a25552b2ecc0e0a1707271e61920650d1a0dbf7841363e67292cf2dfea06ee6fefc38aa53afc96d5ea72fd30514591efb45991000e0f9465a30fb90ec68b98026b0252aee1adc3ccd772734aa3f566bb3ca235634dc25ce78e2d119ffd6d44434641e6bac9170e97397207c67c577a6a56df0737b6d9a524e020c15a6943da192dfe32932ab26f3fab4d8d47cdc0c1e1ffcb22b348ac5f3156d4f6dc6ef8c0f349e834ed9a0a9ac44f2c1c51ac98fdd718ec79ec66172fdf2e67ebd6c505ac55d378e4219925725c8872dfacf149c3435a7199b6a62bdcd316da8c467e4e0e3167577388dc8199c61572ae4f01d8c2f8a98740d44d3a584c8ca4591efd905275e0ee2b9b98e61cf4f96d3da3e7c8a63687bb4c1edf636df23e91fc71c3ce7a2fe38416bb31a9744e3953cc7fac6c91199798906bb5b56dcc36d74472257afc0e41ccce2dccd5da16ba0474a453fe076a16e5afa6aee9a5f447bfc466be01127a4ae01f1039349a5d33723045539a87c7898d3f5cc15ba8f38c75a949010a2a7ee0e30eac3882f0673c72abff2479f600869e98d67cdf47d76e0735b8d41fc038999b93d5741a46e36b724eadcb569bcd5c4bdd50ca8db6790583317f6b36f3e67a5838718325dc8584723f7d2b5ef0a12a66ec11d3a2bc9c9383f34fc0a7ea360c5207e62b43997f446dff11934554b523de562aa3fb2751e70248ce16c85c31a61292c08f424c4c5872b41231a942d88989d66feb3c1070c3bb0005b4e5095d6269438d24a5723dfe72e1e2fbf7dd00a589be04414cb2b60f6d41a228aea9511ec261ea544a4e5aa14c609f2ca5551761c1ee4fe4bceea21a7e226349d74eff8c420d1de8a79c418e5b3692f948058d2d0caec220cd500244e259d9993e3b053fa9d7258bf396992872f716113ab2a5dbf6c7608e716c1d2f35d5d7de24bff3e9420c095370f384c8721676a8f252d20294e1ad468c6136b9cb872fe98f8588e9de476845997fa2236a6beaffb983b4dca1b2a928f44c354bc01e65cd1a34b4f58f400a407862338b5fd3fb1585f9648bf9f4040a3b6c73212896a748b58589de1a594613fe6852b92bca1eedbfd29e4fd9fdffe890ffda7ca471be5d0e07493df9e241eb68723a9e727282757fde6c9faffbac375feba511db1848bc824b333424189d79b5db0cba56f8d85c72a154e90579db7e6315143a4ff09aa0418227ef0f38375fbcfe28d03e8ad70198bed5c3d024a8c8f121d66431ae2e544d50bbdd3012541db70399152133ebfb0283771ada32cfb00401324ae7505095dd33915230eb4bd9ea96d69c72880e28dabe5208ce685b82ab6ce0e0170e25e2da97ff2a49f6aa37f6ee0d9537bc2f858eaeaa1acf4bfb6a8ddf08943cf7636cea95d131e09e71579d07c189724eef62f9c94cbbfc4766403d3b5fdfb07ac0969006012806c1ceda3a4e99ec72eb43d2e69babdf311760b775473598b45e7dd623dbee17ddc0ba99a32be72c7254060174044b9e943283133e326eda4b06600a692f8a4db67fb3f560ee1ef572ee97e15024640c66370970e999bbe09e2c3d5c154245be4fa6023a3cb2561072b96797ee106ed99bdd4ea0f6f7d55106fd6ad15605c35e165d1ce0838056e74a66a0280abf186eeeb1148d83f5c8a178b9523754505a35082cb70c95e92d4b0907e89be23def17d608b0ebedf89df7bf134db2a882cc327353f33df031010372139f9335914eaa548b63cc9cecd3d1eea88f9eb1d1dfbe28025b41a92554701992f6aca9ee6d3fb398eb36d95636fc72be095d731ff2f0d7a53c5bbe190fdd72692031a5147f61b8e1b1717207559ef397ac4e2901f30bbb8d76f341f263fb72b181452db6a7feedaa53d0db3596fbcb8dc600d2581d6d3d3783296c14acfe72f340a6db51d18c468eb97ced177958b7143b8ca652917073ed5d30a64ba2f130d0cb06a62998d8b015862f6064aaca062cc3b84cbb1e1b499500d6138c4cc42a7551534f74cabe3b68fea2cbdc6035cd671e475803a88a42c6991ba27ac30e72c7482b003febe8be6db0fe0964a949a18639c0dd30b0061b5dfd7bc6b2ce34726748981a30500603dc04b2ca64fa91ef4fdfea170aff48507ec9d63ca811a45c4d2013af2cc2adb0fc7d234d3bc48bd7b4b823401b62db51b6d401e742711d72f11224f2a0e7468faafbcd1a10301ec7e68785265ed6e928dde68ad05e6e617214e0907d854a92fb476493e5ae75706284fe793c7b9abcbd16b4daa8c0a68369be6b1da8a8c4b343d5acc7116b456aeac5f35b2cbf9e3477f6cab9c3b6bf49728ac76725fe392dca164797b176531d5b889838e32c49d3b1cefd4e8494f15872298ada7fa5fcf547988b8e6d6351820b7b390fc0ed1b7caafcfc7d342d1df5727ae55b194d6a130162279ddce9befd0dc192a51c58dc73a83288e758e573b0723f9138905a2eb44c6b9933354934167d9ac693be5a0b3df0d48bd45030e24c720b45a1a2ac964fe819917ffa70437f710d6bd69dbd8d90da5df5f1b00f5310724b17db433d3b9ae113d4e319514cdb25298e032f288bf582f6b79dcb68f5d34be9178a6617dd548239c54f04450c1b7cd74ff97a2e88afc9b2fe4c6b2ed60a43dc982b11088b60b0068e4b1fa0ba086ae7ec7bf8c3ad3606178a92245b48fa722e8158cf169ee94b1e939c2cd4714b8656214aa7fe295b1f0db7f01a5fef6503f33466706f9a54d2051062aca1670652cb48fca2df283eeb60116843a8f7367200369a00f2d78017a1c2a3ca94666c2e7530a26058867c725098dc40dd6f201e94c3aafdaae10302efb7d7a0c11617ce42d4d6e9e3e6911ea3c5fb4311ba5f1fe4fec9dc933341655dc8afa2695c888daafb64c02b8d16a3d8f1f1743e00f14092cb650800dcd075c7a1e6a6910f09b426991c1d6aa15e309d697b46d752047264e854f9b92e2d34ccc0d019d8db60bb497d3b749c91524bdb5dff84b617727250b51840308455ccedb2313b1650aaa415ffa2ec27c12010d24508d156f6ad720bdae52f4893ad6731ad5dd1e9365652efa148bc212be0531ef35e246f8258722572d80165c4b1e5f02563a344e058291d1e57d54de3edaf2c1da4f2b702d572741d3a5f982f538fba10bf0bbcad7cb283eec6375cc5a142b9033b17b987ac72a71b13b21a27fe343c7249339d82ecd270dbc7ebab0648fb08945a312f63b072ac3d16e5b7058433b624510873e9020583925e66656ea4f6264b6f6a6e129405841dbacb36e9a3ea99792137fbae02b8fcd55fc7bf3b1bee8375d4cc4ce2ed72fcff87f903770e53b5073eb56c0e1a3dd289b2881cc0e0c9ef73ca6b025a785561cb40d42018647e573fe5063b1a631166eef44393b1ff87f5ea5b2505aee7726c3ad8e0751ceb1c1102a829fe18376fe1599c936a58ed939ca7fc0cb9f467585e594a3022b341fc217af72f8cb0be6cdad983e9960806360087cd26069fd40db67d60b5e2483e0a9c479f3001efa93c87b7afa26ec293758029c79239c9a64a48d3fe60d6ead94389ca2255ded5580742caa566a29cba00697ebfd1f76d2472cde0788a881888070c408e613d5646632c0422ba8b6943c042c1e801e18a995342380f0c18639fa603fad98b0c1046881f6e420190ca7896e2874c727ec570035bda71cd0e4a8e9cc3aecc659edf03a474233d8a9bcdce920e2bceeda14b5a72c2f1b465c4b2bae891ab11601d158f1eca5abce00ea8b3f153b8ffe00532bc72ce45b0c118bbdfa24c19a8c3a13442768e3a9540d6950e4019a8332bee6a317251670ffab978afe466d12533eb1b2ebaf65a95301461fe969fdf6f0c9f8be572b377f7627fca97ab9c5f47410b4923504133a6660e4316fc2c6c591f1656664ce33b1b79304b9e7f56e0d5c5ce2080e57a4d3290dc435698c1fbfb39cbe2db4d8b0f4b814e265506531ee0830689139b13e003c5a691e54d0edd667c8fccd31d35112b7cb10bdafe1c512d8b7a5134c6e1113710f56a6f16953dd40913f2c072e4a80ca938d425a3cde7b9aa307064e383744a54830216e87264adbb894fe058f6e10ef940c8e599946053b29ef7543eca6323513a815a83a83ca57037ca130647aebed529d380fdaaeea06e1108846d39539674e36619e132acf6a4f51d75722b193221add90165e1aa332be800da81be7218dc5a698cebd9300c3e5cf89d53ed1a45ee087aea3c139d0d996a791c821b63b9b17ea71071f3e632f5e5bd9b722aa5cf085555e421d44889ac5ec1f8540caddd2618ef7bff8b758d7e48816e57adbc11ee335c908210b634d7482d2495733fe9bb3b89ceea8010c5e53214705b60d1827a106c0f483782d97d7ed52587e6117b0dba2af7fe8d6db8c564064c1a28820eacbf4f30dec793577eef3f906848904d6774f5c7c9550951e9e60b7e5d820394795257fea64a92cb79d266376b6ef1c600c425a57506f39a916588d3315cc2a8e65a6ee3952b15f139a8e90f3ee54cc9fb85af716ce4f400aa6af33c525fb0f55ed44dd14b13e1c8a0575c947092500bb40b54e45ad99a1a83ba4d4f3dec0ebaa780837b025f9db0c9c916101b7abdbd916a6e614585599aa24a30b86aa27456254d1928f63813d2c9bc96e7c747fe9aa4555e7417f1d41d18884f4a063373b6e34eaa805431fa315a10add6b34c5afd4c5b6f85454d36abe410eee42f9f628ea164ba636e0ebb7ed7ce788f0e8d7aa406fec43c9509ae0e4ea16a4972bd27c5e7eca65a66735d782a35834ce8e4114da1d47abad1aa5f25620b7ed672a761752a7d547ea36e896e2ed5d34a92937119eb2b2059cd86862a92bd5bc4489d91bf2e602896bb11ad46a98715c4e6448d363472b5c3448fdf393254124d72585d705d1c3379133f9f62ffe2095e0d977fecbc3673208eb061e3fa12fb205832313bb8503e0cbcdd45081f75738204b6551a07aa2f86dc49bf638a99e8334ab3bfe5dd54e9e408fb633c55372d6182245198b054196ba2ad28fb5528db1a0865ab1f6984e5db4a0c421df59ff4c6be6f792a115ca0d221bcf3f27a42e52d43efcbd12827e519f49a376f4ffcd59cfac80bd15e147b2f9c9d3dc84d9f816b59fa7ed6e6e4cad051e348df73177bdb64a368e3d7669f9da72d7ed5a445f851493b7214bad8650d1e341f39556c5661e3144e0a34ac6d57739f075edfb1af0072af66e76bbbd3b2f59192d7176364beec1d70a79e974c1a6ea34f4860ac403112c1ed6aeaac9f05ebf3138d34aed1094eff04b549a048f62f2f967386c9b96f5bebf9282577c11a551da3a48339433407bbb3f5df4f4a8a33253f5d325c3f0401c90aaba8cd0ea5f8736ba680f1d33cfdd8a2aa305acb831e315c361a86fbf372b4e2b89971613f1bc25074e39b4d1f3a0abfe2acb13309f345c6ab685b7653721e8359d1e2baf4ae14813b4e3a227a5f4a3def6fe7ca65f2aeef10aceafbd972e0005a451a7c3052e08a04c6d0514f3e7e54e060ffbd99642fe0fd7e7a259572c2b6f40596105c64f7355b1913bc37d8745daf4e68d42aafa875f6d0ecc5882ba965099162fb424304b7942da870d130a4b97b6c0dc3fc20b792a4936872cd6b1614f375e1c29b1429ad2193ef58b4a85a057f4578d4a6959f2b14c74d8f253ec7065a2f8e21efc2fffccc87b00eaa383e411f6901fa8278db6fa6a0e1ae6a0a392e840bcc4933dc5b693242e13089992d16c494bde0363a935f8da22b7ee972561fc50cff7de1a683c1ccba90d96f86aac76466e0cb0558331f224d991405722512f2ff8f9f460de7de53abd164e8bd886da57d5bc626328a65a24b49277a33085a0bee09695e4a513ce899d1bf92634db6d12a4a17230ff056b7a66f341f3ca6870e3745b48205077537f6d24a75328036dd0a783f2f27c4077dfdd5c3ba236773c221f7a9ca4ff8772566dfd871ba8569376d136ea244fee0c50c6d01142fd206ea3cfd63eb2b40657e7021225f8d020697aab95a3c21789caed87738a85e560be75bf2bf65ac3d7f343215b1f00ecd6ece839d009c5ace15ca033aabc572ae45c8c2c01c031e7a0fe5e8e8e620f745c898207dc5f307304ca5b92141507253d3a4c1c6b62f3b651e0aa5ca1d99294b40e377ce687ad7c4169e2cfd0846585a14ab6a451703268fa794325d001ec7804adc93ef1be1446f50bc9eaad7ab7241f65cf6a042935221b6a82fa76500a7c82729064ac269ec15b76014fd55c7721a3f9b48acfabb9b65e89ab4d358f1367d69bb051db5d4623695d444be2838370a00932d9fe8653db12bb50a8a55975bd69dd9a714e591cf804432ea87b06a265d4bf4b3272c8442c028e9cd384259a73777eca4b937fc769409db9221654b729d20663b7517677c314e9045e78e72fcf6998c08267692e804cecd117a8f1c727bbacc8b99880520700b0c6744b244e0c9b2a1c9b8300c59fea757a9f1781f56ff93e1d12c98e4b64d7677febea24df4517e5b48c3a0754d9770c9bba3fa2972525758859ba08b6552db038c75bfb2e170a244b9b88f73dcf83de76f2e38de204990d6aa381ce7de435515a79bf495046f92cdb2cfc1cdb46aa66e702deef65565f6d900099137cb942869d577a846420874ed931ac066f4f81bd46230c2e67291d8a8678921944774a44069c2628456b6091ee32920ec9fb3bf0708f1967f43e2cf2ccd0b755142ff659fd77050d477bb3b406952c467557e942a243cf6ff726b74fc939c901b3f92d1819da7a3970bda996bfabf8334735818675721f3ef72ce83555743ab97c53ab63264d64ed722270074bae43b401d05a4e9b4ffe09535e6bc30ebb8c374966fdb62012a2ff79078658fad90f1e2cb6c3c563c3b42bb72fc69024ef54439ebc346c39684002305249c8ca1388432f29955b4796266bf1e4c89ac2f64ef0387941e7422237783fe68d78be9b7440676f1467b5a6fde1a59dcd11b802695739a65603986258ff4980c147110621da3f210d4edf1609bba723441904bb47ca79e2291ad73d07ebc94cdd71d5ef3b09b44ab6bb2500c365a7280068949f72ca5e9d69d1d5d523e23e0ca758a779b7062dfb8ce8d2e7903b972986c2f008a47bf3a882965ec5d89bc2df8f5163544475857e674825605b13f727432ae470ec0c4173c4f36c8c3b5c46829842e9ba5d8bf6f34dc407359f363721694e333d3eb9a24ab218624b582f3428987022dfce70a6b4b169915463a0572267db40594966c96d4ba14eb8c7e18a24b78e6b04dbb65874a4e315e00470572a556f291b7e5495f9130222185ac92aff25dc65091a79aef537e957733c39a72699181fab4452ee419aadfd9b4a939970d0f5985f7ef7cea6efc4ecd4265f972512df8051698ecc69363bcc1d1a7e77a9db62f6bf365dc26ee40cc99dd8091729846874157a6aaabaefcc43bee6fff09734e24479165a1daaef603bde4cd5572f3a17914f3cfc253a14571cf27a883874d001c70611525631adf0afddc81363e229216a685eb936c182dd4b20ca2f361d12a4661635d1305a55e840877fcd158bd7b2b6bf78626fe9b3dea42ba464fa8f4a43715c512a2e39f72dcd69c1f5c7200f2bbe67928dd3932bdfeada35fd7bbb80fe41fcba9b074383d4c0989c97c72c2a7e5d37805ba9c326fd7a033e744100c9905b364ff8a86f1ea1f7e7c42f772b2fa5a1102359de32db2031f9148cc7fc32fd19ada004bf0116c665e3ab1115d1a65063df396b1d77e21b6e721bfe4c6ee9679a61b522c80d67955dade4bd7725bdce69b8d24758b3a9b4c9201dad196b57296abb29cfaaf34485fa1c12b7969850813ea19d14ae1cca6f894c838d3038680ff78f2986b6b17206f39a552d17292c40ba879e511dbe466b4920083b5dd3ecee967878be930871139937663f61a6e4d9831feb0565692fc9dd8b5abaf3db20d6bf087c8dd8e58b054094c137a004ffdbef218947ccce5ac106810a5008d76284b59dd729e7460e759b1963723722ff1b47e288d9c67531e5e9d9ce0eda9820b6122fb09948826410cfa0d22e3729b700b4db3f6da3c994de573315a45f0285ecfe164d8442821abd3ca12471d72ca3e8058333fb70be2948fae9befbcccab4ad3e2fb3b99fc832aabce9a67ef72ea892873a6757fe37e74e64f91e4c0f11721f8b295f5ee0b44ef0b47bee6614153ad39c9d38a1df2af2fb51b7837757ead7bb2b9ddf959fc8fba6e07f8a0bf724a52e3cc6f4366652f0ec1c3753108ae6acf9c7fecdb441e3b01ea376ed2dc6bb707f85ea04986fc90dea4d57d3da1d7d159439c43dbcee383c6d99206c5725e5415d548332226472741056dba769a865eb95822a24c79e36f33e924406b96720e2b469eb556f28629b0f03c7eea5e03296159e6f0730be1bf534448e71e6d72ce06a6f0f30b279318a3edc80e594713feb504127920ef9de64127a8a2623271b0b3f4b1cf20a79e620fd82da716f4de6be46f76a4dd592b18bde8631428f572d0a598b3e168208adb94bf51593c9902d43cbbf5f179f0d0b3dfdbe220807b082141902b2c399b95172bbccb6ecfde5a86e01e6f1eed272c75b675f810b88b72f56f4dadd8d900fbc322f603ac1ed52ccb824ae96338cadef4a6cf980bbcbc059675ae1f1ec3a869081b4d0d21def9cd1b0f7d22f901a1bd4fabc85a70b94b7229ccd17fbf84f858c69379c270df7dd4ebc49e29909bab97ebbe52d42a0d2f070319c92530f3265458ce399abeec5e1941834f4386784887be2b35055b949d7208a2871ec0f31177bc4c255d25b1a2303d01055f8785fcea1209a3046af5c5725fcf2e6462da7cdf83427bb45ea994ec55b53ad02472387a99bc8500b51b72725f8576373f92aa81472f915ba89d7531b202889bbab57bbc655e3ad9c0350e3a075de14c7d6b671024723a1159ce5c962bfdfffec58136a68a070985f87dc209b4755fdfef06d76546686d7b89d85c5fe1936c57e54bdd272f7a42981e802e727368feb41051e48790e0f3da5500a4138392c5acd2fc0ec3c73bfaa6f6f2927230ac48e7f3d8773ca338bf8a9c0d997b1071a3eba23d5bb092fc8fa2368d3272e1be0e886d1b3c95ecaeb44bb1a6afe9464a805c0dc8ac0a5fa170f09dfa2154b80b07093016ce40785092a36ee6ee74862c227faf3f85f0fbca4cad7414ba04f03c16b6325b4842e308c5b1b18852fe8964804758a945daf7c7e8545ae29c72d1b6d015b8ef38d9bd88fa43725e19f06960e27a18531ad028a63b896ebbda20fc9a06a3aa43a0ac2b018e7395e5608b88cfe357fca746838513120adc03d263bd7dcef941b3fd8aa7f757aa799c55ad5fd31c1c3d97516fbee0ddf9cd03451162744bd18b6f155c912863602003af96600d0620ccd951d9eb10632d821eaa72f49a68a878f3c949976b00dea3e8b20917a6b2e856eee4ae0f0f57ab3112cb50761c1ba7d56ab3c2dedf9c941975aab7ecaead89dcbd907f412b5fdb0a7f9a729f0e175c293845a1d63f4048440f1133368850bad5e160b4a827fda2c298f204c27b290e284af8837cc66c794db221fa9b4e59a28cbf9202d704bccdbf221f4c5fefe8f0e0c462926a0400789449e425a1f21d7180a487c8b01c82ddb660a4359d5dfc9f53fcd6be462c8b298968643b944072a8ee299fb9ec6f7fd615806e6e9505f0e6f66e19e8e0064f836096d82aab3bf57bca3555f04907fcc1de597157827112fa3ae6cc3a0ab1e7ddd8235f3892496a596aa1b98826ad91b345459d70f959fba3de3ce29ae187a7016b92c8f3a6fbe2e6295f634c91eb69ac681a2472f44cb340d38c201ff03b96d3f43ce0c61e75e95032c2c1094c169f00e50c6a6b421a56120e687302b828396faf9cc868f3027e92f3448574189348909a6b4a723a10c49ce64ecd660cbbdb54d76a55519ce762243f626de1d390b18b5a0ae272e862eb9be3e1eb161f3d84c6fb0f641f95d1ba8668bc78394262d006bc1b257291be0669aba497ece5dab749f68b642c83d1ed765d5e45385fdb8effed84757251eeea5eac8648fd8a97d2a9d9a63c6a6bc708b65a390dbeb2a33cc41779f721af23634b91b89faa49853cf32a1beba0078821361c8c2c9c4d305cddb91aff67e8f120d4258733d95eeffb778208ea08f4c9b0893ed1166d6a4daea561a28472127635a8afcf28037dca162353c4d325c22f4dcc30b28ae90e84d884d1817d7224c0ee05bc638d54b05a3024e6244a6b5f94e7783f1104e32a845a43df4f7f32d2cfa716d1cc4bf726cdf80c6e0e164dd2de202cbb527762d6dcf6d2c0ff722eb201e83a49fc68e283bb76c6d5c43903d1b8a78fc17fe6eb766119e722762636410928e07cde3c60f17c6829ae435184e8f34c8ac414163fba05dcf0bffad5691590128fbcc3a00f7a183b5e031e093b6b37571a1decb68ae334c2d65daa850ba296110f7f774d620ebe9248ee90b3b2332459dc80bd8f2dca2862b5344fd863a931c0bc8d6d4c2d32d193b918c7f247b37642c820a505bbdae63f4cd1315e6edd507a746b91d14430e4a0a3c167abb7ebd71f3a015602b27c3be51efb8cf93be0f87a83be40eb861d5a37185c45d97e4a09d703d02e30341d975f101382e0727f9c0ef874b41e2d58a5238a36b0d37f63bfff63abcbf4ecee8e7fe3019eb8401ca5cddf8c8e09d898209a39d8e61a309939630169b32dc14e4a6f6a5e20dc72bce71bbb0a9b520106f88ad586399f39400ee6e608d215562c487e708a1b0a41da933941d31dbe70d6393ed9040964ff8d943ec0df6a524d771f7c8d471a6a72d4b29fcbe1ff1070b285f214e477f2c58072516a3a0bf60a2fb4eaf79eb06e722dc1d43ecb8271e91d76fff745b96404c3bea176d0b43870fe350b22e2b17972f8dc5a76305d66508809336d415312dea502791f367bd7ddcd0ea8910d3c7f6cf2b4c53a850aa142f9fbf22a79be43fb0ab014a8d6ba7005e959a81e1f02bf726dfc7fb85d43448405a2432acdc42e416a65a35c8a16c56fb107ec2604873a3f3a28295aef873fbe24c80e79c38211814245f25b0a4b47f91b35c5dc40aaea7289a53ab3d35ffa3f55dfd70a8203a11857bef424094952d26fd364346388da3071457eae0cdf977f79b5bbf9cc3d0db63f6c509d90a81b94f1a67ff1d9d98572279252b801ba9829e80e3aa8ed2bbdb3a9f295dd97998c4c3da96b9a537c7172f84a1d1852a2058b8f01bd5a15fc6d33b8c6ede0e33180cd16dd1711011d8f4d141b656dc279dc9dc88a991bd307895dc856328953820c4d63a0c93ca8ebe1723ef723456172cac55e147391af19b2a601aad86db34782d46054bac591ad97621e83b8472dd975e40081027e7f83bd98e8d0c017e03a3b9f818e7434ef55135ae71477a1ac78a91f851071baacb175b82e2239c25a79da625e4a76f04225ae723991f78d679fe45318de8d3227f36e553e928fa6ae6a897df84e310b693fbc0039687abc8e1f46d35dd5937a317c434abec126352089b916cd64ed8d99728c7252f44c8bb062e422c8b00d15c1023079e0bbb6e87561e0f4af83bfbf6013383014bf608bbfe3f740b8390dcb62deba134d73173e3578848dabc5ffcdc6002172d95d3ee452b11af3fe0e78b52d82150e84043764529ba2fa03a0e93d08235b72f03857c3a9eb22267ffcc6cca49f49d46243e6a155561f408ba6f214be2f5572beb17d68b20e0f8dc2da19a5a8526087970a147999e99dbc34681f0ada8cd4728e2699e964088b16b837a78b29131ddf9017a42bc24077babf9984c03af06272198812b2ba6e4efcdaa557c3058edd3ee041bbb7f2141ae05f73105b0546b372c6213a9fa593cf9bea2706d092824dcdeac11f9d23c3b4e5422e5679ff5c2072ffc7fddcf2fcaeefd2f0738029043718c098ebd1aaf9727b21c5e38784f7d25c6d33fd7d966c690620cf676e57bd2ee37ffdfb9bf391a616d755a6bdea920772997d1c879bc611898e5207b70ef7d22b151ce5a379f13fe49788e5480367fa3af5dd391e50cc6983eca45c11b030a6e4f03d1417f0d551adddea63d61bf912725a7d35719bf7b0edaaf92e80e65e035ae50f1d7a7c28541ad0a1b7f4a9b64b724ca323e91d4eb673c617c3391861aeb5f6303ee86bd2b42479dde16a1c47df729eb4b22b087cfaa1bb310b8c681d69845efc50e066e5e98ee2645d26d72b2972db1981d17b6e8febf58fc471d46462063864eca9666cf126cfa3ac3c091c3e5eeb8199458f303852aafffec95b1fbd3d5bcc1b3632fd05f3fd8dbcc44a566c14285af3dfde8560404d4178d0adc5dc1576c6411a23f585e3c39f563a7636000fc4052878db562df145c9d2f41168e21ed5591fbd2ddadd4337376fc46dfd8327a7b64c0cd0795883bb739a59d2afea4ff1d189242164d25cfbdaca878a67b572090a760ab0cff7adfb1d293027b1539d891681624b8b2d8eb6a003d8dba6bd25b48ce53f114602357a366fe19102bbcb28ffba7a85de6087808701bf2a310e2e2a460d618896cda777fb067e8c733e8d9ff1f888a0534df3cb161475188062722fcb7e1fd27f041eead3299e8b0b0fdb3fceace3811f24c9ab6a7f3c9d89d90daec694492cb3f5aafbd70a5bd8d1622b338f20349fcbb7a40c284feee4feb272cbaafd7c2e8ccaee0e5e6dec1c2b55c0f49c72db370e7aa289a0184435458a72e4f1032e0f8ac247075cb44e0c17d640ed2b6a612c16c39ee5fb159f1bf5fc72263b00fb7c8958524e4eacad8806cf7a09d9ae868b61ba95869557b7f48aa80f7ec7d72d184ba6a8c2f378e31ebe2599ea707769c2ec9d84629a6da9c1046c012454436679a888eb24cad806b720f012e1735710ff48c5c131e21b2decc6be27ac0a17e010586407efe120b7ebd66cbe486a0ffa506fb15150c474bcbcd4c172942bb643f60434b80a3f6e4ff900ac44a0b11f5647e8d95628c59068cf8fff524183f15eb99810e6dd3e6f13dba213cb2703b7f0131bef7cf75164c59eceb1277532227169114559a031b57adba788adf2139d5c33102d36831c6510a77e5c72f5d6f02c8b600ec866ba1a57c509235c177b9fd91f7a147e3c451331b1c2c2724f262f93790db580303f9cc07bcd16857db221212b2fc5301df5d0aa338d7b72fd1c8f753efc8da5d5a2aff2042d9185de8099a51eb1ba2a780b2e04dfeafb32deb66e9c5f81b998039fd815e2462175976ffd59a8aa9200bf1d0878fa7f9e3e8ec1bb6d7f5786644db73104af296c5795201a307134004a90b44bfbafbd1228f92e9b366b98fdfda1183ba7cfe300daea8a858352fa5559069d0129e896de7282f1ed090bf1a8ab75f2f4082e7cc3c743602d18323f3563df1886bf7fabaa273c686e2c8ee77e7a3ccdc1bae6ef376f74125ddc001e0ad55659b664059a65729558a1853bc09d200ef41cc9086ab87c02008695c43c972d68be385d247d5f72e47785a25314e46b8a8d1595eba4267f90e16b97d9d292005442cade29d8c75d34d93e1138280d443617092432bd060628c0e67464f59d5c87544f51e760f00b100df3ca1ff2b88878416ee21d981d376351af9bb05633ce3c6f64d7acda2041ce564ac1df2a0cca16ee9c2664d3134050b692c7f8c5712fb04b70d9e6a71f20c81130de76369b79e0d98cef5197c54e329eb1c346e1bcca281460a3469e5c72884bdcefc8e16b4c8a0a97b6eea1e9776e62083e4b56523e6aa069f3f978a372df20e6f3eab1737ea647855b79076e784e3946c9493be8c85cd6fe2e64a250720256f295e8aee61805b43b547c0f14804e0aa11ad78254d42bc54d8e1a92e9722bb3b0822cf3165329e34d60d9ac2af2490cbe4367d619f44aebe64e2bc52831a52db28d52932131b6abc5c8714ce0c7d1137a494852fafe3f458f4c7499245d62135db829a653e6dae9823311d382ebabda1dff5cf5948bc960360db7a787248de3d2ca26a67dfa062b93d437c2f5fa71c688a51375b27237308180d987f372a19896e6dbe3912455114dd108435197c378237b36a5a0a6175bb0023408ad72f4a9510e735bed5ce1320e6b705ab5d9306ecd9a935e62dad769910b2a74a4720d2b9da7ace4f8fd188c7032c6f2b9f1b50c3a697ec6192fbe98716569748a6bf3e914722f58dddfd4a820d12fa9ef85edb18d074163f342f95b6fb806b58872b65d67214889284806411cd34fb11d1dc0991afc46b5f5307666f35432774072edf56421b14a0155403fda89b6d2fd903268dec22904b2f8dab6802bab0588725dc3ec248d97e6277d8d6989ec1204723500c4240f63ba45f258c95cb236b97268c5aac952447959209f40aff68b14c152e34ffffc6c25f99da57901191bf95a74bbb067fb356ffefcbf7d27bfedd983aac6790726f9a5bd6ccb495cb42f86722067a2744c556102d98838734742935ed55b8fd03a0485d02b293227b8fc4672a9a2710b699493f566d85f16a4ee8654cb626c386ff185ca00e51cd8e985f363aec3dca392e6bb4116742fb7b1a3fa7763a3eeaefcf6612b53d09edfc98455721d803498e3243843fbb87c62642519745f3688f1e1821cedf2b589ac2a5d2e6866e32de731582ecef5f2ca83345e4e68447fedf253c1759e70af456f5dacb672bf7af369061f65dbdf550d6f41e0c32e2c6a466bb62daa7dabf6581505c3ac7249680e1d4d78de4c527b510e8053c43c4b991c776d880fd1833df883e05cb372c7e61af2262a1403cc8ee8708218f22219e996c4cb237e2a3a31e13b9d92f872d230b901db4521982ec892a31075726664b7d89431014f29dc96dbffab16c67215ea9ffd1715456839436148aa1b5166a2ce7d5a5389d3027c071ac9b355147214ed06ae1d57b58843303de750e1f831d006b07b9ee96147bbe59d56c4d8187246761e999ca61e655807a6990999066a2165f5265abd9bde8a8a719fd02f3c7252c24539e7a934a927045f3cd70837e2e86ebcec7be959fef06a0f3279f5ef0e03cbe36707cc3679fdfc024c02ee210a4039a952714c9275ade176ab91da4d72d42871852a1034d67fc7ad68ee3c7095ca72cc0da217bed53306965cfb1fa9310a989a4720fd7934be7999020d41b213e2f125cb69dd28064ea4a1d0fc9b624b57a21641f7d643b2390e73486fcda1c6adc0f387d74b3c5c80323d7f116f2f72aa76efec1e12167249840e5a988521fa733f45b9f1f029736f13507c34d1927221cc96302779a3c3c726b7691625be2f5fc58c1834c72695b9f7e89883e9d67221dbd359108d0f2717a0bc6f85c1702025f2c4450716bbb7cd64fc123b02e641443d4885e84a635faae0c304165c32268ca91d10a49f46eedc807c45dffedb729915056cfd0c7257b531d8bc83e7b320815b7ba5633d27181f1ea4f6bd321b7264caa1110321632d48ddab5f716d8486e4da48257fc37b4b88568a6241d86d46d45c19e032647e76f30b62442357a4b05c9161f6a8591d6e4a74e4f7f17b95684960f7dabec9d7bb3eeb71f2ff96d05204c5b88d9b0d9d2ceee61a061184662516912282c650e8c35723aa4d89a0b44d4063bffddb50e87d1966fc05ae679c3409d8279cd9411364f8bc3313ccf40b8231cd290fba7c88342f945f77cf0151726441c58fd8105cb8ad9761da8a53af5ac27be88936cbee1e2fe3f8150455566aa6e6ab7b1c568f686ce0babbfc54e49fed8766c4e0fba7d79831921ab0b03b7224cf509baaa9d780cca1ab68e91312fcd2f6af778ed9040d6ee144463b899a63327c3fd4d577d771561f195b120f4eb4434da9d458879736f5fdca40538c0214115947a09cc2b00501841a576ac84e5eb71c3793ec0f7c9d95a6627d5a159372588ae6c46c58152220f6e0b4b6ea00980d34132e768e2b5ac306dbc437c355720839d2fdb49a828e1def70dd4246a8eb65f9227f404358fe0abe0effe7cda8635c919f3f4476b0c61be50eea8c2e8b7c30d4dbecc30687df93ee08642f0d607207725e0d59bc3bffdc8bd715047add1eedeaacfc79707ba83d8326783d933b72303642a3af52cdf7a574dac13f07949a6456cbfbfbc4db9e4f39f0b9913d7f6cf5ed633a6fb60c1d14775101232a6f61057de905f725cf7df2665b53012c6172ef507a6e9cb21947d48a908568b56f10abd27eaf1ff846eb7ad05f853f8f9e59e82b865e62d350b02fbfff52dc8679e856efe8f291fe874852a5d9717c9efc01ab17ea8eb5d10e8987813bb48cdcd8aa1e1ca44ad6059409b0156c66b425ab0f141c050a8c24c19f5ba98f90a22a96aa266c74a26a55ef2f5136e58573671e72be8414ea329eb71d8544af044c1c89fe8d2878588251433de99f2821359f806e7b68454a4eaf6ca227069fa88307e5a7a130defb1b1817ef69638b3c6ab34c47c47a060872377bf94e7e94acbd57a124712177a6060c51b05bde14434c0a7e6688704e63cc6a8714e6127b7032a8e4ddec84a8cbafdbf610023e2324ea504c7295227f6b390a1e460a69af7ca2631dd3c2ad38214194c210eed928faec0cd31e43b252f254cb05847daaf66ce38aa524baa613042734d10e7bb13a34bda1841c97d05b0fc8a2497d5abcb28e83d1bc074cfb434f7a37bdfb9ad4032a1d483c2e8112292cf030f2158b2d615297cc98f8806ebdd46ce2ceee19947a4b147b2b2066b3b47f8e63fabd8c73193fc77e0b0e9f1d14e807e2d3c89d5ada0610ddc2161a63f7dcb5bd83a396aedc64d8be3475fc41472511f9f234ea0bdfbb1c154e7276cba627d9337e45bcf453d77167461a7430ba8dc1f680a9e84377bbd827831c57f5ecbeaa13917182f09fe83c64f4f3a84ab8686752c3cae190f8f0ef64230e92215b9ae8527045e329f89cd7276606ef3035eaaaf01412f52e85697a111462362448291cf8701caae52693af551139a9a831601340e5202e05150b09d5c37202952aa656697ce2b72f07625861ce7a300298622df29ac8dfdf83e71a8bcf241eda292df5e8adfcbf7ca54ccf2d4bb670cc09ccab5f984e614264fadbd10072fa27fdb092e98987e388110b53ac6f538f8ac4cee213917253bebd6af2726772c825cbf3635114e3a8e591f5a0e1d02ce8babb3d3337b0723d1c1bde79bc305f0e3a50c137bea8f3fd7a6c17eda287e1e04e43050085c2b0a5684a8282fd7a72fb90fc97535478b9073cef8bed8449d2fa18036d4b1f9c6e41c9bd49cef11e72d0f335eacd762347d285875091451192329ef586d398b5b3b045a5d8eb97607288b9da6bbd2b06b7a898a96948d048611ff058abbb7b820b76ee81e4ab856e72bbcc1adaa9f862c4bbac0e7a176a47ed967dc733e2db7437f6f5a5cbb0470772bf6c611209a40a92ed0e086624dfd2f1666d54965ad0b61aad6142b2468e3e4f20a074f641538d74bd5a4ecfaffd3fce7df438bfb797bb94e25a029f399b06727600ec2362c2f8e1d5d5c1f0c74aac8bd46a138cd4df21743c79cc64c7de2d72e8d4b580b1367c3d759c123daa9caf77e2d8f1cf9dcb250f6e4af1652b6e5e36396d3d5db01f5f476c1318d7a97e5b591e4cd709cb412e13f241d353a795aa1f73893d53d9f7ad538544021b57189e33002d0ec54d37f57c716ed83d4cd5317293257517799ad152b42da428a6dbbee5a34442330143fc887c02b0e997901c7229c892f960d7d4a1764abea7927bf72a808c3774d263bd67664e9b139902987227343ba6611fccc82128127c91689e953ee6be1629737da5f1ddabdd448dcf7264c18eb95d711d4d4f71b6daeb765ecce9c60ba28b29f44f74e600ec1d52092598d43d2724d04a221c7ca0159104383da2de746a7006023b537260490fb0c672c06f872192eb4ed18cb93025b9a11fc23d907f7cafb9a7eeb9c1215b767feb33dbf23278b9aaa0025072151bccc1b84f6a4254818b8455709811d89ac5fb4e522cdc0e47d11d575cf3875ee6e0a1d837915380ebf1b7b8ba48df6fdac58d9772c28fd63193e4db5e0b7136512877137f83051a1f8f3e9ae07389000053ecc2724ceab3387cfaeb9437e461631c7aec2583d90c63e0b5b33531e0e32f39865670b63e0a670c34a1dcdcc052886b494fcec50931cc433049d2d282c64e195921728def7e60b1bb38312fcc0fa85e1b9e50ede1444713188e840d72ef110db7b6727c8a783611385c2cfd65c4769818ad877a50c75f06eb3f7a7b444a04f946177214d6eb9026e3f326154514145c1e7ed4ed31ce3ed9b2fde9b7c8675196f90e72eb453a764d01977c602d4d0dd3970214b59b48f4bd18057d867065b39da192725a7aca010fcce4c27b4bf931a7ed000930a0c57a3abf65687005d86620e40c72716b2fc54d367514df9f88159dcd302d2b41228ec0f71ad659ab56c65d1f69723318a1c9df0e27e8b649fd5bc7701e94f54438528e56cedeef2471f1c1b5f10a540a2b84007150f01788ca78ecbd9bddbd82145197b62c010198981de2f100725aeb480e6e0a6a863f0e495896a3220f4fb5b0e4de9861cdd93786920c9e25328853777047f8b17db92e432941efc55818f542b5974d1ced27b69e0c40af55728c1f20a798fe2f072669e90d48b9601f5784340d3d88aabd0568ce44977eaa4f31381ee09ce3ebfe226e7009be19905da2c42faff8b3c438d792a487c06981729feac8809c1e04b82dde68869b53ec52c10019f2127c3533b8a98775ebc2eb72d8e82de6e5b3c29632318469a89bd59f871c164f09f936f91528097c902ab448df926b0f5be65a56152b38ef3ac6f13d5bbe99a8d508987ab8996519272c022fc30b05dc128b0d78b48615edd05dfc599f575806395c8ff49bf7f55fc9c6927235d7a447504a80058b350df70a8f5c11b290f66008330b69075869a7488d1f002c9dee70251037aa899b36cdf89bfa92549169a93b1be2da50b10961f2eeb972b138d9ff26a10fd2a2ffda4a3ab34c55633e5243bf5af0127d45fa8459aa1b7231df22105ae3d57814372069f6a080218e1f5bb953028631782ec54e48f774727adcb84178e9b4e114d4d725bb8bcda7152d04d1f93c86179143a4c22e9e2a7206f2f05f54a1eb64f1682251e9ccd4087fd08fc2918462469a30c631366049727592c494e5bcdb21245cddf7de9b0a0b2fa7451080e7de9724a4ded677078b7296309c545901efd3d878f3533f8713869960b140a2feba1ae5e9d0db5378537209cc17516fa2b881afc960ba79cf0d21c591be9ce3fcb43c429c99a35068db72b251252b0b377144822e7b43bc99f44c6cadd501eda9b7de1b93a72cc6b682729b666e8f817cf16bd023719d42ce387380ac87d2362c4f330e4393d4e8ace372d93f0f6f3a60b204844160b33aa064551203d17d52eb759676b66b4c9ac5a272ffd7ba87a49293094b706c77b137fbb39bde5f51513d8fe98267b96aff8d011123f72b7871743f690ebad75d668a80f8a8903b9ece9eaa7f3f51b4f53c6e505e3a4a29ea6f959a90e8d2b35525627d75066bb5cb804273e2f11c9b396e979e53cb3a1ecbdf48bac967d5bd13c8f519f0fa71bf52921256aae09feb50f66dd772bb147844f187acba7500bd53340cc37248e98b95fff5a04f1797a9f2a2537072bb220695f4ff8d58afb7467960e8cd9a6b2e8c164e624129ce574f42d283c072813d284fee66ed9967ec06d266d24861416112491be50207d144d7ec67ecfd728db4c18d85292c6cb1bd3c77a39b5c81e2fbc2e534f43ccad2396b9109365972a9807c78a0213ebc085081ec358652a4ffe0e6f92cd03429a9127fcc8c2fc4728317122ec30d5977a989b93bcade56f9bb8ff3900cbd1fb20a09f3d2209e353c0ffa335064d866ffc23e5d7e696bcdc34fd77607d42b3f93b714fc7882ee776f736fdc8b66be03331ba4a872bcdfcff0a0cc53822f497dd3509e38a3d340f37285206ef2d8de9ed26d2e7e818766bdd0176f62aac9bf2f802939425ed7775c72f0197c9752f8bc6620a85801c895e3304408f87a2ba43ef14513a3b98f1adb4ccdb4c1021f5e2c46c3d53b32e3e44fa27293f885d6ceae98b993be05968de972d0edcaededeb1b57bcdf0fd1f1a20679ffe668a7db111062540b306e84ec0f65e54c7c649a4c716b6b9e522107f37185177d64b8a5bb172e6b8a06a3779d187233b8369a2a6102b1438305922f9c4888a85b7ed79794d89e600c4e62d64deb0c8d6a467db1aa0dd3405841d6980dbc98ea33ae8ef2d15e4513e730c1faccb87210b3be463b1b07a6ea2b88f7de107532f8a4b3b6ecd11b03a935c5c410a58d7214b8c331ea7b54684a800a934772ec45be5fb726c094c85536f7c15cf3042e12a3719cb25767f76ca4ea7d5c7db9c427036e6848055459b56fa6ef021de78b518b68c634ca0769799a9dcf3f327d43569523dff23001b36229716a7678b08072d51473ef5a3c0646d473b28d4b81bb946f2ca8f8e1ea353793eb59690d169572a0c012ced19cd4bca26e241f4a1a4c097fa9a16e503851c90471b64d49d77472270793d1188a1be316baeed5d412f86f925a8248e3540c527a9619e06061eb3ecb63343eb7f6b28a41091e6178220ed2f981b6509dbce58aaf6ba6d6159b31724c85e2740a563e980c657e46bc76b982f73e9d8dd2c5f34bc851829c8cbb3372706b37c14526cf4300482b3aaf8bc613c3bbe805285e952295e4fc143a802872943ff2a089f053014dbfb0656360157b7444f6b77815708276c1a365e69eba03a917a35fe1e85c24d1b16c2aaa52288107286852863109d34abab3e64b047c4f14d0521c0d87d75d40d58b10867a156060c14b9299c672a39187116312ae02019cb580274d54df6288c34ce38350fa5bde109bb3c213441e15ad4ab6aa736445aa337eeadf4b1e9dde3087b37be6257582babe33ffe1b1fff6cca05cf1f9ae72b2a78299851476697f4f56fe4e36da8685783dc954c9f001a56f716925def12df41935248c72b356a0f05c28f89c61a4a66995d04b1001c7a48c0a3e3258a76d63e13a5ce522870af41c72d7ba4c639e5821d5e20779202e4051ab08b55c3172ef7b7d73a9053b494eced42de77ae6ca1e581f8f3d7a52902239082173c9236cc56646923d558e73f7ade82516d90be6cae69b27676d3c935bd850a13632aa72a3b621c5111cec897f7a6ffcb7dde04bd1329b3a127167378c2b80b0830c5a72f9592652cc826a6b709798a6c2ce3f288d07de6c8ec813f657cbaf933c1a3b7248679e2d6c9ad5b8b4bb9a85168553078bcb4b7eb0ba8a7c4a617ef6c9f74072b7dbab0cbb6668e62048fd6f83ad87fa803a8d8935b3ca323f9a7ad32995f360b0e269207e3124653c4ca6400c993d4420622eccbec416e158b3512255fea47253a8fc56f7dbedd731a3b29e06fd307a66bee4bde9a51d10d4436f7404aa58475685a94640a110c547439d0ce7afed7d3f434bff9a87eef59d1297117b9d33723670f86ff9d508897a89c6c861184f3ebf8ea163581ae7465be28ae9176a5e4ec4a426d644a38b995b3c96acdca4c7d9a6387edd4df4c251fac85102f62a1d72511dd1582ef0a095db2491761e2d1b152ebf8ccab442f4896165a4cec2cada72badd3824e9851a61c94b153a4e76d8351f1fe90680043c752bbf2153495c3172ccdde16310ebffd7b237bb59fc779daee97b3e20540133a4aa7384e3618b6e4912e663e6805e58364e1f3a420e2640f297ce388815f06f0eaa3e7edb5b6f3c72803b8f97d426a09a5762bb64b21f4540cfc2613f875080bcf113e193b2339072166b88250b866edf632bed75d7e3e4c0c32768fbd6646e2bba1d1f18923586727fa5f29405aef9e6a18416a17d4c3a6fd5bc9ee19a4a220f6c8803ee93901f22d5e6fa378d02c8aaa4b75b333051000bec6706bda5795e43505339326e7eb63fc833540c75c2606d4768bbd480b3f1971159e1114cabe632a183d66c5626f103667929b055b9320924e748cdd97b9c21d5a7ecb82cac8dbcaebf521681803d7259368a004f053a9ea380b412dc1acb24ccdd9d6c7dae2071eb59d00555af527220d2afdc1a04c58c311132dc6c2fa93a89c8687cb76c0d53e5659afeb2df3c39c3a79578c93d50b755967b879e1ec19f4ff86d1c438edd3b780e1e9b4f017c023e011c209511df601b7d379b74d819d5264680200a09ea8bbf6bd8b92c1c3e72706e3572de2ddd183f33a8299c1de72bf2769fa9a9836a913554072633b1a172b48dfb61d70419b07517cb6d8f3c7f42e2f808de61a6db1486cc88000b1a270d9807644876a53d9cbf558cf8ada377bae16b81138ae1344642e87801c333b802ea05ec2f9c6aad6b0c29fa1101841d8a68672e9e47632651d479bde033e549360b968436362503bd0468458d4548388ef515e1d62846a51f86ac532b649aa3572a08ddf9106a1ab4edfe3b43bf2f7d8d1f42e73671d2fe23293d48ce20cb6c663fa47c281ebb7bc199939b3eadf38cd1b88d4ab1ace13f314e7dee4be862e072238301bd3ffec1cdddec6caf1b165f2c6d5fe257dc2afa262376c1c39b8e5f2bb97c6e030df1c458dc7aded123c0143adcbe6e64bbab20669c7d8b9dbf93016ca16566eb4fef98101fd16576255c41244cf08063381af32a7ff4cb63cf4e2772e9d630a3ef93c578886548e80053946826186a252cacc11acafe2685f4ccbc72a133391ba64aa52724686d2d2e319268c8f5df11c25a6346a2e40ea891c81f3376c112f933b79f5a81f01c97729bbd05a0d6c315e73e8f1a36ead77cc53f3633c28a9af155cc4f5d4d12abcc1120f5589d99ffba30cec4174d5fed868299b872899325f84df0dcafde694e3b16b103f25e1a36afe2f793c3e5000f3c689c6f72d78eff552e5dca3cb6bc218d3f2fe2f3c7ef117ab10f69a655d951f4d5c5b65a0d225ba27326cf00252ffff19c0e13f60db447f43c57e408ba30f2ed8dce5b720f9e3184a053b841f23fe74b015f0906c641f7284965fff46dc6da23cf3ae131f39c406dfdeb690d207df3a82d68f673eef5aedb25563bcfb212bf16d9e30f06cf73c7b392068c9e335ec51e6fc0ea4c4a1cafaacb8a8fd22b0c2dd3d02e30722d47c80e00f2b4271a02d7ccd51d7082493a7dfae21b67cc1971df903969e672cc427f5afd8dcf4b232e223b325074d6c76c2c4262f9833831ee90b34765c755182a3d5cab9aad4a5a9d5b28e92bd2e5154d5506a74d17a2ec31dd5b3538a22f6f66efc15737508d097bb836abc1c598ba3b5a26f3406dab42ba9380feb50f3a17d8ca28fa4ce317642e6176c466842c134036d15e062a7e14d6f4293f1b2472dad48c7c09d5ca3220a305af1931d216fdf69495c28b34208e849753f41a4a72ff483015636778f1590422b783497539f619e37bb35b8af95a6d1151b1557d720d01ee690347d902b15c24337cd07362fc9175fc0e8af7d8d359507f239656063537b000b404832daacf9f52223411b7c5cd85e040e1983c1c20506b48ae82724c6cf329db983c215c055a0d79685d7825e1cee7a14002b57be819be2083167221599731ce1484378a080054b9744a8ecf9e16a56c803b76d0f1d9dc6e039a60c07dbe31a4761e33e8a41b4ee0677536cc5fc8c6ffabbcf58e7076ad82f2c34123b428bdb2f416e278d95474dac5049bc358614f05365d605162f371a6cb9972effe1104b2e87352af8a41805e0a227c556cdc2838d3187574d78bcf6e03fc729bfc0a800de7b915dae7a9f3d359536e631729f2e9454a35778a141d86661443f5b3bf4f402b6bd082fc83f897938a269795c80d4bfe342b46bedafe361bea725e99c8f2fa1d00c8a4e04a38edad9eab6267de459fd8635ce205bc92b2e488037d23559c007cc75be45e8cdab2c8a7d261a3ed32dbb47bd052466452d60d1c72b86379a3fe62051388567b339cff455a276e7d6ee5075af64bf527469a616049786070eef366f739e4787ac52429dea53a215362b0ffa72c94093df7f751a4000d3df81ea4114ae64f93011a12f52f8a876bd43ceddbc6304cd5d5d9a9360d48d17fbe8fc814b97ea1ddbbb4040bbafd486852760bd15c285206276c6f0764729ce8869d2403c188b4d42174a4e1061bbd10bdaa07082ee64fff0c5fdceddf72017c41bdfcd4f6249fec93b65ca7c16df5ae74b785702b1fced08b6275c2d3720f1869bd31760ce1070bcadba0d63e784d8392b50d58fe1623fb1f1168a51109fdda4f64fe875f1ae75e3cc847f38c5650d751be17c4d7ddf81dfa64909c9e08ace438acae3077aa42d17bb71f158579efd0cf95f9f7db79e3c73dcd85e27023c9f11a44e5d9d17f23b7db24e51cea9de52a571dc097d1d611bce41a94e66672054b00b76bdd9f794749de5d6234bd995800222aebf8272b60847bd4190bc852c12a3eec79cce9c1e5dcc61ac2b3b6102aaa261bd5c84152bbb132ea2e64fc564622f7792183b4fe11458488151def5b087d824f368a18802ee6223a2bda76596759423e20797e0c5d2442cdce175725cfd3363836f8e2271d6b3d0c4622c4726c42dc39f1565577bf99b8ed9f8a269d6c23e1b174bb5768795049d11e901d72f46a90f1faa4fdd1ac9229a6fc62a846cb407a173c643037f75776f8cc54e24e079728309cbcec6a2c2c94bc2db6f1b58a83e8e2eaf986a3b21c6ca14348df31d1f47911090f9a5cad687f1afd0300ad927b89799d0e2b5f621ecd74bf5d9645771da8eb42a6462914b2e2792ecc0358f7bd1dc4c9c12fb1ec87d5b834e30472e736470b3c2753f9f73bd2b4bbd2406faf19aecb0474869ec0966a4affc13572e99dc019a17f89cb5853f92fae0ac041829db1bff1901ae1949532d7247c3a5a29c6ac8307805f55f66febf28210f2f6196063f8e7d32fcbe4a23aab66043f5137d91844c7548a69c523db29c76f40a6e5ea71a7a26a7185cbd60670001c460aead27e4a11f0de74b6652ec0ccb079c459c53ad71d6f7a4fe786f7d99911b572dd7bc7429462ca01cfa5b331fa4af7e6ad787463d5fdf5406555d0f4321f7020d9847e1d9a4faa12eb32c08297668056cd20af424c6dae0b07b0e4bc24e1334cbffd3f11d948ef27ca33cadb3280c8364392394652a378371c3d129559f7b041af70b7cc30aa21aec0d6ce8bcc955f8887a952f6980622d4595f0c5a55e159723b4d6559bf6f98141741a8d707185ea416fb6bcc04a05d0a1847cf78d056183b428443df6a1b539bb9b1eaf0ea2a6dad5a4361e4fd024301703ad399f8f5227248f888828d0f9175298cfa2b265c69cb7b809d402ab11f3ed6212c24fccd2572c8e414a8993da435c641cc8027d2f9786353f15982dfd6cbc98fd18076885972f67c7e3ec28fdd232c0b34ae10ce126453a29f4d6f97696aa1c6945fd443bc72d8486291733e003d358841ae741efaab045f2e7b1c22789b40a3cf0c989b8c72feb645b5861ab9cd33c6fcf70ff05509b0d44fcb68bcddc7ac0895a4cd5e127286e586fa2599694c13f02c50dc3259a62b3a52592b942fc07a3ac31818292672294364f398958c6b313c769176c44fea9c42e982035442fe50ca479038a1bb53b2dab11df120b59ab23f5a20e3f90cb01553a92abe947da1190ef2b1046204029799f162c9e9b28957644897605d8b73b7eff73bbb875289c7d9d4b8d1b1856e30e0e1b1d4b070025f7ce9cabc613c6b49fd44f16f6120e71df433d0064d3572b24a2d020a4e92d5eb77461cb829a3abc3e58f53c36da273597b9670bf413172eb80bcdc1111b7d56751f25cf5164ffb65bc8a8aa4211a98c82199c486734f2632defae9840f38ffd9ddda0605b42c14d3807ed9dd4b764cdfea87e7024939727f34a6ae0d784b5c9b2fb92b76dc95c60c43894d80e876791b1f9aa70bb0c072557e41d7b878edbcd8d4ffb87347e6d3e30a4c2f8f3bfdb4a6563ab62f238a726fbdf2973cf8a8377500db30e37639417071e74476ed82894b87e30df398936804db3801975d70c6225b13774cbc1e265d39a23bdd39866cd1a4c99a4251c246f68fd10a005ec0f6a54d236ae592ff2d630ac0a481c639b853b488764d10474bd753f33ebf055e856b46c7c7201ed107409417bd4c2cd9c7493ce62444ea8f724cf5614d762566568ece39e03385d7046390b38e19e27b23cb5d8888b5bac2721afa2738bf86ee712bfce6e481c49acb29c50eb3da81f7ad389a1a07e68fc8727bad8552e022b4a645cd4725df5f27d6331f256b93208933afec74911ca1a372a8ddc668e756cdb026917a6b6672096f3a5ac5fc4bb9470183d8c3ff40f41155c8bdf1d1951a66052ee7853ace7accba79183922c3c3dd809eed4e44856aeb72eefb9bede73f747e5ab4ea0703cbb46977bfb2e7c896f9b1614a7bf569abde1382d3094640e49d17315283b177a8b1554af5199d74cdcd52155fc05acc535a7242350861273127357c52e4bb381782cd6e829451154c33ce5911e2bc6be00d72fc4875943def905d2142e276776d49b5d8566508af78494d1a47662f93949e42606d1d31041be81a8f52da476d2381033e1f856a23cbc22b6975d0a8906ad672dd273167eb101334a1cc47ab93c8b7db17479f509ae4cce4ea450c63a1ee3b7284629e8775afd2b2dbc68bd6167f33e2775091c0658ba8322067fad8fbac5272bfea75ad8218aece5025354fe9f72c8234ae116397ce080c281d387b288ac372db103cdff16da23fa15a2f1d737d2c9e429f2661ed54a4fed211f40d754cd27249e7950fbd3c34aa40d24c0b9bf5435524720c8c4235767243d5381b8c767872295e1f485f69174ddf1f81b8283081607d64c75ba3c5aaec52206a764de24e72fa1203ce8b9b271623c342acec6de5c66c965e8f9f6f1611ab608cdcca4ea451122f445c99fcce41eeda8f825ce895799fe7075ce78670ce11ad69ba98ff20729b4613884cad6d68e4c081241f5d7ce3cf3f29ae43d1095f8e9d2acfbead1753c5fe4b74900a8c77ba94d823be338d1824c0b269453b99a651952cbb1dd38b72c093de802e2ff351f5dcfbb6c218761e634cbf3398337399af57d6bbecda661b19a5f203c559a3a509771b96d55853c4eb08d492ea42bc3ed6dfb6c097ec530bf664898b5b32cf8e2138dd6dbadfed82aa65a0abd03e9b23c76b4ebba339bd72970e0d0ceb71f2c529ed91d5067d3b9fc0e78ebd91d1ac60e00c63a412a8e5729b8846c936718e3906f345d5c3f1aea89fc4f4bab5297e884be20ea3aac83f7269a5bf744c6b805c2aa5a5287af900cca645596377e2a9aff33c621b34846771a064041d0e455e8e4f7e14c5a671f9d2937a18b1eeeb656c53ef2f164c0f2a7212e7cf7e51b2d6816f5ebac08d2e8d681fcbbc372a20e169d54d51796aa79c129d38944cf3489ff352179d39b713e2c221baf14fe0c5baf785ec10bc5503f152428ed3e6c3e7ffbbc8cb883b3101e6f06640891406ecff39a8e0047c14243a729a4e9cf317d202018c8df01ec1fd7df5869022516ec0d54217efd915a9f8d072a5f1e8a093d3010b8eb68dd6b73530feb132c74e48314fe34597bce0a1148448ce2df6022f2378f7abbdae39ceafec662168c712cfbf12c020dd31a29e140e309da4e9af85045730fc063d9bbf502f65244f0f23cfce6b36da183974d9f6e15acc8664961e2e4756c4353992492c83db54b28911431c9730ab359bc32d72b672243641fe378e35d714286f36d1be1de9c9ab5c3a261e817f3faf419f14fa931f4ef08200b3c3a25bc0fe06750fbaa1d4a8bdff64a10a826f166e5e5a3ad12e72f808f4706fb6a178ff4b3a070bcc2ed0fdc7ed6f9b9ad4782c5a75aeccb0c57276b88d2ea5562a948dd6ade5c02510c36e072fbc9d87eccc9c693a2e465a1c72db6ae77293f116966647d8ee14aa0aec3f6e70727073540e30dab69baf6a9572e1bd6e67aff554a04e0ef02fa81bf701569569d275e987fc37b503a133975c2c7a57c1cc9c4136320ecce49473fd143eda54810f78a08f906a276523dd30c770fcabcf8d372c5b5b0cfaa3812d5db216a0538ad7c842cc6912cc04bf36b07f4945a83e5ef9970fc2e598ef25a8fcea251ea07c1c6a911ecf1ad6255e1e87a409109faa5965c9f2da232d84b3c33bec2558f8a1cd0b8a76b2fdab0b090d2e4216bfe4974423eb1eb4059c25cbfe6baf270006d21ec411319a7a0b17d89a329b62e1b6cb638c546581e9e3bdb535dc15b41f9567a648401877b7b7225c92151123ca19e2c0fe4f4ce4c1cb251814f130d42c2743a6fb2f15dc2e06be8dc0d7cf2a0ae8d30d89226603840fb4f0803bda88a6695737d6b54118178c08bf7b804172f55841a3c53267f04e64e3c63a9a558192b4dc3b2389d103374d41f01941682f88fbd8030203a77828d188bec622eee8f61e0c1c10f8620179ca55f84c940672e0a41e7b8b0fa1f6d35d405b5c923d57d747a9f494fd0644470a1b8fbde10272aa9fea3ae35b9e187e665316737a854aa53735d5b19f220076634b03d7a58b72012215568cc6ddecf5b94c00c7788fea75b18ee29b7ff4c538638a580327dc1b6c7b965fc4f3f053e5deb843d603938c73069ca6e664d00afe62f382c8516f72e4026f712fe490ad7dab82492008a676f4d065ee7604594f1da1bfafc2b60023fa1db27c661576e320dde24a2f6d13d4590c3e53784663d7507dc2920513585dbd92777340673444e2fef6d5a2bdbc2f8005557ec05e843851f849b253cfc23ff4a23eaec86d438f15d4fb84cf7596294b57e9ea6386d0cf89f2ee96e79b94726567f16199c6659311058bb760eddbaf84d42bf458d7f9a2af81b2b085f9fb7245f78ceb3e32d7b046948916c84de8bc1bab2b96e7d3fbeb11af05d07ec89c7233dac13fa20c62fbe9031a51f45cb1c85747d88d7ecd7284257466268863c8106553480adc1919a8950b92506fbcd3bb82202dc3a91a8c74cd70d78cd338f14a4d6084a354624d382618ea347d81d6edc4a12f65c7d049c26a1ae63b62b0cf2f7dfc2a016e64fa1e34a6673877c578697e28a574076f13f5a5772e74dddde263f39589e7bdec156f9151b09ef1c413c1d49b50d1d4cbc2b0a92c5adf392fae723d7d84e7dc4406061e2fd9be043f7aeb733bca49ab5420a98404b547fa66764a4481cfc6c003191c5828aae266ad34681cf491fecd7c78d309ec757b9206ec721179416566eaeb3f1a70d0462f5d45c10b263feb3a7692da6cd3d777744ce13ae0b0b21dff48c3e3301bcfa90666af1eb6b2ce558eaa69930a963dfa07db484015954e35382af49a2fc15a6a841c306cf64e837c282c6b699cccf8751e58fe2a12bf8d8cd532a16da686d4bac0c6ed1c2d4f7b7f09055c1d02196fc8a45b5c72211c470fd4a826dcf595eaf4fdb2abe548d64f24c9f86d0018fd2d41ddcbb0501ce8d17815fc99ed29adc6983ea5f29a99492d2cc3f421eb4b69999484d51f57a1c442fe2f1c6b2ad82098d87495abe388e9e58fb57d7f778ea8610c4946fd587fc6a66adb8764dfe9a497b5e34d6bc32da8f96800d75b3fca87c7624bd5d072c3cfd4dbf5ebd875dbc58168c5a0801fa0691b925af6b30475d64a29b8fbed72abed18106f8ed82d08f3c090c05c6b492e28c2a7641e6a2d3997df4ee7ed4135fb376934c33b5b30916c8fd785d3b9ccd7a4e5523843b72acaab5eca70abb5721c41eef68e58bf6b69b1d275a6442494d98b9cd195f1bbc2eba70dea05a7e50745861af3223f22091e31d027447d2ed2422a30dcb71a864cfa161707b091d772167452c8f76189925beb22f0f7db8728a456c4319c1f0e1f7fc51474f3f8d807339572d0f53477f5ab333701800a561c2a9e1ef46068fca0c5d40010bfc9d0729f192554f9e7ba1a07d05b498b7dbef6453c6ce7eefaca86cc0ce0a8a11eb5408aa4ea08804eb68fa760615fefdf718750beeb68a2535175f720cfd46f554922195e3c435529aa8b970478e635cb3e8751fb037f039dc253a5b7fd2b2389c15a588c2ba60504840d6681a925b8754c35fbb7b06824acf6ad8d02fce17a424a72d81b50a3b70e67e0cc1c0410b803f655dbb3c4de7ec96bf57bc3551ceca900222e5c42ef5b73358400bf1f536712f063a1894112980456ab3c1ce9bb754aba72cbd4522c46507281448ee8b7702cf2a78122e26ca4c013effaf6f2253748d72f70eacf9c5076f9e4e1c687b853e6a93aa361b2ceb49298050de427af8f425772aa6957d09dc6d6c46154b0fe351e3daa4104460d41991fc5fd87df2456d6e87296da62086be4f739715ccd45a2056053ef2881c4c5344f2c05c4b8c86df2e072fb385ea6b7f6a2de65cf8a33d7779b80fbda8b92e8374ea5775829a65d0c0a725571b6272ca5f215c83e47eec66129a3b7ad67ef15e0a30a8b97bab3caa5c801732ec32fbf1b72aeb4a4d1ec8edc43ca014fe8ee5e0377d366f7e10249229a5d83053a4d60834e15ba87bb7ee26d649e8679b00a138704c28442023e1148bf72d8c52de42f320b341c377a139f7b1c26bb92236ada2eeeb612e5df0d5618434027835f364ad3931f699a4851e6e1936b4e1e5e5f27e0c00d06d92ed440c9c6108ee7910345f97e1b5cc63648b3416664bb7e0a6920d30c55ed555ce239beae41f76fc21f609d78583b131788edc6a4ea45b1b8049dd72614b7c6c17b4d357972b52f2ca13e262af1ad6f8bea337e7d4a23d30a04d3e6fc4176bd9d3adff2aa312938298baaba41706fb6ea1fd2afd76d92d198580aa8acce4b409b9ee5fbf07214abe34195d335c16ae3e1c6d428f451fe42e2becf111e05115c25c4e4b3d9728de6b5c4fb80cfdaff23f6a07c50040b443edb5e0d8a6dd95bae02a6e15f635e549e8a8812f47aa3173f13e26fa06572a22b3b50fdb27c08c419a237d58baf7277d089be3c3c74609eeb5e8d754ade7d4b23f06b039329119bed7afd79231447cb692f53642854acfbf5be8e8157737129253b5d20f93b45da9b6dafbcc80f2961743ca1aa564749a215294ff53f55a6769da6355571b75ca9eb1f57da3e085027fdadba71a57a312fd983772e07b8cc745a49073c7ad9b0ac0014af71c49061fa86892c12444b119b1a2d03507aed642babf37e5ac9eb28dfbf22d650e8857205722e53092d556acbcb7eec3c172e9e4a985d0e45ece6c38bca021805f45e155856c690ad7b620be78f959647c6b8c640794cb9a22c25a8abe545a13866f63113b4cfaacef50e249973538d9f342ce98b66c1c0d6ec26b4fa7fa684185096510e9db1190b663c96fc5bf4d1d4c0448729adfea68179c4fd6e65df5804344a72969c536b46e8152a6798ea2c6ef56f94f1804d85d9ff4f7f1860a021ae11ee05134200e3f3410e7cf804260f15109649b376368e7250164fa697e601f897ad72fd9d77edce2ad36c5d061837eb958fe3bba5ba677dcf53eb5c2b2f693173bf72abcfb428839d43d4e4c0815d27edc8d77f66170f27800c7e8f985ab7f3468572d0d01cf077f92a4294c099b603b63cc3abbea18cc5f7456f4fce71488569b92585d22152ad221007cf2356229e393a83150acf90d26e35f3750a2f51191ae30f44254fdcda4e2ce1829aacac076a4fb2633951ee11ab32b3f9a809871a5582728bcd15054e9b243037907480f0ecc4dc417ed61dc240becfa5c188e4f119e4469c9a81888b368e80a04c5314399a8988160f1f400c64eccc0a343ed737938701622bec649e568961ca192939b87d10117aa97eaccc94ef3a7979380dcaa120569ca06975da51536b181dc35cb68c30c090f7ef2078c2fe0212ea720a21b00a724a12962ec0b9b4454e78d8a7ec328eaac8915682a95c862ac4d70e44edc0fa72e46335d4a10b824ee8c2a0b5c037ecd9a62000298bee8debe59b0e2ae3282372e1c764eb884eeaa86f3212f68207bb1013bc774aa88209930e533808c95ab07264eb900f733c576f76029dcc518bb78e0ed1d239527c226453627df97698f9727cd08aa83345cce9b0b8540a1e362bb4c8b31aeb25887ed8fb7ff22af92e497235b5587102ca69404a3623ac7ce85a802fbac8fa3da92bebc9f3f304fccff372ffd4074410bef7091f51ec0a8faee2f587a308034b69079dfc12b883c63f7e7288250802e3dd9feaefc55ff4b37eafd0bfd8591bcebbf0100eca941d9a74f8007fb2fd472309eb488c4d7c4ebeb5edc5cf2f24f7a4513f87c9e2120f54bb113805ac8e23c695a93d0892fca98fb65759a01df1db6fb7f53e574cafa8b1b12e72a35a0e67f75bda44044504e41c0f6f6cb77a03fd12761a7d54441c309f93927212ca45e54b7769a7946aa34cdf819a1bfd7530abdc662340195a861813b1f70fb0fc1597b53a9da3a8addcf231fab399240bc37707e4152e40305b4d6058ee728ad546099e70dd68ff0a2016a5726b7304011c7708e1ce40b1ce8cd152bf3c72f940e6b85b2971ecdfcbba485759dff6ab51ba5341fd684ec6bb8deffab742097560c7fab6c57d42f66027fc031062ca388d653e4335ec4bdcde322cf4f748620631ad7deb0426b868a099a8a57c3e24925506fdcb6065a54cc31f856c4ae872a0ee420acd2e7a85bfce496724b1dca19f5d2c7623bbc120e425745d3e75aa72666bac82768588da5d8bee788e7cfe58d6d05d5967f4c53e5b5671c32112ff72f169c72f051c8a41d4866154a15773b9b2be853e57941e37c6c5d817f2e18d48f6714e58f87de19b5369cf5d29f21c956ff67aecaee552c9ce986e3ee851093eba2349db456c54eb65beb3ecc1d333970d6b5bcae84a89519add56e6755d7a3200dad3705e68e67286b7a7cebf06b281e41fafb74112f389776fa4a7920fa1729a744edd179c9f0d30ed4611050f77055ef223b3c459e6b61e4d984b757a7b6dcd81f649166a4c20726e09ab4ea12952e41225780f5aa1f1b522f75176a25506401ec8a8c376861e720035b859d12968a69a44f22c60bc440cacc59860f5ad72f6c9e6d3249c001dc81d124acfdcb150d170aab7352d3a632120cb3c4da9d972ba7f75350d7c3af693ef2944512553596400fab6fba62d5677e7752ac4ce49726ba4d9f4239806ddc2bfb1d325b6db2acbb90ba598d7a1d4e0b80691c5ef1671286fd4b4f24a6b0f95a3cdccb5dea1d6a3bbcbbbd77495cbb4c152cde7d8c372507783164813423d66d5a882f2e2194502179ea6af8f89b7df326549437e3c3ca6f708e2452997be1b9ba785e987c404bcfdd699e96e98b7d5aca5347fee9e727d75c712ac4aaaa33061c5caf9c2a5c31be705f397a298353909fa9bba82db7227eca0374eb00bb7d958624909333819f3c7f93f2546dfa2486733575415f772638ae00100e996c796f9ab6ab4b5b5680c174d6a55539b54121cf098d286dc2de4fc9087594689cd0070eb6e94c4ac0c4c0245ed39ea95911f2c378ef091d65d553e9e022af009bf6fc377fa49d6392f53f7e63830c7dbca5374e624836dec724f6d77cd43faf246834b91d76163d86192e8010cc21cfe558e69f5b1bd04cf72f8695249ac7c26ebb493c77df0b8a1d295a503a9c04237f126f22c1fd9215472388815d9ee350b4f0e4996e004e06a474ae348415d7dc5b6a97bae686d237f4134c9e62b5ef410d3e8f64422d2f51d9f0ef832b4d3c198bc5791424ca0248b7255ab7a59abef63847c0769b78909870334f68a762f3f8e6d417028dc8445595960c292f5eea0d9c652d61f38bb3364e972c3d946dfa100e8f59cdf98323a0d19301b679fd2096d5577a626b167668fb8632ab709574a8b98151d055d66651f10239649757773cd2b4423738ec6929326e451e4db92485fd86efca2d5a2fde91b793da324200244b7b544fa1659d3969b10cf80988e36584d514727de2442027231f0e6e5913f272385864b45fd47b1d2dd30c7d050bbbd91e3526cbd86f1ad72a9867bda1acc3b13482b3d67ea31a1b2917555133b1a7e73c40bd995f88e89721703dd410ad3acef2c7c2561c1deaae4418922fc4a64a18e02283b838280ae415b6066d55c44b99609bbc7389409e432c62ec06242a0aa1fb6e74066ffc8267267ff0fd6d15b5f6271824ba6daf54401d4fb6e486b7b7d4889973094c51ca84ac781b04aa953f4b469bc8e3b75d3faaecf82e7b082af0e662112500a85c746725592872b15f4b55c975498292de10278a50ee90e8184444d27517073daa9a472409094ab7f448142bd7cc9c953d10fffa92cb5fa5186b307029d5eae6e75cc5d63a52d20d779537f49e78678359fa5b9d850433058020130ece64e54be006c4a8ffe5723d326831c94150d93097cc3234e53877aae5899bd65d648ca113b7746cba1da844042adcd539732f8affe382fbe82ce9702cfb72cca55416a136b06680dbd1af6b33596e26fee0216ddd34c47390a7a8040cef900febff7d9298b2b723333e9649262d53a4a4719fd58cb68e62643717ca2f1a1e6481807e0f52e8417c9a8e7709fad26b326b873a39a24ae6f0450d8e3c9fb69a0471171c87ffe3e726f0ca856c991f93ebc40958e41f064fe266b6bc03190412ae3e95bef80833172705e1b6a4e6f48246a47fa427ed4926824c55b7e6ad287a5775d44393d47537237395fa77a41901977d0a48027de9645c969fbc2144829da8bd868d92808b472da924b757c86ea96d69c17c20bd85ec6ce34652189d41604f9398dc555ce7b725def373e9ba3abbbc8f6a6337bd273309206973979dcd8e765e0171432f32305b3a1b000f2dc899b29a3a2195dd3a8ade9e3b962010d12409bea4111c58c33721fef34bc4007a4d8340be1c151d0a05fe78c1cf884baae8d29452e2dd651b621521a5ab4cfc4e5653d6ce87091fe5e02429275b458c7670490bf1abde0ebd05983bc1de1f01e46feb4892ba016c3ca8d72f833a7b1a95f85a042f39c296f6e72a4b02270a47067582d04e62a143c05b8c070e11285c870a250a2d85b6e4c7572716d9b3af44ef4d97e13d276e0eb33eef07f602e3352f0b601955d5a7b6cad722f62de8a492f08e45768d5e5106f78afd921def8a29b440ffd53bc14211b3052bde336ce78d83c875d1c117696d2297ee13982e935d93f319379f1281007a172363e3d331f9a2995d6f90581e936293213e80757799642a7e9a2e60df014f772029a91a7a9a8b3af48c5939a552af5f5ea71a729b556edb67cc23611105da70017937c5b6ce839dc6ccf8463f67c3ffc44e0d8143b8847220034b7c52a243a7294a47f9197dd1bea6d0b2fac260b1a83b4bf35130b7391ab56702ec4aa919172f203ea12f8d8bff5cfc9df7124c0d10435b462bb1ff0b5c953eea82a1d3f0c43f335947fef7fccdefe0829c013194816a1ada41217482d1d18561888ff7c3c15b27e123f7d2b44cf79e34ab0bc240f8db8dd9c1f153ad60a7f093d51a2a1f7103721d743a420304e5f9d036cfdf79e480157cbac44a02a01d4aca68870a5297218eb3c85231593b3cdd72b31585be369cfe27b23a1d0d856e220061911d38a5851a4e51839ab9d20cd953453f61019d340dc33f140399d441ddb81b3e77015729ae38e44361538d652e885b58e9e1f90a4d146968267f0540ff86fd9e36f0a72752f4df93a917366260b122f77d9e10e8058c281aec6b4012e6c2065bbe635720181579b40140be0062bbcf28333eb556c8635808dcb5a44ef1419d84296874cce7b3d213b753e45d17b76fdf8ed7bf9187264128ddabb77309b41d06b350672e9380355ab44e8d617c5992202f524031b4bcf22c96b6dbe3886f6b5cf15cf236c6de0aeca04add6b70b81b02569a98ac3ed2c6ffb6c58371daee1db1e06496b2b57460cee6c0b5526b7d48e27c3cf7fe02faafbd99ec66607d8eb9bd69ece4155b96d6f6cf740c0353d38fe5dc7ea4eb74f9cc2e59482e5c39a9aacd6a8893df708839288a643ef0ed17b52330880f8e7cf0744acd9254eacbd644e4c1c2372437ad46631f1e5f24d400dddb6f04204f6a273d103a98032b40b58ffc7a7e83ac960d2ed489212caad674ff8ceecc74c58db5f5b75c308e829f184c409ed1865e3f964c1b06bb889cdf6183c23ad5535a2329c4752b16721c1a9935eb2b9df29a7741fad819bfa12d2ee3b995461997bdff9286d430e3985c2c02c55ac663255a45dac83dcec781750229dcf94c1d8f9a90bafecbde03a4d0fa6c82315066b72c3133d807447986ef7f44c2fd5bcb7e4d6f2f3e821f2a2b4b310f4ad184e40507fd8533416eee6afd95a7542bc4bf90ea5e76769def06cf1303eb72bcc72a73c1231ab11fa168eb0e95d12846daaa5913ace49e670fd82a6a81540239b8c3d723eaf74c72a2ab2ee34df45e3fb4572c406db2d97261357b514509fd04e6932643e6d064ca72e7ffb6b1606cb5b40af661b8f32d7066e6809b43b7cdaad272b726b3714e52755b4ad40270080a57ee5849d23db87ac239e79fa751090cb21ae1a810ee73180a34cc376a00ba1c219157886a62fd22160a8b2e0a977dd45579463a4ed3d1496f98cfa1c5439a85fea1feae10a601b1131c808e108892e5f85d1729198cb1c9952965473bf733e754ba60505ae5833993e96012cf9b195293106725f8d9a4934d8b7d43345a677e6622593fe60f3a2226fd1a702c7b96505a5f320c114b5ae33889a3db886a4e17e690e413b3f32f19c14aeb33ae67852bc895823168815c4660352a1774a8f5378c8b6d6c3fe89f76dfccd784557f645dece1946168af9fed15a301a2b1c4c9b7f3090215f5fd98ee35fc2c63e2da69d4c63bb7226a646062ab94efc8452791ebeca190cfae9563502f8974f015ea542027ceb7256e273b2caefab6c0388f39f7ebecd8754681d7e07b168f76e3ae82d494782727a7bb155283d1dcfa861773ab32a17e99a255f0934df6cd0647f937ddd228572c209c9c60f04a56ba919fb56c38d71d85e8a28f4ea9265a96b839c4f23219572bede1bcd1b508afb70860ff2a12da8a51ef97de0c759d04ae0042938b255197278ff7185532ecc1460873e2398c6cbfc86a4d456c956aff49a203a8c20b54e564eb4e2ef533d65012f08c96f45091e71fc5e8331f193b72c50797ef4126648727d9c162df445fe81e537f0c75b936e3c9de28f2ea58083b4bcca544812902072246671f321e6b8536495905fec1879e9da027c9bf12de21c8ab67b02eec3ab72802257d1d7807509db48fe60a670e689c3634c7426db7947cfcc37be95b14229921f3425d5f8123372b9f5418029d04832af975625883c79018d77bcc5309672ebd3d00d851bac257ff4e2ef477b542030d4b2a5265cea0cc94c44cdceb06e335d8f2f7dc504a5e201bacc7589a4b991716d5e9c55cccf8a021e308cd2d64c72ff4e8afa4e2a8c753de2dbacf9a0c08b6dd5ff2d57ded55db53560fbaafeb57278d036cbe58a2ea17b363e32d392d3b808859c0fb50b9aa805057859c9d6aa72a08ff8a11105483b20edfa006ea85a9d57646abdf1ec8efb5cea1676cb927e27378579ff65878e544cb3414f02dab8a2def123a3b33adbb7d792ec90b9cf5a02b8709ca828c82c8a5212dc65257ac17ec7d8b3a4794d6b041b19e312f36298654299492c95a11e0e1ccfd978280c7f50177fc5d8af4b4e6a7441f485f1985272e6421060f9f520f259c776cc09501df4d84794885fe7bdd6d9c14cefb5c8941d6b714743bb08c0b23f197d479e9aa1bf190e6dbdab50d0d2ad2699365752625d439b1e038ec1e800cb2d6b6d6e42e35316de1e2c8cf39f6586d8e8ab8d0c8772d109046c23fb12e7a7076da9abc2bd290dd0893a5444e5425d726d7544fc7c23656e50e0332e5a844979fdf77d4ed7137aa5e40541451746163a203ba1482e5c112fccbaec2588c1d5139d8e4ba53c83a8b016182c833948b5c577ef4266206151084cbbb7c26a428b2b28a404bf9efe0dfb12f5087da232e05a34a18851a972637b75613065c82b051a54b173a56a46f3f5ee299f931294d963187ebaed8b72e8a22e33570870fa06a33b6d570829b80b1b1a90b77a99aa1a83af91d938f372017cc1b5b6c81fde08f4d6bd5423ffd298cd6f4b11377ea216c802849d6d4046a05c9f7b43fbf4b079dd663963d89e8d2c1fd86c41c64627735d24aac7c99c729a5934f504304f7de9a906dc95983bbd813243f6e98e8e85a3f880da4a57a272508528176c4bb29fbfc6fed99ef935122e7023252178bcc540b6020522be6e727fe0d197a0a28a6d5c10af3cb3df85b49d23397c225219a63627b5d4f1adfc04e8073cd60bfb09125bb7943d3a667172bb3345a6c2eb9225246a09872f0704519aba2b3424b93f53fbb498ef21cb76433412525ae1408dc50539df6e808c8e72a6f89a4d70d15f1b44fb1710b66d683cc4587741b0826a313c6a11474c8fe800237f65d45e81a9cf30b114880a9b15f1fc43bce904cb5b894bc99d9bcda1d572070e9e7a3252084076f6d98b518e39a4ce98446a8e0319b5f34d08c824fb0332b4745233b0c0f3c417e0963fc33079435d1464219b4c8a214b104297ac5e273dfb8a051b8ce5c78903efd5c9b26fac4bd03d726e512e2002ffdbeca83f922d724dac9329e1300f70a9bcfbd53dff429dd4117fa87d8530741c4df985986ba572afde32629649d306e1cbaf594f1c82e329f824517827f0d74b50de427f4fe07227e48b3ac64a78c237d10432ee82f4854b05b88ceeba05873e8fcebc1406a672e7670794c4f843146b668acdfc940c2cfb617eaee1f2408f50c01fab28869139232ee72df2a3874068c2bae3dd2c6949cdc4417623170d54cbca23a7c655364d12ae2cdd3f7b8f0bbc796d7246874e0ce7148ab5dff46fddc8dc7e02e6c96a72f30143f7f44e29e8986dc8a05b70ea51f205b5bf651de1386913d4997bff931121a1563a46e7f439390a54fd2f91b378db0d917512e9deac4af727d172d220722daa65efafce48c28cf484925f1e9e0be4c8a739b2124f060dff9f1d5e34a72655f365cf009dbbfacf0d565ca5804b750880f8088f4ec074cccb06037a7bbd728e0e402cb857517815b6c31ccf0973199791fb1afe96e74597ca50d5535930258b8ef0f30eca264bae7d908e3f258741a9f4e11cb0b6562f30d4a19a7d5d24729f4928753651970135f83ee49befbb950d89da18834ba65b3807723eded244726517ab9716af0c413e4083da5e189cf59fbdf2d02c9ebfaa09af02b297bed4726ceacda23cb31ecb1547eef8d8430c3b79df3141b44df9521af86a6dbfe162152d96a37548ae81ba3925d996cdaa956f7df9817295d382aeb8d64851adaf6172f1b0eba3d0efbd32c3acc60dc4d9e405913770556ee631a926d14851e9454564cb657ffb736d1233f0d3ad7187234a0ee84f31435dea7b27377e17c3e95466723ef2e52a47a15526346c3e3553a17ebc73cdf311dc5cf184380101a8bed6ba7249de7b85357a14a81a80e917f8430d3bea08e8b097591ebee0cf472838c5a954b1a56f03af4c8f902539a81a69eba4a2f71bbf5fd75f4db98416669a96c68e720eb2206336447860966d4f4deef3737a33162173cd919dd82b121a21f5b3c04fd8c1100f4781ec2fb34afaf78ebabc6b3de1861db694b8488ea9d8d9a7d42372b214ab5617e97d11c3079a655d25abd20e383966adb11326c1bcaac1f580a6724608bddcf72d6487e3ddb491cb99a7bd734e835be339c3a9db56c19f16275b6c3a8287da78f9e0703150b8a194d12915687a8cbd523ff90f9b04a0115d6b45722604d867cac5be2554cb8a8293e7e4b86f8b0868993a77d4fc5b1b88b24a85728940003a013d0ae96ea72ff04427b1d2ad0603160a12394b18dbe1035c041672a002d6160ef50be1c04d471e6c9e6ad56f690c4ce429d651c62eb096f6ca8e3d78ef64d0bb1f36dfba9c9082423c80e35998c7ca8d84aeb9d196be27e3cd577274b73d9dbbe52f1105bdd0a6f8243a8ec53da6585cc1958d4d0f50b4a7ec692872135a2e9acbca62ff943fed5e2734cd0f7b5c984068d8c7089df46a28ccf372f3a178f4bdbce58136757f50b3d0d86e7ece0ce7dea903baf14c8c4737ec50721494d86836503b686cf152b63a5160b723cf523084ae277087b36f406779227218e8948927d5a04609f82b548c056339cfe523558db220de404ccd2e6bce8a7267fd158bcc939b4024f5e3a1c6c0c6066b1266dde768a3add2163cd2e6bed33296442c7c74deba64941a6b3d5aad2f66e9d78e4a9ccecd80d4db35a99784a872b07a305e64cc7ad49d7b60fdebb9b5e0c7dd80f4e68e15964b998aee2335be24b84a36583be03d8acae2c546f7122a089641e2d3c1104b8592860dea4336b7722bdd8234268326a454c9aebf618bedff95a46f6d40be16c2a749822a536438728df00d103321238ebc0054202a003216edfe1454c059faba619fecc2aedcef727c50222f531ea437c5025e526c5d6a0356dbb286e4923a2f98f19919758bde23795d8322990d5ce217f49dfba69d1246338efedbe0b1cbf14d50dbb55a5dc44bf4fb3614690f0d174e43ed734cf1efca3e245cb417d61455447476438a63df4c67930520c293f71c3811fff0f9072c51685905d87d8237c9d4311aa3aa379a722ae4da132b95891b1e4f47e6b6158cb62a58bf016c97ca0f7700af0aa0f6c7729b074c3676bbc75fc71bd52da76b1ac08343ef10f0013dd05551ec0d232c5072bc0763178c5247fe1aa63d7641a1443dd0d4f28abbdb1445628f791e43772c72c10d153b6c1b872d07497b51de0d1c7455438fa77c2548b50f12b7a9b339855d7c55ca6930434e71510b6e3f179cbd064fe8443ce5bb2d177365995d89a12a72388b7d3dee27f33cfe4617582fdcdd4b2ef9d558a61d65ae45b543f7c62ae44d40a0fb652c49f3c5bfce2984ab3820d64187591d2f77b06e61d0716cefea1e72a008d1936a7a6cd57c0f99ad92858900306e99c4c8f11937d450c8861bbfad72dd2a2fdd6890f1088050d34381999b886fd6f01dfed4f331e410dd845cf8a672971346b6976fdfe36bb5e5e92663d91b5a5a57d269eaf0ad86b5cffeb001880d08ee83866fe651554f8de389d7bff4ddbd76fc561489216223ad536d82e7ca2e18261eb659013602bc4de430487ecf9d777bdaf23eed3d63405b5f4875f96a1d2e181111315b3e012693f7572d5b25a6e5ec8afdbca02205a1d1571afb7a2f72fa24bde9616365069b230a744009269cde1d5c8f60d01b64c7eb1d11c468f065cb70d072136ad534bc123f0699c3d7d96c21811280b14d0c628c20d2e8414f72dde839d6f16ac6f84bf1a702a6ca6f165d51afd6c63ab9349478ec5a469abf721f89b28d4e238581ec3a56ff142698f6d0dcc7896a7789751c0977c02a12db722725505975d6ed2cc4a652e39e8b3ca4ccc3d65e6055c2d32b418eedfaa17a72082680503ce888876e1bd73c27429c55a8a715b3d6ee39edfee99854c644da352ba94faebfafe3412236dbcb1e0afec478047f35ce50da6f5c6d794f36c86f7298554c1bc5f87db1b6c8ed0de14e5dda7c200bef34513ef77d794142c4242772a149f9f34bbab5e9980c32d4ec8d8e2f0f220a300ddc14ce50ad335c8cf526578a89087b74b921ecb84cc5c16c035dfb084fd3df44db0ed7542510f8b56ff9728408178067bc717a1577da961c6f658943241a69c8299bd98e087831b64ca77225d67b09ada4337be58913bc3512c537df72e1f5141c4943e2b4fcad2f61b0721f58ea6229b7d1df92be55668bfe39ce6b1b2636efdc340232932b68a9a98c72b803ff522360913dca623999d860171fb3ee45942b26a4b6a66364fa3571ea722789f16875279150c2dc30fe84de94e428c4d7dba6ba9c1ff7ab7b8a300f54172f283075b3f84a63200a7168d57d3a9458fe065385cfc0a0b3a9d6e7f7e83b728fc6da6cbf62f43e700e5865b7ef42009c9fe44df623414757d4852e5d1aa4727f7766b26175e3102905396d6b0c5e0f14b1535840eac3acf16f9c7be2c1c120e0933323ce6e9ccd0d6ffc23c070704f89e77a6ca753e97729cee153215aeb72f5672b7821539c38339b4a4fbef9f320cd96d934fdd1ac33838d5ac76da057373471db491729e4fd7b8976468f550b0b7791c058e4745f3d9da3d6f714e91f7250cfaf5294accf737cb3e46ed2a32d0aff4fb251ba316a30e2ce6ab8097f19721c95b5707bd2673d02b01841f3624a39432af3b8301f7756e75c62dfc2382a2c31915a3c09de4154cda2ab26e1419b7f9363a98fd6764a0836f9ad96dfa69272b2574ef41d19351c5725165b70d6d7dfcc2882993143f6a14f0e4606065a3234923a3e76443768be78c9957e1cf7ebc8d7681b5d7743b348432dab4a37c66472c8aeedf777c6b31ca6fde929c645ae0d3704691b3de494ca3e845913701a767254200f3fef88170a8511fb6d691a4d7073a2ee753d6afb3dcf3e1bcd5679ac01a8acd9a0c9bca87204bc72f398d6f7a0a3bf938dc33c413f33cd709988aeee369d7a2820c14f0c87777b8d52ca3485fa8e5c25c9ba09d7b43184fa8cae3114729d917bf003c84f3b1a5f146f1070d6f1460bfdf1e1eb084215d268a5ab5f027278ffec38e5e71a45850e553da2076d1a0f9f19483b490d3eda803daa60039472b1b78ade2eedf7088654ae732ba958dff0681b046a86652e00100bda1cd7b008b5ae6f4935b6797d870c50789297114e6b853760f63603113d3a71abb9f8477229715f49f7b5b471a8bf2ef27aeb52a752d411387907574631a831635cb29f7263d7c7f0a3c31df38335f8435e065bbc4ccb2821d513307638c022c8f26b406d3d742a081f5075300a1976fb1cfcc4ea8af1570ef39c0c7fb985f9ded2d7f2723446af8cfbc6a2c2a1252710532838f70b67a5b35443a7891b02b4159c69e272ad4f549278fa1ce5b93093ed973693e315fc64cbfbfff5ffe22f617733e5fe6f200e74ca0759bd1828cf2415f8e44ddeba302f9525ef427eedfd6a09f962a2577f28d672a4b4d421b2fc7de36a7f2dca77c5b2d9e29f71fbf022d82b6d0eac33ac30245d7ec218bc42200112e0b879499573d12d4e05af8a9959a32be0817f72ab3d5f986a19373b05ce19253eb5aeec473b9241b2a662a14b9c59f8af007a5b7313793a735734b0830ee116a327bb4be42169ad66be9f5d77924ced35be16721e5124ebefff5f94b2786d1ec7822e19e816450da53cb704b89fa73705c32155176137e65906d361a8ad049e3496cd9dcf95c89ab4ab80f1ba24711ac415bf724b733316316cc0009c8b8378db700e157007406871b40fed71641b8e4e3dc2729552706d9aa405ee4f27ef10c00f54ccfb4e3a06fc71f90244587efa6c72627281410c9bb4ae8869e57d139e052026df6f3f34a5528279fb59b9c31982fd737203ac742a61d463819dedbc56b6bc3d65c4571e86aa5d757c374a399f3a80305ccc112bb4d01f915770b9a56f9ce883cb3d48d085e1db6a74fb6fc230dd223e72615cff7c32c2c703adafd59cca271afa56438cb710d198ca58738a346a96f1722f32e363a7e41b2285424f717968116d6e881445209498b19db9b960c274d60b8d4e3aa64cec80023adf5524fbcbf35ab6486148daffedfeb66d055b0d44541556db89b7569a41acc6e0b805c15aa44ddea7e19eb0eebce59da9e86eb11ae472b4f592dd027ec451d4a72b4526a516813c59dd7aa8739681d4c791d725965072fd225616a9a0f3c0e1956880362dbf43d92b32e353417a3757ffafda2ee0a5729feb5ce3c5a3cb186b15585312c40cee7b6c1fa422e2bfb74088062705825472b1f0ab33e7f0c25efe0daf6498addce6f0f0ca671a31f2f996672ed1a63b7d72282f01e8e9899551942ab005d502d93f7db4127efe8d9c9ed5a9a8832796b47269881f4758c34222d2d8c8de0948a24c8ae8daf11d3f5f8a0e77efffa2cdde72e4e4e3c75c6034acddaaca447cb4f19c1da26b762cdc6489790a1360cc23ca588dbddf1458771ce520bd2792832b96bd8635679df8817e9df719766203ef637258eb0475b93a452c07b86ef77ac661b26bd4392de61a637f9782d5ecd39091720554bf0830421d981c2fc8b8ca43436139914cf24154c2e2f649aeaf8f0d0c721b4ddfc64dad60706ab102d501f5c35325c984754e0ea8253b3f99f52fbe7f7247f708efc16d23ebee9d06c55bad3d2679156f181c33974a92dcb4ab48cb5e72e51952e0a270c6e62987d6554851f4375f3bb912b00b76e60091dc9535a00a2bb2ccd1e0674a6326660f9302d9ba5628b50f5c6841f03086acb5d8fbc8a9b972c9bd049ef26851490add12d0fe9137d36bdc5cf366d09360113046c8c5b51267caba3abd1a3f05eed140815c06d07b3647467675ad6e599e4c6b8c855cb8373fd9c32a5a41888b2d1f42ca8c4fb7e1299c3dbc5ff12e23f00f90ffc5cf5ecb72ec363f509f17b0f23746fe8f1cf95e3049ca917d148c8e6e5d5f81c58cc6a472502cea01dc4a6a1f7436ce5c1549a28a9f1f20e3b182fdd4ec995646eda68b72ba1510f4991b62f53a16fb77cae0f1d32d88990131f4d6fed0ed51108b1e506d92730ca3b096c50fc09316605f456dce696904bf7f081686dffb601a249a681d45b3375595b3d7c6fc55c08e29f0f1274fb88529b19d1fb2b067db797b62717225bdfbdfd026f4c0603d58d67e25cf6dc3ae87416542c2f39460e9186a3318723282ce5a3007e75f88bfd4d621acd782f8e891f642e729ac07c69f2a90823672a3db8146e92e9f97ed40dc4029d45fe440d4c697a7078edaf1469788c6b1754f2494c5448dffb913d70170ca81f61ffc8a255f8fca3b85dc61c3a0db50ddbf7241b832c264aa0eb17cace0edd4c9da22516f6113152212a5af6d795db576a729d27d0c379654dfd8a75097c679f1ecbc261816464c2b172894f4978aae0646378977db467b0055779ac00c8368edfa42a019cf945f0b3d18e621d66920cf207220b9d5959f5c9d7303a6d07fed5fbb9402ec4c6128d6ca36019c88f5396af272fc482dc46276f8ecd05ab29556205146d1b8983e8bdd63b71d1bb6d1b12ead52dbc269d011da5c3b04fd8e8792b9eb8019be1d460c2d1ae27919917b311b8d722dc70c93a0bbeb83976387a1570da3c27f3465be54dd33526cdcc2f11ea76f727bb7ebf88dcd7e80868c0e0f2eeae2e78645b2258e780b103ba6de9e19864172e840ef400efa913752ae4e7bdd63dd4daa0fac3b6dc02756491b37ea4f8e181a81d4bb9838092a4308082f59a17b6925cf4871ccc992812d9f1139d9bb2e317218062d0cefbc36b5e92c60d5d774627953fc69fe5c3da57bd26cb0597c2f8516ff509ae3447fcbef1d0a0444cc4b82bdf954259cfd344728783fe7b45fe32772a6447d74cf4371b4a4e696000256599101b18298b52d3be62b8c163652a9c63c2989e62469dbbe64ff492088bdf7ad2ae18bc53003a91751f2fd35158da21d25674101e0e0d02689349d1e2cb724b5258bb4ce830db9f92969bbdf76db65ea1c1fc518825b3b11e8579a1d133034aa12e32979cc41ab8d8cbaf4c299edd535442ef142b282fe2617015207b44fd51ef7c8116e6cd99fd3fad53d55e7c3f2ff3df734db271170ec1eff15612db185a4ac2e8ec00acd0a28348608aa4af0b39f03c51ab2c6e501f7c291096ca230bdcf42b9feb3aed5a4bde52820a186f207166635018a36d7605f77532f6abad6ea0d2405c294b936273d7623a676a48983a26ac92ef8b589095dd82d0885d53e154e74e0abd00fd37c6dca8d5809a538803d46fdeedaa2b9b6905edf2b4dae7c3623692e0fadd090593657b8474b89a630a0720cc6c1099bf82786fba3693a3ce19f38d045e8af0bc60a2f3fc869ef7153b072999474e71db7b922b772cfbf6afb25c8c1183f37447db479807846ba844b706d54e913a788a4f2062e0b05579b7f56d932a542d4819d37427d95fb2ef078f4720c933988b13f90eeede0c7e8a729d13ddb5ad9bc5e1291617788ef10ba732e7206ad2706b6db2a72ca70daeaba5373eccfeea218cf510d42b18874dfc2f54f07fbf530d89088dc3b18f088609d384a111c3b44dddab5bf603f8a8f7309014d4644ab30886e8f9f5f0865c4cef9afa67af3605038fba11c9590897196c96e1372f01e349d78ea0bd35d7b6a57a0f7f954871869c37bc5926750aad87748b8aa61b8f96da7c83ec3b6768de75920eb858238c08aef41fa7e7910a2681dac51db16934d681aa43c1239426d352f0b6694fb7a370dedbf63b7ade105243d9535c85459c494eea794eb1c399e6b795c7a5e7cbe5783ea7325bb9a5e2e537739e55872fd3511071c79f08b7fdd3af793f2e8f6709132b98c92b00beb9788d291d9e67238e0ecacc603cca68b7c6272c6e93f8da0cc0a3bdf0e4fa4c58661ed22ea20720751b247ce875fb74cdea3e0db5ef363869faf67c5d1601bab85e8e8a4f7e872f3db425afc1f7f20ecb9a56858a9a1d34013b2e9a457037972a2aacba56f5b35a97baffe6e5c47bdfd3671ee0124503c10556a0a1076b06cce40a00b585312720ddf5a35d2fd04ef11716832971ae1d64e0747a5ea1bea9f6d0617e4f5dc9a391a4a7f57fd5817a782cb5ffd05aa99cce7e9a5ca08d34e371236e0743517d9721b6df50cfff6ef424c0ac734b66f3dfdf75931858f873c7b1b9beb7a056f58729a8116a87fef3ecbf4b7521d6ffc8aac78be3cdb54059f56f7d401d2d9decd7250fdb51b547f52023f30d2de904c9bd36cd2edb8c46b0edbed60ce9e5045e503bcd2d08eaa88ea950bb48543b1becfe980b298c162949e679cd66c07e7999b72e0d3cf943e4756c4f92c5bbe5d87b5e5c96e338f52c4a9105ddfcd90a3f12872c1d6b50fd632d0ddfaaf05c56c9ade85f8da9db171ffcc44a24c4320e9285c6fb81cfa92a0bfc0a12d21f30c588af8b9f2b22db5fec274f3b82a8ba1a2a6687289371809577d0a104fc3bf1fe132ae8bd078527014540a50ace6104675cb2e61e8d292effee08d2c97f144a4759adb9cae491a36960e82ce2604f312bde68672a2aacc599681d3833878f879fdfbfc4b70747701f738a387273ce9129fc2de1a9f2d8d91d44aea8853d4b58d1e34c54262c4fe84a73469b3c35603855d08d8427929d8d0c806b28f87a938bb9bb26442a7cac5f5ac5f2eda7c8880394658887214d998595ceaae720dd56312eed614ec206f408fe3ddea9ee1dc7376cc798655d657370b4fe8751901b096661fc31dd587317a6316252646817407e0a4cfe9259f0d4b4bfd5b0fd61532ae1f206082b9c1f789f6ed83a3b9ec3c724cd6579172234ad955a9590a589eb6c5754ef04b4952ce8aa70748271c71845ed6e453ff5d3eb3bbe52f8673bb721592e4c5f98c59981942815cdc8961df3d787430f1197238b38f023372e7dfaf15975fa8a4c4a15a7b0ee64653ba7a5dac3b40c3d3ad722ce9bbac990f142053b67c290d3eed55fa1386f3d31cdf6f51581ef942a18854ff8d5551879a4a5b8f21fbc5a322d21564ecdb6bf70b90035387084e659a462288d56b1617345756e07399f4fe31ac9e5604dcb3b3f70474536146ee959a5b65f806c402d43d5f52d4bc3e80a84e60a0d84c0debe4a409f5fe4453151a0c2b105f45e3ec6219b0ce860643a73337ebd8275e8d9fcf57b4607c6a483994ab323bcd0e9970d98919de28a5cde390311aca81298ddc5955217480df7e7c5430837263094467ca2c0cbcc7e9e7666239f0cf5564f705d2ea8eda509b776587a6f340f704fe439aceac7bbae948061411eab112306399574798eae8a19c157fa7275909fa0b8af6a00fa2944651e45ff6b56fbbad5e27e62e10e09e368650f65d99723a4d43ec746300bde94e0a5b01a20dd8cd78f61fa9eec27ac0c6b0015595ea31f8630fe26154a9fe615c59525385e18be3202fffc367bed594639c9bcd18c625d434e4ac04a8742bc94ea770e82dbc669d24e9263dcc1085fbeaa99afda90d722fc10275d0524198446c7f72506c4fe7f989ad351f975bc572c5582fe8f4f64713f83f656d745bbace2f25ed6529a5c848f39836df3531f1d62819f9d7698206e188012719dbe5131f503c1b8d7b9472658ebb680fb6d2fc2f1ea9d5331e3572397d7c00342cf20ed32d3c9c4e1b205dd31a5dab86d73a2a5967d3eaca71f972dd13249576072edf686614e44a27b7e5c900d3aab703799eef847a5eeac3ac721bba543b8a42c7f6db20fd1e5234748948c2c7cf203b464a5055772e946cbc4b83bdf5ad227e516b4fe8b2ea1017f11b43ded503523c407b521fc68e5626e772464853fc499d0f6765f8bc2bdd455b8fe373a53a8be89e428b0e0fdd0692fa721b19aed5cd7853c58c0df881c88c06afb4299388b1fb886a9c1b781576de5544bbe47bdb343ee7677f84977eb7e19786f483aa3aceb4f539517b6a17341ed47230a410ddfd797b63881ea3f5d8ef8b255f71dd3d667ee77d4a3ca8795063c572e29a928f3ec321a839c581fa66c58eaaec2102dab3df2265617e10881356ea722c04b1e0d663979b3d6d2094cfe7a284ee160c7da2057dfc5c43e0438f19c072a55ff1c758a6d6392ea58d45615f8c7adffcabdf305e8e63bccd5a35df7a192c73a24e3c14d9f93ec2ea21ccdd3e2f8f33303d36b79cdf69caa4ac9d2c71dc58972f9c7fa747d34337c95e491c571d86cdad94958a9a710612c3d5ac3ed577724887af29da95615910dd50f6dcd0fa24b838517b7e47e2ea1535b314d6c18f72eeed5ef85a48390c97d612024da8a82ab078cb939deb33c12d02df1143b5bc65ccc9ae9a6bb5b933aba8403886ccf6ce2c990261fb43047b0af7ce20cc6e8e478376e1b39ffff0ac6c2258e9b874f3054c0c0d71b2a2c8e926406354dc7c862305fc63b65368c5da1eeb18e18003e71e567f3a49fbb8cb85697ea9dd30c55452ab5804474041e2d44d3d2e6f77714ce863712230fe626400ae4328f1fa17a754edbcd2b4e38139833094bafdbbd580288de1b71c9b091ecf4fc40d487e85d872015f8f308c4e383d9ce57980c31363ca70e5cc90713c6cfb9693a6ab7ed501728c6d3dd666fd0eca8801c8fedaa7d93ccd2f6600e1e77c7e389b897f54cc07723fa7eecc9e21ca61b67d064972bb19d7fcd703a2247adb92c17567e297b3857205b4b3f8d467e2fb3a1e802cfb077a8555e1570aa6f1b4ba472f994d84e322241475f178f3914a1dac1704411e0ce1a454539915492826c3c0f42449c0db783c62a85e6c0fe766f10d2541f4886b65656d8a32e927783896577ba41e03464d5a45d3896de184d34ea39583a1b67be3038b38c42eaa3bf77d40f3b2127765167203956a06291638a04379a272c476f574a9ad0a29af518e165666381dc5030228180f86082a60c38aea4a506384db343533f2f015f134725cd6fb878b23f8f805f7e66b6a563b528da6f13cbc52032cd30cb2be4f77eab5ce5903f64349fa237295cd43fdb75cf7c6c087af1bf1009931363b7f6e44637753db61daf6fe2d8a4e895b33113a47e6c72d33a9091de58d57aeff3e2ef9a9eae81ea9d8b2c17a571f4b105797c0a352961415a9aa457761c8fa9097f3747e9259e398cc4a1e1bf272c3af8f9c67e4943b66ddd26c25b40a80f0c484bd1724947741ada96a86cc1f720fb84479e823fe0a1b4ef100330f4547b5a53a9d84449a9c61ec25ec2aa4ca7221972b123ee2999121378f1c92a5b3dbaf6aafd549f22e3e7f9ebaabcfb77f72d5221dd2a2798cb60bf7772e41b5310d5126a25030226c04f69e65894777097271d43e2dd18ac1c48db90f4e844f21ad17be66b97e8a395f38a100ba2faf353fb55ad60c6be344b0aba8c369abdb4d9a4cb7cedf830623a2799bcfda2435256f7f8f96c34bff28914947f9ee9a799b78241282f2af3ad1d273fe1e5c97d1e4722b567ed142f36713c3121079af0ff868c22fa37e177d005dd1b6ac56dcb9f372a2cbf2956d17f722ea9040854ab97123bc9291d1eeadcd7a32a72c3c7988cd729bc185210b26658a7e7169458dfd3f4f1d55f3158df8745693685f912a9c1c2ff4a89dc9b53c4f428fd16fbe8bcc42b88f6140c2862dfcbc252c50db98a5e872e6f9160b189e86f46dcd6c247c1d5153b5e91ac904877dec207577df281ba01c54f7cf45e4b224c8c0d2cbcde3e1fb7b23e89a53bc1ad4f7f225eb0251eee12cc01de151ab21bb03bf450ff01b8b3c22403a760d1f192a231a1198b610155668ab7317b4c44791013cb827dc5549e3735cd3e2bec7d2fe9a5efa4445a2dd6f2a5ac8c25f427e6426249ae7374125e74873861550954a838687a52ca447724e72beb4f7357f455fa2b521ac272308562489c7d2c0e3ba2662d468af0ad6a9137219ca330511b0540e3c3d01d9e2064934f5f253046a2cc7b1ce7f86c727fb5c5e8829cd06cc937c43c371672434e0f353e0bc688fe3a5c298ef6905660119797271da6cfe90bffd8d27703c39a85718c49be0311e789a202badc2291974e33b028d539ecd6c4347cb87b968d33365729fc29d96a2fa892ec3841382d817065c584873dd56bbef3bb2faa632c4b53127a60ef213ae4e5ae4b65ac3df163054685e63eec64d3062e87f9a5b801331896aa6b054a9f3f70c8ea014024469ad59c9723607044965d2e3f733f8daf779f134a0f874966e249696a869987d3be21c43722c8786c56eea1fdf36ac53ec5b276dc3c7f85e9af747acbb408d7375a302b343f24ef60cf71a830e8387d3246fa3a742883a1d9b9f6e48dffe618d3cc8216929b1c52a32e109333c07fda16d1169ca8de8f1673fe8dd1612cec71a4d0510f56326d2deebb18ead26712f975febd23a456905f09b917bf7841ad72ac0f36af30ff1fb1e0cbabe018a3346b46513900021230b7783b6e37e1edcc55e207820e843813b7f0bd51e513597995f03b45884886fe60fa8ec924e8144dd6a60c476ff0c0a09781783ab5e522283077cc58981d5315f3d3f538d521296a55d6e22a8cc72d437e1a9f5fd1bf054313bee524c2b46e884fd9db77fdc004a68092344b42531dce6d2cb8e36d760c8942ebea4f902cda1079bec48fa65b3afb019a5f047755d3a30a808a4af173eeeae8c4b4c05848ddc0373c605c8777ea86c4db4e2c6617259bfa0e1e436291f0388af1c5df51b585dcb9ada63b779905ec6854cc37b7c7285fcffef459caaeae81b562f9ce8948279d41fcd79541aa7ae7dbf51810c8d720e3b1dd11920b269b0caf356f9a020e07e8cc5f46beff0d5be5b3b582a537772a4a4098514ae23eff9e13291cd73047db9e3406ebe04d77ad3f3b2d158253741ee48308de14b6d4936b6f0b24b0e7c36b470cc2faccea7d48053a35334634872412e06720f76d86324bdc0f7ef1246477d61ce1449fa821f39a86e3a006f5a72ed4320b0f1ece5d0444feacbd06de55d23ee9636d5774ab2bacf295752b7943884b531599720e3f2ef99919a44b13bb38c277771db75582fafe6691af2126872e24cb98e0e3bb2632a9c126e7d84ef0ffb530cd09c6eeb4192eaea9a777eee476ee6f2bccdc99e19dd4b180f28a98684e455a0c81b1113ce560eb83b02bb3030794c326acae0ebe15587adcafa4d6ed27478530a7ebf03d05947c5309e9e266c1943c303780955050902a98331066ca1676deaf436d8ae0ab6cdcf8b4882a9725c8b34b37dbc062cfc580007eed59793f011af08709395a5a9bf41a8bac66819961a6790d1076ac0c7a76ff95bb3f914b341db0ca0b52f824c12cde1ee3f16727be47bb9b90fae7e5463f3aef9a329a4529637facb7b037c6e31275c57de2072b19d37d5d353356b2377254ba3e238be56b0806db2fa1e01c3dbbcd2f336007216a61e0754e4dca0d41a6f69988679c2c159cc8d10231f35d3e137b5dcbd8a72a1b0989c4293a00736890e9a0b748be8868b40c1e69964ace50a72c12adca0729842fc5db7cbe14dd495b5fe9b9171752f47abdf55fd02fbc3c56e5a1f87057202ace04e7c3c49b3a77acb6ea64cdfd1b146b0e33967b6106ed1a25d11720772462a86ba6e5124ead81f3f9f3ba4c10af4fad40b62799deaa484bb7141c5216b8bbdc966d1c5aca25cdcfdd2d26e7734bea1d249cfb56ae9c882366dd133af7211df738961de4cd69dbd1a8f459d6abcebf41d23a4226eea4715074fdb555772b15fb24a8d1446b0832a43327a26045d4e95805aa38d745b0ea519c46656510f1b2279c016cc8faf08e84bed8dd0f6c1623e53f9fd284391e84de8e14bd1bf3e0f490547fa461ce340a6f4103b1f6a920d5d45b0cf77c1dcd6eeccb5f1152a61072550c1beb692e2bc405787f711f1a49a84f4122aaf86ab85d9579b3ce55d720c3c7d99fcca531d9be1732d4bbe401146cd295bd5d3e25cf125db1429806c72ade140c2fd63a88a887d59463b50723cafff3d75e0058d5780e0d290275a9e70188be3223794dcf4556d039ff2247802a4b5bf950b55b7122d3459351239322a69e83b43a2ce244b47d96214c897fb0c22e30000fba795df50c1c601a2d4667234ed49ee61684a2448f47ee708ee25a621f70b10346bdee41403c3c817b55b086ec4ab1da91c80eb6197705c7eb1c28ec07f82a42eda9093331bc413fef69572002dcb458eb394ed874d561ea9311394dca7d1450d069057b32f21edf80bef6251a9123a43fbc76fcab7142ec36b5006a5531a1658a822f54f03142b65acb73e8ee1b06ab472628f1dc635621c3f15951b78bad01192b210e76d0282beb3356e840cee20a4dc5c5fe7cafb24db1cd39ce5b4ee1ce03266172811f1371203315a0c414ef8c1587bf165ef26be0eb64f7b74500fe9a386e0ca561cdacadba94d5a20f223d3db01d47b9e591d1eb72d541991904225e4404d35507f9858fe76c4727ea525e67a741c8d0642b0fb7fda04092b8e1d8ad07d542278878172198c6d03dc46d2729f3a3b5e9adf25e82e32ac29ea2a11b96980b1624aa7162718ac677295097f8861cbf6f0555b6c9220462d023d4e6fc4f3b11703177f904abc5f7f72f9ea37934181640e6c9ff6ee8d325589998a66fb0d2038b5c863c8cf1d990a10d4c7962f8a50315e4cadd30ef69480c0f83e29a220321a52171d81780a5e1c49edb9132eff5854d71188db63357e24c7cceb1d6a032ba0c2772835cd1e201953f6883d16d7c4f73a9626fbdbfd9b4dcb858d8f284c9aa9394541ff5ecab9bd72f4e39d209904ae9e657a3db17b7c834849413c98ff97aa9168e52daef39dbd609d4e875bcd8f85ab528ac6232285e33b8966e34dfa8e4da363042db893f6a5725baa98258d9888b400a72b9ae73b4e10fce47c990bcdba65879802d5d43fc7628612b7c487cbd19569ee738974555ac3ef1dccca4edca5615b98524ec4913d726cd2b42cd0794eacf185dd876fd3cdd71bb4e77e1462e2ab310f696174ba6f72632d0461651c20fc04d2b4f35d53e16867820ed458c15f566cc8a03e9971fa5ed7b05ad3af8f69d0f3f896e555e8a3a376d9672fff68e2555d93c535106d8f723f4d752044b36d689fb8f99709e979b5ddab53cdb9646100d717e19c90c21372f9f53c4dcd7adf63998057274a27119e018c2288a748c3ee8af682e6c9886118abeb16d230a42e0a01384c7dfaccfde4d04e367dd7e49d3aa7fc82621d8cfb7209150fe58aa70da4068ec2545c53d98d0aeb9838d92f018585f6404766d0ea0e4bdd24ee25da469acf1218abd04b496f2d5e8eaf02a9201daaa3509a2b0ff372fc358a1af4079c4cf04c6172ac2d9f9ce8d264516cb8e5efa8a8d18481ebf301aebc7de81aa52dd3af11e68387055f34e0058a4fa4c2eb35f7e4416c03d42a0ac9df2df685842fb9e78b6be939f2be8469d28e128bc7a29ac9913064163b5f72003229f3b6643bc5ae036c4432739a6eac726dd2e3060a7722b53ee7c4345f5593228c1ce1cce2282083cb8dd94647b8338eafcc64e0e2bb6591ffedf16beb2e9c4ea8de8ab9e9491f879d0631c93328fed216f8cf24bf2961d5962acba4e972ee31320e4cd2dccf120465c365be2f249177f0b5c7b89c235461453ffa7d577276f9b050f4fec9252cd1fe0f738ca5ce76208e4499b7aa216f56b76ae587667245c18e9a71cde1bb4152cbd22a9fb5aea480feeb185f8b4b8f2f7a78cae6837237772c51a90ca44fa60ebda79c96b15231612c03c4d4ebfde4ac95bde1b1d772ba6c05d00f8a08021abfb20514c9d76a8c804f5fd677f72282c734461a4179061e0a3b7f0949ecd88413639719ae9b630d135646b7576da101d6a965e5f043589427dd2e507fd96685d0fb36cd5d2c5bab438d34f618f76aa30e8407edcfe12d4f3ee4dd9495ca6a832d1a6e01eb7f2d4683f42ea4aee82d0d2d74cc4dfbd426dce258e6b0a82424b2a36265bb90824e23a6b07d32e672f12a33096a8d3e4e7243197f5bd2a36366ba3ab40f1587610f4416065b3532539e0edf35f73d51ce4c69909ecf159790076f19189ff4223c4b304bc1223a94dda4ada3635441f0ee727acf09b12485d3888bd77da82979fbd96adbb2f77908e213cbfd488cea89ee728e7ee59300111a62f8580294283b522189ad090c067bbb0ffecf81cae4351809b65af8a2f402313fe649a06b0aaf0d8f867802b3cf80266809c8ead5a4fb0d140b66bd1ee7386d682984e94433c81fa244a3829a35ba47893fd36267cbc9dc72f2e4521b0a26ae07d20334a9da8fb98239782d08362e006616fbc7c8638a9572d81b78d9b4560f9cf92cdb1a547be5a3d8971d2b87980d595f0e75eb092b472eb65b8ff0b2cdb594dfe47c82105c643aac0cc84e4b4fc6a567b6eabbbbc4a24aeb673437a29d44e0adf9f8b838abb81620138310bff24241ecb04f988c384e33408a937b9ec9e342a3b8ce9f2489f76383194165a77edf97fad0844b371828726b3c56cee9ae870d63c7585ee2e1787e88ab403af24e29052a21f34fe952a53ee8e17a0d55904637f1a848dd0f709caaafbf9345138cd8daf059d950d1f37472575fe0b4b30b01c8bc87162ce0bbaf72781cde8e085bd2835ff09dd667e0ef723faee1e0bf636ae20d77ce42a193ac9d7f9b331624aa5d42fc767bb338d6c672b705e2300fee92b3cdc1f31ad9f5158a8d8083e53cee1693618234ecaf3c4a61647deea91d18740173090c0e35745436e90f2c61d531685fadf86251cc252a723707bf037dabba29dc5d604b1e704c878ca6970ed80f1141fe35def5b02cbf483954f5e638bc988ac1cb2a6efdb80cc57535695e4488a7bd3f73f815f485b82d58109910226b388528e9a9804e1fd3325a629563760d52c85675c8f1c9426e11027ed677ff65ee643f90ca7538560813aff34b26d9036c3c299258214c0fd92dc470b9116f021f2c68aafe68d9c27f47af364ba84dddecad77562cbf2b502b646be8ff3555a63c427021fbf5a65f22c2cf5d5ba2ff37067738c84a96761c8b44ae29cb4beb8ce0b7c1e575e336db69eea71897d5666778a6fc8bee4490e00868425713252e3e25d19d8fdbaf29e8627c9ad51aa0113f190ab06b1279637023270f5549da774a596857ba97995e9132ce813c118eecb8c6ff4e3e2afe34eb5c727b99218c830a7ad8b09a4d28ba61ec61aab6826f66bf07dfd611f856cc165d720ca0d52dcb56bcd7b4bc048a01c52553d17aeff55f050a5533e7b09bb88a3e7213d60bbf2c29a09b5a556c16e407eb07f33101b29e44ec68b3abe6e1cbcf18271744568284de404074341573b5f7a4c3e40e619ea37d6986c24fdfc47c73422601d33ed4266651318da55149e1fe860ff12df900d0e09d7f9882636353713928ab2c3a634b5fcefee2c3948862f47e9df87c98ae1d0c80dd9e390954f79d9a197605697f96ed78c53c7aff0107b1c231bb0e3b736f08a95c25561e09743041727a636d586eb45c8db89dd71f83879448fcd946aa9eb14146f65b06d7ed2afd72baf24d77650e22ccfadd695af6b7bca93ced601c3728d9e12e8d75115fa45b7260765e469e8993885ff0201e001c1dfae463068c81724b87ec9bc741fbbef467f45b1ba43521ec122d0f7c2effb92af4677ee07b1ace8a8a174eaad7b9f8ec728a55f2671360845834ddca7ed8a020493f17e4f17255e0fd70c9d645ef0cc04006e308a760f046bba10745b3b2491845bbdb18b6147b0879d5e914820291601e7594c14e40ba33a20dc5dc29a13622b113591316f659d60d1b80c04c567dd37272e86043457d5a5bb438ed52ebe975ca1479da77ebcf35fa3feb1994be8c107204b4f00b62eec32ecae0d59835e968b6b4ec009f558d74dd937e0308b13b1672330749f3889354db8da18d6350ba921aefb4e5c75293f00fafdfd455f0d20b72be610a26eecd1566642bdec37b2d9f8e7c7fdd4740f7350295c3c207f569c008470a1813a321e8509c3a097600a7c28fc5adbc2b1cd2b3df4a8fed5733c18034b882619185242544e162cc7edea0ba448e95681e83878a78a8dff9a755e2ff726bc3439304f11f9dc424c1b8f00f7e1231d3e0ee9ac3ed2a5e7866712c4b4d4adfc90f7c41142603c6c006c4e76c382be8c0b06ded0f0293f0b9b346b244011778884dc4fbc3a42b08bd7c8dab7e310955696a74a01ef71360c71f2593a87772960dc79af2f465e82a393798a44eb9c9f5dfc2ea112f348ca8958d4a7258fe728d78c19da6957fc75ddaa1accd43d995dee69c3cba9c8d03c5916dd85c0d577251714ffe285a64c7681deab74fb71dc473992592e7d9680bc6522a600168c772e69b0244dfee9e8875d02f35616e69bbe00016d60c8d69fb272adaca17a8ad72191e3dbdb71b3f75c7c506f0d0a8be0e970505260ac258ef18d0f88137274d2656e3693c25d02db2d6dae6324db52373261bbf18fa5fbe917d9d9ef74e46910ba475de44654ddd27f300c9cba5e5688725b243e999cb9cfebe81d449dd1e8a1fcbd2a7ad2c605b1187d005e4cede57e0eb72d1e9065ce648340c19dfc53a184aef53cedda31a1f651e4875ef63957da549bfd369732f9f3a492520152c7a876e0f8dafa7fc450d92377196e87791658ddbaef3ba774410c25eab6b224778e072ffe3797b7ab41df75e87d1867d405f4e7bea031aea096cf62202c50bbb2a945df98022c44452f629d508f43624642a5439f153780718812ec9b5b0d10287ad72c74a63e9ca5a944ac6a532fea427f22e1c872384a52b80735329d92fcef23d72ec1d9c67d7fd45a79041987d7f5544937259c350b6d915b6a87031381089637224402125a5e9ed2af35528b056d46338cf65868ef3611ccd4f3efd896c8926162e1d3aba9bf1539fd834817e6b4d996738eea98ced293ccbdb4211f009911d1d06b28464a3f75c56908316c20f7af092f34b9fe452bfbb07205e4a058a7e254b5c946d58f5595c92f0672c424e4ba30c3b50fc21550a7de71536bdbb93143b72a192000ba8e99d61fd0a42d53066d9850617a51fb6bef3633273cd9203c4ae71a458a6beb5abf25628bd026433890ad1b28eaeb914b943edb66023faf6e5316823e3df5daefbe7bed434de50e0915b9f4e441c364fe8c4d549c3afbfc6548972ded29428776f0bbbeb112db3a01a6cce2ce1b8b0b688d9c29d39a2ab0c3c8a2638ff4065d8ffd9852600221d43090774470095a85dd4a1377769efb113eece02a08791d27e537446efd30b52e9d561d2edbf15297bbcf0e4ba2380cc0aa1da722be0e9f752b5587d9a2eeb846bdb2de6474debbbce2f51fa9a7e5bdb47375f7272e390eeb00145a3719145a04256f3e308edce3e6478be0e7a426d3983b8d1724e221e355a8000a621fc2d7cba83f59068d0dd887862c00b5d18eb8ac8a35772f11afd3498e912c813419a55a8589f412d7fba095335d4e7456b4a8885b88b72f6da9ddc721e26981736454e0724e8f089ea6ea13cd6aa90da4439d2f2b7936c8b90f0ab1db33fbdf4f835d02d3f5627dfaebc78b51e848cd40bde89a11710721c6a4413e4ed830993630aff7b567a96dc2c0260c32e1b5a47eaa23b1533b37224a4b1982da9463ca4d7790ecd852b3854d8595ce2c6660994212567089d5972c8e718a3cdc67405ab629d22aebc44e40fbaea0835e809f924604e7ca9cc2b7254818e9ea5bdf09e5a92960e45779ed360ed5fa031fdeec56f88f75cb56561664bda0ae5ca3e5a74c80ad8239ccc5e71d27f551eb10bb9ddd838052f8d32cf57209bac4b6836dc5aac4cbba87c88f78f6a24260f77a21a348e3c452d85ffe9725804c1bc835e4768a5460cefc9bde565f7faa819a8ad48c962ea79a885b55a724a216a2ed04da3c805cb607d933bf36349c9ebb25d6a949d41f81c31a7af28722aaa5dfaa3aa5cfdfaa0c378b3b8dbd2d7bcbe603b2f122e17897a5e4d5a24726ab6cb2c6e77509a26e2f88182c3cb1deff29bf34278684904d452fb05439372e0fb4b52bbde510729119bb5319c754acdf24bd5b28811999d9cb1884fc1f6725b0c578893354d2acb8261a22f9d5bfb23dd3dd2f2a31096d10fca71b307a03d665a57f865d21b87edf6f7dadd2b98918514e31d21ccb0f649ddb4765a581a0dc88f68ea104a01481970c6c2d8290bcbcde1d59c8642575db0aa882e1fee737206e2e28cfe605aa898463929666cfbc1ee2e04a7c5b10fdd37ed83d3c801e27282a066517c07bf2eb04a820e905d9bf861d6b2e181175ed58f6615d2735a2072fe3bba85ec8819bf13ba2f8c640383194db7a6c51f959c978418b69c1bec5b3e55df7979e9eb0431a4eae2ef80d794d9ce879ed189bcec91336afca24946bd722e6bd5928ae7d0fc4bec31ab697003628c6923cbbd7bec571861a25da51379611640101493c518692f00d5495d91e2c07437463b577c052b747a77349732d872695d93088c8d8ea5ac981b0b5df0c1309f0bbfbb3a9a095465550b7e764c2464c4d894d3ae8fe075d3c7dc32fb444caf360ca837025fcefe4c0b0c0bc68ce5350a3737220dd8ed0bd30b6bad3056dff9da84456d42c7d6132e71addec5312b72362423b318c6f3197fbab6a4760ff48368bff2688f36687b1d79a0b355e36372c454ec27def1e5f545d5cac50768c8a0e56eeb90ed319332b3971ffd2b63e072273d954ce03d8f0a036e21a6c3b4417e1fb5fcd4af782f369538f8e7e2946f72bd05c76bdff04dcb0fc614091a0fb237829fa93ed71cfc646f25507dbf207f6f7b6fa538aeb773a7acbe1a77dccf2ebe0c9d2f118012a1631fa154d0e1c4c672955bbd97e1e406319de551d718c8a6a32e7f14f95dc1b17c67eb9a2e01aef45dc0707e966b12969b55294a2cbfb5666fba91c3926817927a61c4ee769c439672cecb3cf4bf5eecc5badf31c29bc40344d4ac261588213e0767a1a6053c8838724c8a8ecef767d9330a57530acb8c9fd1e6f5b3cbaa90089afb45520c2224262988c34275a56783e1cbc42079b07abf414e59219368643f1c2bd6ad97463b1839b1febc578459ba55a01f9140682fa55e0aaf5f28a47e6832ccab11869d5f463e42508fef9230d0cdc2f2e4c8d00a05b7b4157fe076eaee1faa4049fdd92da572e2442632d7c6619891a81ad1689ee354e4b8e8d17f22d6b274b950d466d73f2415e31ded3512e315d03eaf49b7a05b135fcea92ee93cffb24f78034ef715de3869089eb7b2e24663f1b6dca30a8bca955d90b5c159d4327896d02723618d05729e98d4d7b704064a0a1bdedaf9ef107353cbd5b2632116f834c4dd0d466076720fe42c0b05d605ca7a507a7bcfd282c59b48ae45f95d3b447b2e863a23735872bf175469b1b3e485302c8cb62f5f2d93c2841eb8c402e4f3961d2c06dc111b7214ca695ae1ee8ff24a2f26dd58b6ee775567c454dbea7943dd27ebb4571a376381ad554fe275a7c3ce8848eb9b85c333650d124af4428309f0fb158bd9f77772563892eeb6516f25d9d1e655dc735597a26f2df5fc696a52b804e09b5d904b724ac5e5d6ef37c6eebc53a85473219d41418a4811df8a433601715a9bf5f65d721b486f673152e5d9ef2017496532bc16a3e5fefead1628bf5bb1279b36972a54d1f21b8b12554238303115d44fb36d27311e43f30e6bc39d8c0cb3fa10ee5b729620843c448899a08989a5a80882a85a7e69f934efb2b97e26922a4e51e72f729c68e2aea686748829e4eb2a277cc946a161b48c2a4da0b1d4c50065222afc27ac0047cd1192fe7f60620d100a67f125387207d8c4351623161fcc8f4afc45725a6f2038fef1c5ce89fe4ca59a193e20bdc95aa8e873b0f294758eeab302156ba294c8a8ffef4c5034dfcd814ff706a95be8e1cd1a2b7d0f7522bb7ba639f972002683384c3b16d2b919f8cf66d487c34e9c8525f9105eaf18c07f0513d5505dda521f6ab4f6bb8da03a4857950e43033195c8c82c04f9a7ca3846745ca6de729bf124f952653cc6416aef1477a221388943bd8270f9e0359f32af907dea3c721106d593069ed074f5fa01256c85da90831c487aac1f945afb624e2690961568803e24185da328dcec75434249e4529010014bdeb85e0aaef3470d5ec409f672601a8934f9524030e15c3cc5983b62ef215be3d54029e1a2e9f520b542879756a3fd7a07ec1c16fd5607d9d123eb15252a59e435ff3275774679ffcc2e7172729d13a581f37a5993855aee87781a235a0807b193df297690d7820c9c7f445a720bb7e20fd1a13ece1a778a74ff04bac7a847633fa76eaf0cedf3e994fd33c52250e69c5c7d503b93bbb3ebe83f2635d028d1447ca237a64bbedc121f0f79917211c5809d16d3efac9f5cac94086ff7164f1579ccf9d8780b63598d738956ab726c58b3b3e101da29db85d3be91a09da6ca6b6a2395d2dbd07e093edc84813572b66cc8a0c3f2e132e2a4ee64a7f19f3d804d6c56be3ff7b6280b84e5a20b335499757c08e2912bfc82e8f605d5f31d309faa7d5b71dc323ca030ba8ed82af246aaf89aab4ba47b74837171b71da2097c2dca43b8193b3a61a1d7d063b0f19c7273e205afd84cfd90ba092af7963ef78ecd3c06baaf18233dcdd519392b88135fa4a6290888060936050628a25fd658eeceb4f5d9c2c522842a28faa9cbf3ac72f0e4541201f4221faf16bfd7ccd222fb017cde3216b63fb521e79a378d91e155a22a7750eafacad6f14f546501628d401d8f6d5823cac9e7a7f0affbab231e726eb94faec17d25030d304a1da9e43d0056c6bb34f451c1df5546c93536a1d472fadbb9630342732fae1b27cb2fa41472a4886cf7e685b5e7a47845f3a6d7b43babdb0f7baea989f169ef1c32b4b32b658ccac227358a7e6853aa6dc848f81372777059edec4a7954e9a13e3af7419e5c0b8abbaad3233fca255d88b49a0efd72a192554b1eaa3c06c258762ce11610f23a59d5ed48e19988dfca757e4879265980cb1dc5b00490aa0a5b23a76781cbce4b30734b5e1ffdf90569266ae5c12872b9c2fc50938cce71e89d7fa028a15034181d47fe6f6ee2e313c3d1881846e31b277e77562de13fe7733a28cf70ca2d08221141d7b7732a1e661358de73359f720bb307276b168c33501375934ccc5140d5e83ceaf570b556ef844ae6cc417b724e6ffee0035f3487800107346c069d119511ab1a03c1f8db2ee736fabed4c9727f88927d45f56f7be5088240fe8a0ecb21fa03f313f8de0db5e2349f146df2729b8963a780783113ea13f632cebae9f6b5f3efe83bb5b198075fa1d7bab9205c563673272dc5c156f5aa45a16dd7692f20070505b929599566133f953353ef72fda78463789e522be43fb087da7cfc9d714b07c3f89ec963ad83bedcb276e852bb355dc797a5601a95bd257fcb2ef8ee46a1343423d3a476cc7446074de6f0723f48008be04ceb7dba12787cdb84edb706a204b170b7856250c4b81b3f7aef728103593bf4b37b5a73d8991029699fa7c6f0c00880880a61cc8ab4f614f5d369a1c76fb38013c3dfe10e51d348055d3d602220a7e8ad350431ec2a5e6fbbb6728636d4872f635646308851233085d2d6ec294e3a1971855d1a13ba3cc14fab72d3e90e677699528242b2c44807456d7a5a0f273eb4a506cb4fef3c2a64b3567225cd041ace1289d6b1dee2e4bc1edba69aec2f87e04e2aa5f7131f991c2a3472f9af6bf1f17fe41260d8ff33c83c100d15f4921640fb0b067ce81db62465635d906aaee619d70e1dcbabb918358125269508b605d79080c2f42b50e56c211d7274d2a866e9b5e1e5b8ac8218cb623139f6d5007fc581f5592062143982f2647230c4a00503c50e5dccac79396dadfac019628def6aa52e64bb4b39c86e04a94107bfe6401ca111143dd8fb548e1dfdd177482f1dd7ac5253e45c2a917966e272deb84c36a6c6cb194229cf0e2e3dc3edd6d268160fcb4c927a3702ae2b8274709b8b95ef7af90f7ebe1608b39eaaaf1bce0ec57205cba5202c33c89ddae44b46e2197b3fcf35383e0f70628d72fef441a41356818e1068c9feab8ce1825d3a724d6f7981cfb707a3b4fcf9fa11f134efc14b26bd7c141859cda192061bdcc9726bdad6a030b46ac844017d6344f0174c56ca8590d77c04e070770c0abb82d672e690d24e10cc6281df48fc297a5f569e9bf75e583f90ab9257824e140fcc4b7258afb1f107681b7a1a824654894d6e07da18b00ee93ef545a3b8bbf777fed254e87887ab4c514cb6a67a3b0b31609b68ead81912d59e4b4847b0990a523fd1729544b226f4c3efa7ada70d0edd4b4f1432b0a2ce97666c9d2b3ba32d9355f96dd0e8a596150923cc670d729df35e3bff9dd01823997fe745f2ead07c85ab137228d723a4c830d34e9cd4de2dc3deea81807c64a542e456a3f4b12f51802604723a3f30d70f2e5f547dc2263f2df925a5a6699e1aff143d2a7b29d1bd59f712466f45798a457a4e07d58892ab2b53916e8f951fe746f21dff8015fbf1aec29b7262944e2fa59227b0f6669b2e902daf4e237e1e04ff211521becc9af5a6077d72c912add0fb9a54c8d62eaa8ab699781629d5253a1b92efe8240ba664c0e4cc72da8603b1d2eb02b6156dd209867cfd985edb0a35a3bc94891a8233ab5eaa2c3089912581748f79bc9ee8e07ac509114429ecf6b6911771861299cb3c1d91e472cc232cc7a416b0f33e7b4e988a3501eaab41d3cca886b13686e11190c9b5787223bb5e7f36987570c8ab7f2e8f712151408f8fcfdaa941bcf245ca19a6aa8272e1bdfebb3db3f846c7cbeea74135f3d73d9b598386e81f801441f563c2be7e72d3d44c05a18f63fc7f4e5857880d6c14483d02a5c5dbcfa1f35a9eba80e7ef4b3925bdec91bc5527405833bfb6b336b448cd637c2fb89c68e2594058aac3e57296800afe1ed29daec75dadacedd7e67660d0aef9ab6c561623039d0e33a69272e482f68a2263727fafcdc034fb8fdfa8866ba613aaa9f1455d0446d1382aa07299bd4947737f0d1af82d85f7aa32bdb997b67975df852061ba309a34b67ed972241110843eb7b172718449be3ed20b30f50c30c4c059638022e602a21f28633e0eac19e1b693d47c0db3f6bac09aefcb2e24dbb1acaec21652c7f1f21ca5c1722cbdf76d1329a774e28da9e266f60dbfc52b0d2d28bd85947f334a275a433672ca6faef105171e110de0dbde0fa9c3f4fb367af223d77fb16f1f8274e860367224e4011737a176efd6db9554fbdd8dadcd6c877cab05357b9dd6c8ba23d65c6f83baa24c129e9bc56964ce0bd59aac848b65f708d5ca5bc47a645a39aa59892e06fa2fa9f147d7d24cbc6b0970c71222a36481c94549b010ed0133a7c1e91e72428b0c761c3ad5b6137543bb8f13fe31a6f3dbc3f7d9c90597ac406deaa10572bc39640e72466cfc0cca849f29ba0e971587898b5c4e7d91e5855da1ccedc572cff1d4723565d1b9cce424424cdb7b021ce8c6dcb931c6d3cbc3e4871207971adb6c93ba9015ae6601e1e3040703a5f380f57091d55b8378884ceb863515292ad15aa619673056e61970f97241393e39b1b8cde36af47642dbe0513b76bbb019c7299daf0d6fe1b14bc9e1fa6fbd693c867ec0f89eb1f7648f5e9a9a032ce31e51b7d832e4a79aabeca092865c26fb18a85bafac724519a330203f86c8586e3f575e269827cee14319c185d206f7cb982bcfc0c30ca3791992fd5d6f708e8464d3da134cee83b9d144f42efa77ed982bafd67b789f76621e4b7544cfe4388872fa0337ed44c9b41859227e3c8f69cdcc7935ac2998ff8e6708de6270d1f73a720081cdd60edfe6ff20e800272b9659d6980c75a739c454273bd8e6be836b3b72e51a64d2b84a3bd39d4bccb08abe37f7f8856630de6a0d07027db8b35ddecf21ce899d84f9b695e436c4c3753e3552a25e7f977d9ff8d04bd397fc510adae37241e3aa37f816a4607e41b4e38c0a83d7b2da56245222012b4c39f6935f394d33da40e46fa54887de76029fd994a4f1d2f65d5a4a2dccfd293b8f1e521559b17287aff20c39af4f2d079a50263ca0c3929045ec7d907d99290921a19d02f0282fc25a1dcbe2d33608c1196a536ad0913908e6b38ae3af4b5907b0422be5e55d72a0cb0af440ca6429f72e89bc0ea2750b85c9b9701ec4e43136d73d18db88265c10e9b22a4498ee947636c0a98c36cd1f78b9cf76a3bb62e2fdcf1d636ee0b664fc55ef808b0d29be1e696cd531f139f7a30c2fdfe9a5edead7063df1747cbb052b8120f55bd89e692dfafa039232d2be80a2d472278436c7025c1d9998aa1a72420e75e32a719a3409a3474e63012bccff4e116fad533d91580fc1f62e799c2c46282f53bbef46080c36762f6ead8ea9df9403afff560adb7daf897f382fca72107ab3a2dcb83929483c6bc88158fc6edd9fb1987d0967149e0f28dd3985c072acce972702f30a631b2968a322b8d3bebed14bd60ec1c505e23899790788aa7214b500c659424f87574978e72bba08f8e2bf7a1777af86c251e6852c3001d37251817325fd87c8281064faa517029d363f8b1c3caeeedbc6c56b63c9318b143723ec5c9503af2f022f1a8fd729f3e9f54339341576b67a1a81f10b67c63caa2d1b2ae2f6340421a71b618c60e6eee73ee044fce64c335714e2c9b24391ed81688adc4cdb2ee2b3b5738d62168458fcc93a0936eba5bd0d1ecc7dcc94d93e09156b3a39ab8ede977fcfa229e9ec7f66f80286520914601cd19f62e37ab53edf28edb4e5eb8dcb04e51f7f8bed34ea86b0b4f691db385d892ed8a95ca39c1de77225ae437b26b7c14653f53ec17dd006d669c9485bd053fafffe620552ab207072b9873fbb82e36a2ed00bb3e58edb7d0c78144dda96575c1ca99b891af8cf6a1e239fd5459cb5f19bfaa3feed60cd2ae3bdbbc55b1ed01f62591ad31c28f99d72acf1c313c8a119189d07513e8e88e2dd05430c1978eea5bbcd65722a8aa2027254d61a89db0ff37566f7a17ef08914ea6bb664467b166a56456c54204aef4b72b379477375404e92eb6b7fa112f9d610fa9ae55d83edcf89d805fe05295d0200d8b6faf225ffab5cf5447c9a24baf3327f6347b4f778bc28f8b2a7f76341915fb73e68ac5cfccec0ce10fde844e0483f37a3cfe815506c33fe44cfaec1b40d72398e9b501d51b0ae7cdc0eca5074d87795a030a7537bb20e64abfb1836751972ef5642908c3fce5f7209359a37c093edec1bbc1a8c942b54c8f796c70bf9d97290ac54239fb39e24f9ce2f0d12d9f6fa87fdcd5f1bf1652bc11c0cdbab30695538d71fd784f90e60f9a90ef7cd02a7a76203822771ca4a087d6bc81897e70272d96d3dd8006ecf36ce3fe255c39b60f76d13316fa7dbb33a3e99339594358c72f3e145a14d7f05a56e14230d77618335b3246f89f58c3e90d39dbedcfe492672ee12148a09eac9ac3aaf670e2c67645712724550ade77db9a2094ba8d0aeb072a28a58a85409e2f6b9c78357e32d9b33347915ce3094cc50709af92ee7288872fe92fbccb571f46263cfaa6ed7e37e34f78464669b16f7ca73f9963132f4382a8ac45d02c17f734b4dedaf6a535fd4b49801a5a4a7e580d06ad3cac7d62b0540a4db72f22c73b4b58a4a6a102a4fc9784d99b1231b51d9c1be880b994142fe7251228cc20102b8a54cc9e1ae33e8d21d6555cd5b5ab960c7346eb33ae768c0729427666a3644c5028112b0f2d0fcfe4185fcf873dfde3aa3a9b64cb36d27df72b027ab744eb148fa24cfbd6bc43b8b08feaf289214603f85e06a0f3aeae92372519c78274eb393c694e222942c482182c19e257fb0ba2940b87041d64d0eec4e04dc33246eb6ae3a62afa8fbb22f2ea4e734616cb5bbcfd3b817a172cb401c72a8c3d93e1a15efd8a6b6903626b4b3eae2ddafc6425cc1d14bd41e30eecd7672086a7f8bf95dc9d4c970eb6b1f20ff64027435cc19f3a0764e958c4c44e6cd4fa67026fb937bf0b2ca239772ec5235ecc6891e093a116736588073ab8b12c3727067f26fa63d9c03dc862c0aeef76bdf2aa196d05da75b67b4fbab7d4855f972bf9c833b1d08accba4eb3c0863804c1b38c423af551bf5f2977204215ea660567a45fb05a7f86298ea052de76b64e21fe04faa0015a905c7155154731b2fb472008671e14eae47c21b16e5b40f91f1704bff8088f62b5bca22b030bb1fab61727b8a9a78566d818812717ff123be9c4dd693ffa1a6f056e26ab271af9a8ebe72dacb8e095cdfe2a5b1fc14eb01935c72ab7a7d0eef22667e4344b11b46aa3d721f4e6f59ac99b03799b5c1a9e164d24d226f03428d99c43c4e4d277946a4c515d160a022ed66bcd79284d5bb06fb65f2e2b2df11af7ebb77e82e726fc640534250fb37bca1b0de6401c8919ed45364dfd0a712fafdae65866ff737d6c06ae969421c0086a41a459c45fd67406e046fe63effce3d6b6059088d18e7a626ec3972dcdb55bd916cbfccf487328e6abb724cd369ae409addb98b28a1786bc77e971708c7986cc5fafc7090972d070bdfb4be3f160febe267f7c847681c9cfa070e7268a9e8914a888158f3599e430daee704dfbe6ae00a3b1450b92da8b418e09515fae7502d364bdf343890628686d0bcdd17ce577ddba3c91984f1e7bd98d4ef72966471280d9f77d6658627030782684e27f86fb16b0cce4611a4567e43095b41673e0d05bdbbf33bb35a1e742defe1932feeda1042fa4bd6086d2bb447673e3d2134fa328ee50608d5439f657ff045c93d30474a61f3d422a684a71d4a1ef0727b24213a5f181d75dce2b103208f7cb6a7dbf38b7daecec534d195b484f5e61847cabdb9c6a2e3127d8d1e01d00b42e10f42242d8fedb3e80aad3d652948694267468b0d9e8561862cc335e778885d651716de2d9436c83e66d319d08bfc500192169a47f82a01457260fb18758eacaccdb5ba75c35441cbd5990bddc3ca92563c7c461c2efc379a79455420b482a9b6aa355f250114ef23ace8b2a3afbfa57210157dd86f32ed7210f2753d7ec0c7100991da27343f1b86c32426330fdb9c4131ef3c1915cec9329f0cc5cb9132d02dc2b241cb5c46d974cc4452f5a2a6c212e1df9703ecc3438726e67b692b863ccf6b9fabebb10dbac41305dddf00434572f4af6d5fc0706f73849f16aabffc8c3d2a94036e9ed88c8da0f367bda2131f72652ddb3e71fc9ad7eaafeda0f9c73736facc190a1fc9b40ea9e33e30389dc3723212708d7463d0c441fe7c111d370264bf73b7ae7049791141ea22e38948727239d7d6cd0456bfcc21324ae3380f1756418c740cf45b0ad3f5a38f3cba144d722e35bc9a29d8b00c5dc9d45e70f88d3e3a37209c2b67fd8b5b93d0f7ca143b49d33b1e23645947220105d33e8dd089e9e5e16a657b73ef842b6970b3da023c2cb505ee8155aa0caefe03ad8f36106e1bf657c415198b74939a8e4892cada2a7226abde496befd2754d66e4e4213c4b2d9e54bd85064b828ba7df26c585d7391ff18e3af51601dadb3d0072036d26ca11276f3eeb0eff04cb8ba5dbc418321972d6520a80dfa7c856699010f65f970a9258ffb0b00a4973ff693fde2300a72170f3c7693a90b8294b445b92c91ee87a5e9b5718996c1dd8adbc30337aaa2a8241e8c159b4e5b8f4beb2338b3bda1576905f8fe7b09e81ae8e7c0b2f90bfa1cd72324aec32dbfbb01292acfa760f47cbf7d80089841fd7268b46164ef1cb7729725df409959732d911f4d3a7c4efd7d285067c57d30c6cbc98f4ddd26d70d1fd72a6feadb80159f28eeabaed725029029f4388a1a3e0f75a5be253d524c45724723e25d3fb65286c9f6d43f6adb6ffe2666ef1687d9b9c0f1df36bcb25f2859072af1c68ac2c867f3f3ec2d36b26fe5290d6890ae8b2340ec73c019445adca5c72ae1d918c726603c04a22f9199a5919d64fa867579592bfd4b77035122a9ce1724d164eb8575a8feca668e8816a021e91789767fc84ac33d340d25ff0fb81ae13d5487ae158d4eb2852f006424f1e85329efe8823cedd0c55b4b427ba603fd7405b46458c0c2a28e49cd3205a84816a73c1ae106fe9c94ff0a669020e4a8405263cd838ea3da8d1f508151977bec7feb939e2fa84aedd40fe45e622cdc204935490d5b2900232957a943763621d10e5bf850702018a27a3714f1efff917063472927e885f0011bd90859cbcb153af4e3a842965eca67f35455d5c37c9cc49f072235e273020156ccfce1e94646d1b420fc360c621a37796707a0822bcb2c85d2c6b1de240464214a33c41253b25a6c604c2e33e48dc9c0cf3002a4c853d83e47284dd4ca76a28d1b9ac06faaf8351495867b64f29e56413b418f422c0f3d370722b3142b78be1cb73ff3f2680240aab480de992ab480699cd547935d158872e30db83e536cfcd4f084b79080eeb50e2d15470a77e06c1e2d78d27ade665aca9722ce7785c20b77e797413fbe2137178bcf13f8c9f59d8a903461ddb16f7793472a74e0993c1ea1eb2c4b4df2069cc2f1107750f18c5c4a5a1d65cd315acd56872049a05fbb592b04bcf052864f4a896a0137262b9e5f41612298d25f1221ccb7290524478ebd5ad8b71071dc80666b13c7965f0119a3c8436bbc11ff78b45da406a7195a794d87404b3ae55efd95265fcdf3857c57a801091ed38b4cebd04f23fa501494f18f549a367d465abec69d9ce4ba45a8d39bad591f5f065fc4a626a727ffbca0feaff8ae72a88b30f212fa688e199ceecfdbf6dd7cde0077d0f955e72bacf2a7db9fb95b7ba7323e12eee634c87dd093b2add95eefb0dee4e9762847202c0195cee0f5318e8e83b7424b720abc7da89db79c6c47a847ed86768184c72703b462b41dcc5193856d426ba0231a407e98a6174352a9a3ae044d2f65e082a5d01775fd0b834b4ffab54adfea2deb5b0120ce16821902b277a3372d50b3f7226d122d31a9c353aedbd347456323e9bb332802b9f3651324db85533d8bbf87282709508a11d10c5011a7c2d3f15f67ab6472ff7eb252843761d174aa21e42729e5560daddfd4f7aa1be8e93ab2c0078a8783c35c75b7c8ef75f81e768e11172b6a48bc0b0e6ea9e6ce5b74a7316d14d04792b7328b8a10987ac8b05b5127e7242980a7489269dbdf866521738b4129e03a554621e997dac108e7d7165c8e834d5f0109485bc8d1495ade3f1239d3f24e757201c9acd693f37f6767305299b723a5157eae97c7571e6a43b94bb201d07cc5bda5bb2acaa4f208a0a93f9cd4d6d8199b100b02fdded8b36540550fb8dae3ee1d743dcac43494a6d0abf0ff98572c7f7445f4e1beb048730a5372c4ee917fc7106e504b02aee44e0a55a5550c072d66607a5faeffb0450129f2136cf1d256a1a5387127756954ec7f305a4ee45722477b7bb90e9e8c8689034b15f742e347ddf2c5db1b3520983c3b106195010463d53245db79e849eaee70c1289aa7105b5c9c223cf51a055197fa88df6aaf072ea03f575394e64a2dea01086d5604f66f1428f6eb2c610c92fccfce7af585e72d2f2cf3e32ff94987b5e916e01cb04f7c1067d992b61fecae11f6e733a293072d1bdf47490befdc33de9d21e4d895c0b905766a7e75c17c682cadf52f91244722690a2e335ebba4bb65d070935dbea6b36115fe014bed4f919af43f9adc67c66680e0f1d36ca81d4d3f4be5bfd4fc58f935a46222d82e268abc6cf3d41f15172858dbabab4b4330303065d3d598dea52243a9a7920ff3c6c3ce246a70997d31095823e745bc5ab9d8b9066588567f988b17c4f39052b9626d93cb999916bb137e47e24f4e2c0b1fa131c5de30f33af7025a467a4002068bb500f3ecc137a7e727e8a60001d9489f9ce180c4d9b3cdc0b9f0421401baedde920fd97c9a4a6e72c406f165c2167ed79a91d6dff3b895637c4c055428d81ac55f62e5d32e3d24769d238be8d6cc44497024477381aced561a5c4847c178aeb7ff2ab283ef0ec1b3b1ee727cbe06d860bc519a989e1b6f4eb2e7f2cf3837be161999a31268838a2727e96e7eef608e36592950159535e04857f3acb5a7d7d6685ffaab2d26dd11972b39e5ace82d0ca7c62e902e09a395bb2ec9a153b45343e7976661f2fadcc3c7236e8b0305cd75806840176b46b58fa57cac129fb9b2f46dcc8f47411bd64e872e4877157fe509a87a1058fc5942ab4d95a3d2359bd087819a18e810e1b4a2718a933fb613d6ffcdd8ee2658354a89fbe7eb5002e1f7499cd6c75e59edf9a1972248522ca7e4da05195af522991dcbab94bec51035295e0cc26880fa1ad138872c3687cf343c8134f027ceb6d07cccee2ba8d75cc529d3de165e220af1eee5557cead641f59d4840e905114a333651449441cbe4b137b5d8d36b4441bc914a248d2b3b5948144c02b6919580c2b72836cd716b1c59afd0f898132184376933e6965f4d7362940f16f7b176d4146165c565e07049112644099a29ceb05e296337234829174784756c93fc1ad73ff36a7421ea038afaf88cf786c5673d15a2cb763c87e3b73ee9efea78daa7c00da124a2339602e4a239ddb03b04fe0afaa89ac5f6237f6f11b9d7be55ae8c91c2e03206797012e81483f09f3d2b986b45f5afb721d7360b174973f9c032833a94698edb476f7eae65974ac50144361a21409ea72592705e25a575c0d1505a64bc7d295843dcd54960bfefaf0613e30ec749e707297d38b5cc905eb8aced3bd3b0067f09b9e4482cfd4ec782b780e60a509f0e74aad4a6005ea11d114bdda3e9ee996197f12ce014d0cf473a415e4f0afbeb127726118ebff2caf0423a02e80ea2a261c2a73af2eae99ffa9f4ecc6710ba89b4956318bf4d9beda744d5015dbebaabba1ff1d0cbcfd9ed1836324cbdbc7352b4429335fa2a62029d87b414c80394a75ad19a9144e857e9ed553b4fd126411df3d14c4c9d28343f46c49d1278d31df6c09f88c9b56a287bb1a8fbb7d96abbb675a727c911069fd3707cd5cbf55283cde2851d52edf8a04868566f7388133f5950672be7b985dfc3c0981c7769067152b9cbc15f23f74f8da2df9105cbd6a0132cd0bc919dc0dd8488915e52f76e69b119b47099e9077b70f5ec51b2ff4fb3bf99272c78f76c3bde861541a04a482593b400c0bc861a40b457cdacb20e4f9ab11af728b5983f3d7bd6fffa0bf218f8354cd960c5c02b48fe580d8b36b88c8c071f9148d073e3fa4b0a7eff9898744a31ebc74d29855c92db892d113d6e533e5034e72b6a19e7b6d0bca707fe1ebeef216aa7147330c3527ece4eb015f965b61b93b7254de1f1aa1a5a687a1170e59ba6680358e221e16e81013a4cbfe2140d04b92021d795052f3531efe2f00048b8ebfca69976ff853700b4cd5f7cd6e23c698b372494b436b6e8703da569be311916cfe4d51502dc2c949e50ee9cd31de5fd7e372cd9369e26a57b392e3f1237781e551f574df15c351c0a0af42286877a58d397265ff51e1cc2b4cda99e2014de5cb4dbffa21c9d549a8ca12b494ceea3cb088569ea5c243d3d1221f9a2feee89341cddeedc85f48cc1186121c2dffbf335d6d72145111e5128c0f0f0f9d13240414ff4ccaffa72d3270258d49f2866543b31b725b1d29c24c7a5dd2d47d10c5ef15d78e9d4092973bf6c8505cafc2ad1cf1a73ba14efba0f1c3eee5f6102384c3e3548f38dd3350e067c47a32a4f7df59551672240e18f02acee1a3c4bb954d88b929f26863ee84e52c5e6825198d51f15efd724b4268a30ae59e198c6906de7bb2045813046d3f7ddd2673fe02f3f38023a2726483ee17b0a9121d4938177bdf1fef4bba888c19c316c010e3723a63d02b8d7282fcd5290ae4e104fcf6646866a81dcd51e86ec79bbb5416f3b224cc5eb58d5fae40ce684a7328bc078551b2b2007ade81b199ee5573a854577e2c1a8b18e872a5c214917bbd585ca55f8608e8f2bfbd7c7adcf3345d53ce0f708870e968fd72b74cce148a3a96007190bb8a089304e3d576b582a1049de7f3289472ad52b45f9492b52acdc2bcb3c235a15b1eadf76865372491861a8b7e6127e3c122515572a11804de6cb35cfee2caab2b0b76ecf5208cfdde6946e0e48b74fa8e5a5f15253c17a23b9024507f20f6d628cba51c5db51dcc1a5f1b012ce72c1f0b3f900272ce5fc88f8a5475796a84faf4d92b0ad8b16d46b6985773c6306b722ab571a972cb336a01aba8a68d9ea27c21a3ac9fafbefccb6784633bee18aac48640ffbd41ba90e4905c9aa078257fdca793e3be812097151127e0ed613fa50cad4f9b2155da4d6d554b806655a157ffe9b18757623a1d8ce86da76605099263fa7c13e672ea74c2e4aac2715403bd4d74590380f98d751d19e176da963826b7a5501026722648097dbdefee90ba0a9649d2062e336a83a44b12dbb0820f944d2646c2a76d3fc915cab6e5fc5bf57ee997313ec9d814cd1a179f795d49d1eaf0070cc3270caf9f5f32d0c76108696051ace3977a02074712fd2032794d4044f494f8e9d25e96ef9c983204bf985188acae6d0fa22ab638fac5e46cee100a6eec65cd47520ad21732c9bf4552462fda28346dd438504678ebffd150711fde15ba5713391c727f2e4c85edc6e795ff5299474ab35d33f6dc40479cd41c678ce179abc9247c3b09932ae482a48840a0abb0a1b94fce6b6d5454a1cdd2b3fe02dcb656ac8eab5473cb315dbdca8bebfa42ae5129c6ebf500a37bceee1f1fd7711c80ca66676750cc264911a4f656e8f480ae31beafb4482dee8dc59190c154b9cd8944c2291429d8b7e226e94df91da25b8c747463515e140313b98d11a9539eab52738d08111a3f181278b67f370adabc586209a770d22dbaa852146334996a9c6765f5356172c47277133ff77a641105288d1233b835f13d428d487ee23404139a30bd41224571ba576d84c79b7bbf810969dd3bc6a0fb2d1be4b339d3e74e54a76f948bbe50c264caafc5f16a47dc16452b4a3c95c6c6e72debeac353c71bdc36167277c048646ef5eb312db9b22dfcf58d8b843abe77477199451c37b1328b4efa5f6fee56a1d1dfa0e9e655258c6ad7bfb09906f4bf6b9cb5c86e125115e90370a57ce072b485657ed587606f0f003ec6bb77f118167ded341a641b611561f40a34cd7172afdbdb52ee919da38038190612d52b79be27004fbd4234af362c2e6372113f234f8181fc0e6db093822eedf13bf24fe5b9e4d4a43ac6a5ec8f03ea21482acb720ee0284071f98b647fe6f1c25582f047c7b4dad59051aa7c7cef5e2f7ecbbd691b44a2a8cb36fcab1df9c9047a28d277841f5c64b427776468c0028877710472de6d2520e0531bd2394b5a121911740a3c3283893b619e7dd41c191dd0d8ed727ad6a4246717817fe6333456be6c0ff0852c623b43f2cdfba6d3fdffba91381c48b41797250743dbb93feb8bd18bdd0b016c34bb495356da2fc13610bf7f5a7270c3fff3adb373f963119b3b01deb08f52bf0c6f66d818f52f6ff2bac27bb026e84f38a44173dd486f41ef124384c65de25e0c15223b43ee14d4b4cabba9647239d5848623e6a6e81b21099282813cc5c057e73f1d989873e982daf7454e67727044c2877258248a81b8abd41019d0092c793c11e3f9eb36ddcc5ad91c522f6d1365f5ac914d1e6cc31dc7d18d26fd0f8113ceaf1c8e75f1525f3ffae5c2612fc3d0b6ab106c6a87e10260ae59f79688ed3971db359166f0eda51596d4dfc7591421dca3e7fe4524bd51da204f0abf5a3a396fe41cb6400057ec1ac8a1a02a56205ee73acb926f4e0b0864d36dcb8b859104c6e52551b2957c1367aaccbe491f9eb186a5e42bf8adec3ff04eee477e43f1f7bb9ed6c48053c26fb4958d8581725b6ceeb3e2e4cb5644c10c28549efabb0455e8b207c5547a9a4c213b061fd9727a2684fd0bef937d8064df5c616b0d29600f3279ffb21e262f864824c84ef906a2dbdb027913fa739e250a9071243330f69aa2d20e71899d59fd7f8240b5da72cb002015cfc76e6bd326e8399f185c6392c717e26864df57f5f0b590df172672b8384b7f6c2f1695e10d1cff0aaac02ec77f7bf0f30e807e6074b9192e2ffe724c48dad36dcb342222ad4140bb4e6640b69513b017711efa12285f4ae955a13e99c6055b0eb444c7db62fa8a56097018af08faa1581b9dc212437b894c56b80860ca967ea4bdc30a58b47ee50687967a2a3c4f1b012d896fc376a306247ba6722d01bca9c29095b6c7d68d9e0b3cb378142b0938960a7eb28fd79ec1b29a2872fc2b236816c69afec4ff22b8b8d2d969f0b82b0af2d599ce0e92a73baeece572828fb257e58ac2649b051e6e539de3676f5745a7c87a28a307dec243179c956507d274ab91aab1833118e2b419358329c2fa7bcf766a8448fef15269b1175072b08253877e8d3be58f79913997d07e5d88eed7455ea312706d0259ec43fb5372d15698def71eec8f8b2114b967a0c35321a204dee5cf0dfdac8c8fa202298e3ad37bfdb1c24e8d0282c282e4738a3a37e1a85221d64f1b9c8c57fd0067357e72ce017929d6c0c8d16ce6dcd3ef8fa10822a2330a3256a816f970ae4bce46ae72e5231d70369dc6632f717563327a36e1a98c58351b74e633c9e10f32790d1772e3ff58e1414ee45b5f6a87a59544e867f64dbf0491e8a36c071d6aa25922d472617157e1a3871d7c95b2e8d10884009f9e707b18daeee2f3bca6f36f26455d72ef44bb7699c00f8797bd0536cc924dac6eef888c76ad672a71f33df6b3cc1f72188c5c6741d58629432b85a8dc0896bfca1d2122332c4355ba07279a208164728d8bc195144fa48c5f93716acbb4e89a1a28deb0f99fa229520f1626082e641d1e4a12c0f6a8f5c2df3059e666381ce05ba711fbdf6edba1f25e7d5cd6b05372530957868c77949e818b452c8e5d77df2c7cf82f90f23128bd473f2dc7e2d072ff0409e2550b3a6905823e1bcc6fa90cec9da45f29064392a84d9b86dbf9c94caec2a693e1ff15e3b7f688ce470f5c53b02b460059b5192d4c99ee1feabd3a4129930de2aa97859919f76542e14e1f69c1a851d3422ea5efec7181de61511c7201d957b01ec286f5b1746e04fcff19d4996d054af49b4d6d37288beb7aed19567594c181f1d94b8ab40e32c0920e4a520d522ca1311adba319c0632f12ec7218524e9d8db536376b28cd309aa4a3377ceab391330040ac6d0462746c38358f6cf06a050e63c8952974d4cef608c956c90c57595b03ed8218b46c25041574fc5f40f0a6dc3073206f603aaf882cd313cd09a25af45fde90c5e5b6990ef17472722942cba53b0af041e7e545056771ace1219b04a6d49b0ef5d996645cd65eb87222dd70a70810eb25c0b8fe3d1a346e2785ce2a1c38f1847d42ad3c9e0d8e8672210998ad1b5867fc19620c91a860bc2046a73a766c0ad5ca2586c2959d0d66378a561dc9f5e7ad37035e40157302da04cd56a0f7373edfe590a34317c2b5ff6ac088e702cd95aec266da459d1c188f4716859eb7ea003b5433a71fea11831e722e83e351a1791ba97cc2ebf165300a9632aafb355389c9c011d01b81f7c16a72476497f2b094f481f5f6f393d61b99d60d3cd6d0cf4b24df4d7157779ba5ba72468955f6e76d15d429d176dc8be431f371bfb9944f9311dde55a3d2578fefb72a4a2234203b1557d77a9191016f442a1aa79776e26ab252d414f0561846ea4343b3ecf85cb71d0b414ebe9cb9d6d24501d60536d944fa61483a1bae92e9d3272074951b44936dfe83102963b0b4a1c20fe3ac3034e9cc7e2c2baba29480f106451ecd483e548f1a86b3f57a431cbd0b86104ced0757a4e88d667b441a76516724d198ba7b7cd7603f7f32a0e2cfbee55ae07835711dd575410ade8a8d305167287b173d594eb3e68c25a4d4e063904a3a1d24e2a2d89586f96a33379234ab772c3e4991c041420001728e4602a273148a9162eb56bd36dc582aae6eadd272572a8ad7d8f9d4b5e603c5044e8c97f5172c08daf7e4e0c95b38a8118f10e227462d1061adc0355044c2142fafcff14bd632b9fa9726e711f3b3a52e2eae225a236cd2cd276644c3d1387239e49e04bb065d07d51db8331223cf7a5af8d867c124bc2c1635dc3705ceb1fafa3cb1466a0d34408fd60d2b69f8ebc3b825d6bdf6a727d0cf868477584364c14690a00c2e2793a81d373451461a40548570156b2992d41ee6c8f6d5e2c383e7d4ecb54bee8de72a3cfc2fcac85be6b00470b884162722731f096376fbe1199d86e7cf1f351566bd73d78ffb072586cebff6c31c8c372a51ac607627d1351f22ca989322d3e61190506495fdcc958f69764efd2a1f74eaea5b869a4fe0b44f6c67c2ab5d8dceaeee015edb1018811efbe8a735f73154783520ea3759a6acb6671111c956e75c15c94f187306eeb09a8c344fd17b2bb72b8dc1575b45e7022cc444699e6c8d36c02017c627862166ca4b546476eb9c872e86bbda79b3fa1b9e2921fa8451f2b22b7a600f89e0507b3010f8e19720aa772672b44dc78dcc5c775107b831e9988336da3d5221489f45432590b21d5119c5c27a7b0517169db747ad4080cf144e4016eb17029ca7861d9ee3aae593fcb2e7264979c33529b66475f43c0e650572f53f05e5cff1ed04ce18f23a6ba2d01b472bfd37ee926ac2d3784ad377b68c33be90a21c4d71018fd76bb792f30e1799472d43cebf97bd822e4756f4ce4e5ea36e86bff8371779fe9dd7c8e056a83917172b29fe2c6490b5993160dc7d3e4318e9383e51c791d67311f031f0c730556035aed371e69448693912f13464138f1c4ec1502b201bcd2170b7da53a13dea0196bff1c869d818fd5495bfc6403a43d2e7599cea7a85d6f2523ada860906be11a72913d6495dc47b3c671edcff0c46d5cdbc777ffcc97c1978ba5e9f4fdf3366c4960366ffcc4cc23713245bac3af09168c0abc75a7e04a61e793591d974fcf1025671d9b61a9d60b70f8758f8f9724281e53ad9b01986d3f4aa768ef87d871f854e92d88ad6eba9434bc79019d1ed4520adf9b670753031f0fa9eddcc36ecb7c72e49e41485bd61c11333a1d33013250f3caf76da8b2b67d46c747d26a0df75a53ac53d58f1a91b1e77c568caec53b88ac3bf39660ac89de6ce4fff7d393b6aa72424242abcc40b5308753ffdc6511ee51abe7d1e53b5e99cd79ba3767b35f8172a3698587ee35bcfe71131c62b31c373aae4a7a5904ef415bc2fec19ae8ad507262570aad69e989073b331c6b1309df213754ba1872de6a62d3cb2262a8459c7280b174f95567a8b06c59369c97bb172b7144878acc0095884fcf00c07e811249ea87bcc41db3e74474227691e90ec1e86501e4adeafb43f51e5713eaf1947072430cadb0f6bad0fa29e852c098d042acadc70bb241474236ef41f41311602172d31ee329741f233277bbdc49ac424040258b8e82dcfdc7ec8daa799c8aae847232bdf4c54ead1cab53810ebd5cc7ea2a2e7dff847de5a16b63f5b4f6b74ad20baa0cdae25dcc13c0a573a01bb3fc24d18b5e6c40df680ced1dd097434bc2d6165fe288b0e9ca2a59befd9109d482847c99be3f98c1468e2d4f7b0741ab2d9f5cf084407654cc975d552d9a83bf8f31bdaea1c36d913886595b61207ba15b204b210d633ec46a1a6d91a47bb4c62dc69808c1b49dd8e26aa172d0e8d520e08472cb99ff7ac6111f4bb7a1fb7a33b5a3fb635897276e49b2f0f57a95a917f7b272de7f2969025abce969af4ae9f4752f1bc8653b0af158c18d95b3279f158f51724b3a7660c9c84cb8dfe41fd1d62c7d0f5f63c5bd2d5f0f30a6987698f95a6d721f65db54f2b42a4fdafbf39f35743b7ee845f02e9d4c302fba05788d0fe97f72b74e9d66d58b5a3858f09bcaf321b2a2dc3d5c4cbae0f335a9e941b2c7b98372677a45974f65795e4c0e03208857c75f081f563f5074a5bd1c5ee1200167b8725c9984cd1ad442c32d9ff4ffb4fee47dda2394a7a764c0188be9b2b2e4800d658e491667461a31b6c7979a8db7e87aec8552a40b6f876a52933ba43b75a1c94a10b0fa23767f04a8ae24d89a56c6c32f2e502dc025206d58674f9ed940506172c8e78a9385d78f6aa4eb192adcf497c9b879019d40edc2baef5eb01baf112172d2a28c3bbf992e40d4f09ef32e47d71b5426bdb267312b141e450222461e59726614a8436cc5bc7c085d689d5d23b371732a4875898628c9acf339b44d87127248e307725d3465bcb7616551e7baef2f43b06afbca32df787c80782fbc768b15ea6b9858ac2e868c5e4ce832fb6067b5f1dd87480ac5cefad0ad4beb66e7cb14d577e9bc4dcd1819517caa682af575392fd08e2050116cfa7ad95a162b38255cae39f142c03e2ae3bdec840ac4abbc8cc922babc3eee1a8cb4878aa111a6457295bd56f3e57701d33f164416da0ee897530f207c2fc5e8911275bf158448b506e4d57db2885b8b4474d95775fe3fe32fadbe29d5b1473247441ab2c2d5f3270c04e1b1af265d4ea583cd9137050ab08c6d7cfec5aa13f514dd80171e2a48bd720436037073a793f1d6e61678532296d76ae3b2b5b30fc13c01a1f730ee6ca517d75c1dff3c2e48cae5b88c3254afb71d091e2b2680791d5e6dfa3270713290723333f5e373d1452b44a37635298905214caa9cf809834fc6e69a1197345ed2725320442e779a083a3010ace7b6a5038adf15c01d5f1578ea317982c3aa5e960bd82ea490628c45a6c483f1d2d957a96bc6936f95a981569ee55769fc4b37a3720b1c5e024c3657f31ccf107cf5e7b5ef458a0978e469c7033582dee104c47b724c8ec264c5e694088df7854d3843d3a0162d98fea3c76acf7668b9bf4eb98f1920150a8553af1b4523834a2be5b7b51bacb800b3edbdfb585fd0adc575abf872833c58e266c59f4a7ab54f862de913986f65c846af4f3f7c99b53c22dae8e1255700bb43b933a82025a1d53ed07a992286c39c429d37dd000f7eef1c86d5e772218979bf16399d4a2ac50bfe234545d07d0be2390e79b9b9e8d315f330da4c72481dbcfc9f5f46542a45a5e281ed6707096c939ce5bf4539740a7df039926872d7867416793d10ab1ea161a3c819798f02c4e4a497f348d81a3484625f434672c00a72597215c50039ab361026b97b88afa9925487576b047bcf7216c2935872be9a8bd33b0b646efe1865985b9dc12bfc0db0c43b63a2a5f0df7b37f31d56726b4e125a1fb84887195eb4591a3b88d3822072293996102514f315b6d1ded825f7f06f9421978d5981faf4f5f4d52488d21ffcff6b14b04870642bbf50eccf5fd824a648027251f94bc6b20d396f5092c44f22c41bf081c9b8b253a7e39a7972db6aba7bfe5faa14311a003ded27e6a501c99b7f137c364562e4d5b4e4090d7290a94f4afb3559997e4676c214f47c42cec8f1ed539817b076934cc050037c7294034435aa47678fff9f156675a845ef3bb50e5cf63946d6b0e53c09cace007214dfcf0ef0625e1af43926752b7720279749748f36e8409abc729bd1a1b9ae06daec9ea564e4ed301a77ed7c33911ec044d82e9c4296cc173c0f01298506c972ecc790eb0a63faba74adb1f77fa64068ebab8e3c9840be74274374af0250f3728dcd4f350b571306278c7fbecc95c6a98d7a16faee8598801d101bf0ce90471c113e12223604e4cd0d324d796ea5c52a87184da4aaa490c5fe08a00dbfcff302f0c4a94ff94f98ee3b0da425b136fbee8040cbc0670a6f421504b2205cff6d4797124d33603770a2d1d9e79cfe90ff43df98cb43e0ad0858e1b39c2bd1713d721b2222f71a91e26c0c722aba90a22ed5eff33601874d7be60cc6bdf5b98e045b274496d955af3db9196011fe0bc73d7ad077a43368d92e1f20e7e23a4f60eb5cc7f42fb126b659e141ece5c2bc3c984f2777c8ccf7ac55cfe85bed19d15c0458212b30417a74bfe19949bcc3ff2bf70bd0cfb2b92df88b627c086d814ece4a72c47b041bbc0740a255d984e729cb6db1551cbefed7b31e2fd5a673401bc24e53e59433bcddb4fd669f056d437d1c3a2644c75d3fc7bfe1511c43cf9b5c6b5d454fc7f6ec3852dc4c2f38b742f94598c9267b8d52434f34d88d6639b6f8584c5c4f3cc00a01fccb31efe09134bb2ecf20ae6d35a5c09bb076ea78c1802434bb72ce7a7ee0aff4d58b4494d9273614fe054af5cbb3edcdce10c3df402209fd0f42364a2acef9ab633ce4befc6fce152443e36c92f853db5583f9a273de97685a7251b94b7c3a6476a1a063e801d34df7f43823150cd2c433803b8c104d88690a72159a2cd07cbc935f0ac6c3d3213bfe91981808c2c92240bff40221587b1cf472f85e32ce6d093117672e4fc41dfad6e79e413d3f0780478dfc766665d93e9c72f76447f6bc323fffbaa7983ecc07a6e614c0a1b180ee41dfcb5ec1fbce2ce40bae968300561a1f13fb5ecd51b9ab30f7de45ed561e78f2a20f1e1543e72f25723de87b3d39480c5590ebf7fa21f494915766726748333512ca532dd89a15fb09f62d624e95eae3720656a79eb814ac96bbb79c3909251205d427542b0d3f9b1ae39d711c1243412bd4948dbe264cfdbbfe0fc03b725582fed462b386ceac8d729be4ebb8f92c7d4f94279f8f46e2fc0a1c76712bfb9ec4eda7891b6bec250d7204dc32fa43012219740faa71987b0e391346fc6377cd1ce5de8e843deb4a0d5d600eb164c24fd6639a1665145ba3a31d531c05ac1eeeacdebfb9c7c58a3afc2b736e54ba5204d7f8d946db3ad89bcc8b0e4c00f8037cc4b977c00f94b2b60c723618f3f1c33c121b28520fe5fab7fbceea38e7a8c3432958c8a311aa8901506752e7a1bad17c577ae8591eb26c33bea778aec65167334bfd0891906646baf2725f03b83c3e1f19f47f96b7b9c459fa70687434e199d213968086d4d9d414900927138b1a2af36e3873157cce1cbcea1f0afc8e07691f71dad53f660d7cee8172167348a11b6b71a9bb281702526cf82fde7041bbe108c934c25cd237c5d9d311a6c54a24f4a659e0dcf0e299581d23bcb727274d4be19df0dcc536b097d92521565b6b40db6bc877e86de879af614eee0dcbfe4509a95366c8b0f3264467cd72ebd813ca1d9401e6c7cc52a46810babe4b7d4a0eaa5af503633bf73331a1e57200ed85a4339afbd44bd91cac01f22e63b873e36313375b72b2897912127a1b5c33ea866ae8d61ef0653e47673f15db268882e0ce3ec6e6ce7d0da6e1a9b91725e21582d6a092d83c3e841b78a0bf639fc83d3aa081835c96519e9deb6cd11b726c3cc29a12f7fb7265e30fbe3e963d5c53a048a385f0bd702b5ef51f1f59f47260c2fc9871f66848e6c2a8221134fdc8fb39bfed94a11ba4645feab0da53a572df3a5c3b95f7a7ec30a4303474c21dcf11249b6eb0682fb492592d16eb561a726547dfea86695cf53a7e55c582a11a2dd74350f2ef34e88f39e55d4321f088317f56cf5c87eeac3de4980602e69dd3bb55cd71d5f574a681bc099d6b1c939272537710956fee24aa4b33bb98e12eefec0ada917fbe5322dd085ec2d3b9a77972c0e3c7598f346ca4e9d173440ae1b36c01f212cf88520ff53cffe8c45feb7972ac33d4b0bf1579bc6f874e5c8766814c9359f17706bb6f3b8bfeb66edf4fc172ac2e55382f6da2e319e81479b476426ff403c01ecdd565edcc13e49e2428be72ddd5efbf2d7ff8346e9bcd4d5b91ae8e88607ac4b6bf5b8c1918cd0f314dad3daf77d2196c92a26b00e9b616da6c04d49a160a776dcc30d642b4c973f092e2720290af94fa5e5919f6acca66223c40163c35ff7bd48268603ff10d42337f26605f2bc2d0866eb27eee0a77a2a6178cc914e77f5c41ee1692b915b9ba9407ef6e9a12cb95495358a383e589125a4b6a96cbc414caccd59f86e9e69ae8b730471a42e44a6361ddb0232f16b6beca3087c660116d72e7d95a91c6676dcc9ee4f872f9b1c344e0b4937519ec56a07d58897749f8f2f253931e3109689d14beafa71d0fa4d38d7b45443a238a485d4ceab7358543663b590e26d40c92c342c8a97d1962cb6dba0411d2b586c30114daba6ef395cdaff3f8ea4850cfce2050f4972b43d1be8e39e759065024a5d2c78baca3f51bdb5fc956758ed617c7457c32d3b8700257dca038eae810d95b44ad82fc673b87c8e33f5540cdca11d36fb9609169729495629e956b75dab12b06160fd3e3d9949b1e73290bf15683f2d5270c9bf372949864969d508832a2de22d29fdf97651e21e2c32918e7ecc9b4036d41f2334745d4219ca717b8dc249d3a9ceac59b5008ec62760f5184461eaefe13a4c5fa721890933282796174416b7a440d74ea93e136ad026610dcce8b1ed17708cd915d17a6ba5dc9c2dbb88057749efc9dfe932c93002c9513d1a8c39a359dee829c7235173c04e0bf1c615c84a7e6d042e5fb3770064083b862e9e9547b257e75f30b3de32d0be5d08aefca1733d695e82f3d5c22028ad3f2d03fa9dabd26abbfa57286a5a33859ff90bdd170a089c1071aa5fd50862ac15e68e947ca726758b2cd72cd7d5234d54dc3256abcdf10ddbb9e96e4cd03797654fd25a22502497259d0727a2c5e9f458285ade166e5530bde1401cebd7ff5db93723684ad6471c012df728b4ddb24bf151cb7d1bb910ca05bcf291985199d929cac2cb778e8ebe8014e72264e4c1d9ff51153e07c7e228a22a821bc9f27159a4d74da6e259ea3fbf97772b672ca205c63c6937a09927f52678e56e4a6fb7aed2c61074825b6e9a0c29b48c82bd1f3ce8f8fa7937aeae2c4ae7eafbe3c24d425355b071ac61f7acf17b672434a9904f03141948a903a2fbf93ee3fc23fca361413c7cedfd28226d02b4863cc70056f55ca00b8a7ec95f16e2e47b190dedb83a5116d28b3b75598954086690a3b73a596563a79668a764453eb8adad772a98a0eeb97928f17d958ca511a7235b50e36c918e3344732c8e99a986ed16c6693050ba20c871361f01efd6cc7132790065fb271c96c971ee3ecfd9a6b7a103399db2a9d24137707bcfc2d0b07727da884fd501810d718ea5f1440410b222b33b959e25f3d99e083433e38160572c95c510490a5b188b92e8fa0931db56367b2cf7421760b0ea4c0cb196a08a572ae3a263673b4fdeb0d1a1bfd7af8cf163d065e1e3917189fb9fd06c2ce382f6abcb80f65385f8325c2014faf50d5600574bc0916a7ae170e6da5f4924bf34b097751b71a74730e0336174d456066c1bf33d12609840477a08cb4acf8dd5f66721a6f1948bb0317de2ff3107decb9066da999e0454b730c525b57fbd3d4d2ff0a976202f63770c6f7a44f334ce91015350ae5fefb42b93f219fd9e86366eb9e10c5c200583d8bb616c83415e9dfc876d86df0025923f19f53a5f66dafa9bfad72b65422edd2a02a69b296f8a3bb648053c7da85206453e899a38bd6e14e49f0132ba2f5a5435266a8cfb5c338c192e3c7eac5143cb1d838ecaf3b5b5ee5b49150c0a2251e5051542232fe7f6a0b066254f8af1901004c0b8d93419e4d5b480a0c76e0bce7031cdc23fcb5f4c361fe1c7bd518c5cb332d8b0c4377e0c3cf914b726a6bb7c97f6e2a63866ae89867aa11c79a9c5456b4a71af39f9ca96234ed0f72a3df4380d1f9668698ee713ff6f9bc6bb8fb4add652b57e34badbf13e0c95868dfc367a3afc19cd603089b425d7fcc76dedff2efa990e18bc4ddecd90d12eb72f53983765e33d968d42d755092b05d3c0ab466f1b5889733a3240c6a8e468b391251d70d2f8bd56d5c2de3f1763aa4b9ec56ce04a3ca42f96c6d0515fbee5453616588049e8ec5eac44f800166777bddf33744d1baf6a94368b5db547dc7ff134f80664c0d005c732a0cf54995c9574ac4b4aee13132bd3a0616a94b51d49a2153fa656da99755fe55f5f1c24dd14efeb20aaf3adb739637031d032ce203c0660d7d6df97b85c15ddd228af2058f55088c23f423bf0296a099dabc19fb51f0722456260450861bb281efb2042039cc69242aec7edfd25875c7fa57a7d7331e4f3f98daac72e6cd552b779dc1374ea799129fba42e5abf11b51eaf431da9f9111600e855e703f7409d198f9135b03c8e40b9cad93deda81e263e58a49c58441728a618e11734eb7183883af6ac917e113e5c65115deebc7ff305d61b27c551662f27c84b4deddc5e4095b3d10ed53151051f1a8289cbdf1ffd7942e55a5f23b72f3afa3fd9706f8d909096cdb3519157d2492f2a67a45e195b1709f651b78cf72fca4b41e6a11886f479999a37f3d82769102f46e4e9dda09339145a2006d4072a9de63b10c6dd5d4047b8ceab6bdb6c5b79f5052e5b8836c1c55b8493fc87572bfa8a6d8f7216561dc8d05e1177e56ce8265f45bcd1b5392ae4c3e4af590ab362838fa44e4bcd237504574dcc6a534516d167f424b3cc7af8165a3d718c11972b75f561c11fd187133db4c9dd4c6fb365a181951c10c4098acc38873c97d7915e53f32f7261aecc18f0ff20da53c2ad9865fd50a677be21d20bb90aebd02a47202e5c746b77abc67d6673b5257bf7f49d875ea999b44d6de771f3cb9c96873728c62e2df50d89eff1e2c67a9e539ff181a7ddc0ffcf2b7f4610251acc8cf5a72f8a275110dc82f9bf1190602706dca33023d0b33197391d77a320ef9244551725d586318a891eec713f460f20ff550897ae3fc74e237ba54b9957d3605009d72683afd2db8da0d9d37e9252632d2c2f52e0bb5084604fdeb484405ce2f34b91c8b83bfca3d03e3056a3167bc93feadb44635435ad959d8784c4352e1f8d25868e4eccc716dbd8377ceb939933a43e50f533c8c0bddd3959a8e162163ea3b2c2f7551a93920aeb65e3555bd35e4977cb0635cbfa3e7adae47ad16faa8b7aa8e7250e6ecc47bb15a108b0afcef1c24622bcefa939bb02c05e0af6f6055c8505b72b5997360b253298ec3c93113c01de8e3336a999448f0f35382ddf80c9ea4e35a1c1cd03bb7a0103ee7304ac1b4f8e63fba97ff1f09ae7162d5629fc804348472ead799a9822bc42d11e8ef4c54261a1c53fb6b4c2d74ba2ebd78717cfb24d372fd6633ce5bbfbc3a0635df18c9932b230cc547d0da9004ec2ce26c06ef95c628067cd0082a06f7cef4eed9970c2d8c7cc60ab4fb5d6ec7bb08ade6cbf5ceab4697f75db0ab58d6585b8e5732963d58c37b6904bf7d3cd57215725111fbd23120214ac83c3c810c9f3d4a9a1e43286ffb3835972bb6fb0521c107a6a67696f0449095f504ff1c75d0669052c6a45ed2c67d1c59a792ed2b9bdfa09d6fbf856772960633fff9399c0f86b02e16025b7176ac7451b3ebf384792e98e96660a9d872b4ca5aca54681d6c47f1db218a588341df779fc202f8a9726a567d0ea1a7b23af7d14bae90e86d5c2798e7e0207c6a63d99e0f698e19e8fd2f876b5505c3fb72ed4b49e323b26f4cd4b42080f513eebbeb2fb8e39c31ea34730873989c461200f99d1fd3dc40cacb6e48a523a53d0c6806ab66423da93de23e503f4e94d24423f801e788987a9ec45987ac3ca0695dd535375c28025891286e5aaf80c995ee2ea0cd81d13c282b8a29b6acd11e6aebf231135ce0673536e48dae37928439ab72b10e60b470cf8d66dcd9d3422ad47d0c95f6a25f17e49633dcb0a52a209ef2482ee2467ccbbc8a97e665b0ad7a29a811f1bd4dc76af662ecc6d824a39d58b50f3a54e29d144a1d47bf4e88a672af073596bf0681d4aae55b504307b48fa7d572d2db25c39554e83366b745e4a0e25d24f95a63731804647fec26d6b9047e6772c76c01b287c2bc98a9de0af5ad0564df6b7d21c431464888849e645b916da972da4ce24af386ddcf9811edc09eadfb16713ca16ccf95cda4fc56206e84906f1aac30b31716bf035ad564b9dfc5bbe9bfc85095554d28852149f712135d036d7282206d4819f89701a7ce41aa3dd434d198494409311f4f05431ab2124e789d15aa7a5a93d8973dbad29eed903bea29ba233c20641da427f231c0bf12c1ac4254dc1a9d4d9a2cf228653bd386f9dc0c283f04a4e91ee3a2d6c03aab50c0abf9647d0721b4718d54db43324a944812b96b6f844a9a656fd3d9c4acc8f0f21d867241ae8bce70fc98fd1f577d7bd7da2f309ed7c45f6eb889f1a68bf25f3ce1d13871eb3f31ba977f20cc7196cf4fd2e2bb055f9a779e0034ed56592601b7e91510702e3058767b95debed35917a334dab2e14ff9b0a834daf2bc2d5a27f51d3272f86d7cc7001aced755f07090af7765eb2b77e66b5bc95b36aa02878d8156c32895fcfdfbaf9c69e5409e48884d6774f32489b9bbda65f581e3601bce5c950a727f276b356821fba8c41ecb536b36b2e632fbb4e998d01d5c109a1ad1d7792672cf731cbda5f13a30f913e4e2dbda5245d21f09878222ab1bc37efa3738f652471797e333e6f53651e6623bf8ba61aa03fe190fa96d5d1290854ddc60b6ed38721e184f0fbbebcc5bf50871e5ad826ee9f5a198f071a57dfe21fb8eba2083e71c9c49d9d4e0bca26882ed3c2b2b757696c07a16b7342bd8b3b11e10d339ece82367c71a0fc255dee764a5457cd534d43090c87750ead34211d2d47fc84dc2cf7207cffc77b0e890803e1cd26bf20a0f2d22acef7646b5f9bf090c4bd6d15d6c72da14938b6a7b63818f2a173e679a5624d56588e6ab5e608e9c931cf36343f26ac06c4c6a8d18039c69c20d4ac72e4881512ea1afab9d3601b66c5c14116f401749df77a9551c70b4bd9de38b751030eb7ebace01a304df92e78397e2cacc4368f5b2bf3827a569b3ef07c5ffe1396d7e9fbdca0b841570d302c05c142bd1fc72c759fcddd767c263aa79384a7ce664c3c31942ff9645937d54ec8e7efb61410c79f7eb640ab67f9b33755e6af5e6f8d2900fe08c16d885f162daba609842e94776c0822e5035145fb0026ddb7a15082c5fdfcee19d24bb220704a5dd136aea7237e3fcdc73c00ceaeb7e13375033f63b8c28baf463d2e8e54e809ed7b24ad2728a486d4601d2c044d4188fba8cf2ca1c21b33289ec0770e0f4fce25af0f5fb72669a55c77668bc03a16b80c718c5fb8fdaa59b8adeace3a72cea905aea099c623b607435b5cc364c5ccce75d667ea04bdc4a4adc35acb18ed099ca848c0c6772a4ff596d4320a50a545b6de93efbd86df6830e06fac47ac95555deaa4d2a3672465a6cde8bdcebd9621d66d39aeceb032aae7900ef256c5fdcdc2f47db12a072270e9fe137680d3016be3ea505327c1e1bd0941425bea1bf1c5cf72648870a72d213d99ce1461c1db59a253ee8b6920560ea9b7ea5ab1670078cba2b75c54d309b41a850ae492ff3c95c2758474d5d9a54e05987febe31118637ee8ef5f1d972636cecbecf9c48ff99473fb8773c162c2a2907dbbb5cb459878ec81e23673672df4ff58741ad55832c5a47735f45ba88c7e94d9aa675b4c7412819878730bb43112669439c974c075aa62813c29efdc9bda0c73329ba1c271025920c61105872e8cde3718dd0b7a78bb51773c67af74e0a3042528ec5044258700bd49061d32c2cba0af1b7771781ea550075716741815f67ed0ebd4532ae36623f2613ad607201d6e8155f0f84432f5fc4811e98cab603c40bceb6091abdfe6b8c313f8ec85fa16be66ac97177c734d5e7e08ff3f54a970a49505d6689632bef6e92a2149a0eec28400e79de33193d2a9be1736e904951790850635492609b936f0760c6ab7293af98be574946a5a12855a01816a90f162200e80c44ede6443db33c4a3ffd72bca7a4c985317870e22a5e3d4b9e2997e08301446a934d59baacba23af44f472b42774e9aa2c23aabc96dc6b9c28996874d6e942b08fb3263a2a223a61f0637204da842fc163b69ec063c5d07390461c80d0c55c2fc453ca5ee74253ef26cc72f7d39ef2fd871aed09859c6fbea86d7cae656d549e13bed802b9b252b2eb6f0a2488d03fbc7956aa7062f770c699971a99107c9f6dba87ae334d2bf16a057035475d28660671620b82f921ba273f973d45ca75707867630da9491d0b0a9e3a1959432d4474265065ce454d4d9f285bdd12d98c258bb17a3754e028b80a4276722b45e45654f21dd6847976d9b4c9fdb589c34f83426a15922013cfac24d7e972e1b87895ffcadc766d66e4d9399af176a747c7e216fc46112b81504874fc086f3d2c56677b0e0bcd87c54e1ed20a3dd999d08bc91a6c44e84f1025406a302d724befac85b43e515606ff6e52c36b94d352b7de45ef23ddbe07c5d41db2d793634d9b860761e00459d96cb70b9981368171072e945ddf12551f45fca54ee9cb72eb6e540eb90f4e08221a51da175283498f8ed374419b905238b49e4e0d946e72ad31ee54b4c9069acea5ffc990851e40150f46f4793924e77a0cb58b4fdb6950bb37742de32c3e2401467e29513a2ea1741cd1128d41d3a815128e4ae0b30e7262668a96fe2756ee6293436690d2c9d87deca0b66aedb083388f9159751a1a72c4748c1450e8e32ef382f0433a607c1e3d69c542d771acdc744e92d5d9484f01cbdf1a7b8248f4643be7c82abce45165899d70f277b08459a7842083a8c284729ee783389319dbae76806fcb6dbe69b61809b563f60edf5dbd1f83e059ab3d42f3f74726841abe055926f483d7c6ce901ef672839f20e6bc553df0ed79c0d072bf81025ad5ffa537c6363db04a106dfa01a4b0951b296b5ceacaf1034e323e00d53d5802d326102f95f53b4257436c5a76aacaa4ef708645e282191c9ff039396e930ebea6036b3cdd4b8b70b98d2d9e51586dca8ff41b4ae214cac7bf7cad7232a28a6077cf9b37217e943b4f02f5ddc7f89106ccd834d9f9fd4604c39d9472b1dfc20735fb987bbdf8a359c1c64c6df3effb3cf3d6583f9feb0bf7dbd03972cdd4b7e076660ebaea608edc673680153d61c5963d078f7a20e706c98465b272c771ba07d922197fb85641509f6e6e9f0cdf25115e8c9fb682a397ab80214348c99bc2548f321b25b0cb47b7b0e1a75fee1f973da5a900d15df967d0bc34c97231875e09b0ed64016c5ce9d77d0cbc7915c5817987938827465a4def801c3a3bbb0bcfbe385dbaad3d9054198913e945883a9a577c5f1cdee3849247c9a6d4667b4c563340ab6bc49d1013af1224f890bec160e27977a2032a3b5045e3e1fc722ce2f8cda5adeb1208afe9af694771a59ef78afc2ea0bccab5624a431b2496720c46d801935bc70139e44d2efdc8465f95e23695617f256db8f38657e65ef3727f33d8635517e1f64393c44637e7abbcb394794878dedb3c1bafaf72bda6547232989d6857ad2e931d5145d72de05ed7e490b6fc0fbee3615542634cd0acce501b9e9a6558af001d4d44e8f15e33c8bb51392cb02d436800226e3ec61f81fa72de0c5140534951296511ee7d4332ca95e7bba0cd6c0f8fab01a0a227985b8c72df0e16b50dba872f971b10a3a7819bb2a405aa9bde16185591b44c854fcd417266bdc077495d825459b6d5e08d3183d85dc41f58371ca76c38544c81c995f02f229c0afdbbd2ecb2fff2b5b81df219d273310dff4713ccbfb40cf234b1587a680e3b46a6ad4d0dd8274054e8637c31cef05918a27e2b1b67c24777676a71456ae93f7fb982c62b9e2c2ecc54634d5e8d47dc7126ede6efaef07287e7ad403127543944df66e4d942bbd7beb4b4c100f578d26e4f03cda2ea52bf5353dc97d35acba32c5b38f684b4cb7c43f60b437475c7e9fcce7105b7894726b374bb6ae172c6b09b58a58aeb2fd85295bbcc263132f9a8c46a7d697f6d57e5a18c16bbde58cdd1ce4dda021eb17447c9ffae857d40d87f347468e1dfacc2799b3a69c2a01329b423b9b8ee8c2a079abda0d6f0bcbe69a44a03195fb1503a73d210a9f8076968484eaf87fba403a956609ec3a86c3f7b63df238e2396586f10f260fca9ba5a734272cd5444bdbaa55c88858c0e473062976ffaae23ebc14d29729332538172e94629f9a6879c117ab33c04e819a4395ec70c76602bd6bc36c9f9e1e3c80e72b9aebf9732fc3bcd025d596006796b712077785e7d0e87b737f0a3e5c4380e3aeb67e664eeced5b3039f631b8099323539f5c9c864a2b4f8102c2bd38ef9d37216d1662d043f59f025d9379d6c420f2794579fcab003abf83a216aede37ed472de917483d7dcb1fd67184c602aec2822d727ecdbe996dbfff674ab0ace391b17be6fd182799c86f1812fcf591c703fce0360a5eb4d7582d1322c38b222fca572927f6b5cdc86169642fc73a0273f2a52d0abc507db75507fda4c78757899d615dc73de4ad111e9cddf77ae7dcb4af6d4c27bf87b8461fc8a485417bdc86dbe721718541bcac6a24ee2540f4fb9e82bfbc42b5e2a5c7619f4d0951c667cd13140b599487cba1465106a10c0a850e5c5ef4ff0d6b1f31847cd6b75abb3408ca772438425ab823f2619f23f1e0608fbd509afb873ae07ab34e6b4bff579f7b73418692aecd4f96daa442e9107cbf03f5655e380b3c9d58afefea984c04adf41835d3c11b4a8046a9fddd94a322577cb359601ed329fee2f8a7b43ca8fce524ffc4230af1c1fe54d55bba943ca4f5e2d7bb75e46f64b470a12c3a60b2c5e6e2b3a24d2c46f05e1614793a08ce4d055483c1e2178b1b4ad1a3b49c8e7c141a2212c72e8236562bfc53e8bb0d945ed505d9d40d3b902a53cf17b3e0687a647b015c0723c66b20c32726f371b891684cb9b0a9576151a5f5b91b48b3bf6ac288ccfe372e978c5b33c55e2ce582eeb6c566a5b06cc57cb0a8e3bf8b19e3194366c18ab72c527533f76375f2c6f29fad5187b1be3be926a299cb64e71c9bba094b1aafd27dcb34d4036bc2b0439a76fcfa3962b57d92c43f422394ecb841ccd8ab21e73149c564c4d93453ba75b6f43fb5d3cdac73ea511725336472eac3f28dd7836807242592388887eac273321a8f3ff244674b99dfe294e9bace67422fb46d7a1ba7231df200f9c30be66de9ace4cf62154b228e8f23d3f86331905cd7136b54fc772a08d1a581989b702bef9facd5f013ba77d2fe9d59302f633d497862d1adfb949c0957fd48c8e7e02beacac8b7a060b47689568c5c6d916c0dcdb8daa5ff8d41114831072077d2e5062262f96c82220578ec0821278e00046447a38fc92a0fa7280d9ec7f7df7c1a4662147c8e31b9d2c8ea5605ae84a7396438c030aec790f727cd66d246a1192b34134c891c9fbccf43fa7a3eb76c2a947e73ef878bbe0ed3e29ea7bb6b1081351f40c31c9c3c45fe6ea9c9f8e962d3226a411369650953a7296d81988f4e0eb1eab0287ddb614caf623a74c917d7560900935ed403762051975d503b24a0c89584a456d9fc3f90fecff8c2b993ff56d53f2e124346f44ac44978b8ae94aa42a7acb9bf0a3ce9e39207accea19bab902ed9ab4c6d3aab6c0728db3b105019239ad5395e325f3c77367c45b3703c888c4d2d9652db9c431ba7299a810a8977499001fe3cf37e602ed938eb5042c8fd37df12da1182ed1ea012e9c0864a4f6c1a0d512e2ce3947fba644020968d8483bdb5d828a58aa69b5da10e85af4049b4424a769c7006e13067a4ed492f625eaaabae8c834b7e8baf1fd3bdb8e8c2be5a71ef36e9bd5c3ecc46eb31ca4179201ebe4af8c33b299831d235da81b0cbaaad0dac73500eb8b4b0c4ac84b90bc5caddfd72810ae6692ca87b072ce9db328ffbdf074d4cba6b8537d3556a12d5344dafaad03b44254751adc1610de71f5f358f4f37040bfc6400fccad4da96665427fefd41c36addd1acf0626342910d851ef2bba8b2819b0025e868034201660448ddae3e5c6e1ad4b75cdda421202ba913d69060ce34c575ec6ebb41d03df08a5cbc0c88034b6a3fe74b8407295f34efd50f9c289ed936ed202c0726f0ecb157f4a1002e0054b671e14259924ea076f2652f6f75d049cc5084fd4e94162e3b91c5db200f98ffe691aa096440acc819b03fbfc57000c93767af64b824a6a959691fbc8804188126afd7af7a90484332944e1e3764775acb9207139ab7180bd6764226fc962d5eaf16aa3ae463072a817df5dbd9369a69765507d79996afdac87c74cf0e12ba73c34bfd88f440a3510f6fecc4f9e1bbd28d14591ea07f83447fb31417a8c6c585a339e3ab423553acd4cf18819ea18f8e894ce319902285023c7367acf23e2d0e26f0569df0d7248eac4d7800d9695091f6364797f6c3c0d287889a75f62a530a60f8d8de8c172880a329aebdafbc46aa82589a85bf0a82434e9b51420466d05662f2ad45e4f7264076382222d67c560e93f86f0bcdb1358531149eeaf4d291ee286df74e991421de5da730396e5e604f4202312720b080acd901fbdef8cd463d3706159e1fb7294b36c7d19375848a2776876bdb21d433bd234d019a9bdd978691541b89bb80edd89ed2f30856921f1807fc8b0a3c06ebfe1871f8c958d9e626b3b797d3d8a7279ea9d19a96b690c3af531eb5dd6538116c8d11d96bdd6edff1538a8fdaeb46cdcc1bb3c9fa8bd0498d74cf418d1b50860359619f310f38baac5ff0ebde6b1727d53e221ad813cbe7db5b64677576fdb74d878b6a34eaa6577c1ea86f679ad727c2efd3bd25e780d45f7aa3c447b49f8b65e77a5174e788c3642390b2e25dd7284039c7feccb12197f7abbaf1a9bd533385bf7b537dab1c7bda6df89350299726abe3aacad8cbbb7c149afc7a767032c06c5284d25a0b04fc89e26002c01eb7242ccefab2a8fd7368cf7e138834819d500a3e829a715175d1bf047b8505ad114ba428bf4ebac01fb00f0134a0fe9b1e7289e752ccaf17d3d32beca715ed8a172d2233bc4aa6a470e900b703c31725fbbaa129b7a77748cb5f78f78ff9a88bd72160f353831073969a7b641c2d657aa31be159faf01013f26d72c2edace3f1965fed315e3e7c7cafb0b8e793f488256d799325744e508a5d80a0201fd606be91b1a15824e51e846791c93a98682e745aabdfda70fffb054ebcd573e64e0c51e721678e69936e991c1bc71bdf75196e1810870eec179050a30cbcc0dc35490757230f6f9eb3b0debccc27e117c070c4fb01a7096baeb3a56d6f4140d97a72f2b2d624fdef92c81a063ca9480cb7a1ceaa7eaf8a57507f53b25ce85167213f87f1abb4a671f5d68acbc99df9b750b4c0a5025a8059c2617b62a5deface7d7a6a87214b150b9e48cbea231bd9c800fb96f3bc6036b033883eb9e41c00775bc1a597215db895bd5101238e866f2363d61a0e2f799c65fb3c889acce1959121453e668e93cbac71829244add1f46d3ee3f39549ded62bad7a10789bf073645d510887290b83790e6bc46f5832dc49de90ab1f19d1bb13fed8d582e5bfb51430197de72ed7133b7a5adeb561cf4b9a27bf028635d7569ba5266628f9bfcb7b253eb7572734b17d0d4cbc63e42c68853cfd8d25b0669615802f2d92f8c35a93eb2ff967267ae65f2be58be929de8dcbf3ae76390768fa59cc2a5884db01a58e435ee9c72e1933a3b805052fcb27ccc1d0d3e788a504979759472fbcda554eb91455e473f00f95265c4908555a8e892af0f31ce2a90e61cc96b6741d936deb569ff98b0594729a3a2b665931a39ace2a0dac24bfeca60e1ced52e12d0473927faa2d1021fd180c86908c0c5d28e9d8a8ed4e12341c61dfbe525ea623920d88d4d80b1ea728c540b86f744931d92a8558215d372496e0846cec06c410e86bdebcb9881d02acc24803272fd3bde274704fbbef95d9121a7f332aedd20d95a17b65ea1e22572c2db8c347b7b41757feed0d6612c89f8849c334d95a96d2f3cccf1c1ccf85a2ce21735e234b0d7d0c5d73a68619389398de5b68aec85e25c84c5943c719e0772087dfe8f9578abd49caac46c3f064635e639828f6584daef97fe422932226572bab44920f1775581f3a4fb78aa362918f256eca6a58ca5b06ef21c0299c9f258d3482a460d18177e1528165d7c577e90789b5a07af4eadcdf776ea34e87cf90820d217b16aec87c89c24988d413553350175808f8096be1d519a3b8d289084728ab7bdd063fc7a3485b51436e871fe07a5bd6cbf7aa39d19f3ae15a63a2edf72489b6377d0c7d0c2aca3a729d8a1c0f0575be285799fa97de0c4858ca7d835729192ca6a97426764b45858975bf484fc3cf7db7218bee001cba6d4fddca2f95b692f95f2a64d5fe79e802b9a98b19a9cee6da80287c61f6f4a1754f408bc691ac084931c4cac1b37a5fbfacf65281869759535bc138e678ad35c6b649a2613335fd6bce2ac8074043024599bdc438d6f12ff7c5a29f0c5c66df419edd480b81dc59d858a8ee0f57ce617bcce0da81d814f11f0cc05e98c0f599a5617ca59c572b4b84681575383f19a24c9aad05180f0a5da8a82d9d95f861d30ce9a4d7d8a71613f75706c3a9685e291a09b5ccd441fab2d666d9d8b4c4da0febd13b7be5b722d6cefad9779fb1e9acbbc4a347b3c702e08f6f55447fc24af8da49f5fcbe472f71361723f03005a9a21b4df8c2b939dcf05a50015bd7a3f10ce482ac3b32472b970abdc41300c71b040b79ee3a30b8ca75193687a76cdfb4fc49218ca72fd724dee15aa9a24bc78ad7a971933ce87f3735051bd10330452db784f83ff70bf103a0bd6e63659d210c370955a54c4acd3017fc98b0d3ae8c56b30267198f6797263ea6624cfa015c4f9d28e5032746d9383360cc509381ddcda8b462671d369480e529b8ef4f6e94cfe1a0486d4ae3a88712e9385d7e858089635137309fb7b726e51f180ab098c7c2bb2f676af6c2cbf401760d452f8fec0e30d890c7ced3206d70ffce8a05600a1f50fda35ad3400f8154e4eedbaa3c08bcdedc240d2c676720400cdfded54a85c0aac8fc0861183209084f733bafb5c5de75b6d002d79a572c3cabe5a88785bb44f94daaa07457b14c44c18e34132df572a898c0682a17372dc2be664bfdb0f19a090a91114abd9b895ff1d36e7b70a1717b20a09cdf582728362ddcafd703f6653b57755ad5b6985dd5639eb46c947c9151d5e97aab1cf720af2fc14d9d764adeae58f5c08065f21dd4cd4e6e49d3831426a938fa2231f4d00b57655a5669d0897cec95df0e8aa6ab65bfc78e7f49157b342bc2a4ba78f72f1c4f13945cbcce962989d0f1b3d0f2e1b4f4cc6e071975814f4b5a988d7077223a96da8a2bc20b6073750f6429711c50f59b4af36ed600f2cc9103c16d78909fed95234ca8d188a1ba4a702338b2a52e4548ad5645afa290a604528d10be872e551677a0b72c21372fc99330e310f4090dc7e092e707856db44730733257272913dfeffb698e154b32ba88fb94b5e0edfc5efa3511778aa3cb59a469a6c7c727c6d303d73c6a6d0dc91b0a29639da07ab6a29e10d4bf9ecf32f7644e6fde37230304ab2a229c5234d6392b9a4db2aae34dfbdbed5c9b89aac4a5df57805487255c8b30bb1fbee7dc0ab459b2608be48d832b4323d17fb0f4eddeac8acabbc3024fd6731b8ffe2619f258012ae73fa6b202def3546207bcbbe7a6c43589366570ea1b87860de604555d13a6ac9c4e34b82970060573930c6896403668aad01721fdd0b98e3fbdfe9cec3a2bdb0c3dc4ae525952b67349570fe7898558d11ed72c1441e85d594c5527883d675028222c3cd6c51b5426365e4b80a684fddd0e8721be41b5a0dad80063ad6f34c4d3416ffb0cc13b8bd045e99f5777258a5078132bdd62180b70b8d3c640756e923d838a741e0df9affc85b984ab88e39be0edf2f53b0da1e632a2fdb880d8d347b9da4c336d225acf973e1fab57df8da8beafc72129add80a7205985f120c1c4f1ef4a8cb4d9f95aa7ec666fabd91462a790262be3663e422731347eb58c2f29f5dad3c21e0b9e2d3a12d93cb2a50d19f2755b01e3d818f3473dcd38f404d70b875343e382fe1208619ee2c767ab97c34c94cb72b2f390afb9a98d85ca9d30d05b006e9bc90dc434e40ca5f855814e5899b50820f78b16ada83b6a8f1f80058b6d5e37ddd3a4bfe99e3786fc2742c2474273542534e0fc54e0bb63ac09a0396455fdb5e526922cf4163514d3a178eebee1734972921f092b592357021c88442107fa19d5cc15b61d473f29c3832a49d52bebfa7245353a5f58d77ba18b77724f02f076e5ccd3cc8a9adfdb0b20df44ba8165aa725c6707d4821838ef50849625be414b0b115ddea76b0fb2f640e055faad57064ee32727acaefe3986dae01a3fd5c16f0a3082542722a77e734f7e039bc48670729711d248a587a508cc6565b1707c97eb3b8ecebcc3cf3500a3f22be74603c87242a8e68ad5e6cb31af9029e61f6580ec83ec426521cec57b6f6d324155a8be15f5109ed64c6e0f45ba065370a0d11687e261d044ae14a5e8f74ebdc7be879d72478bad8bde488da57583a84440d08378f29b0b596729c4435ef2eafd47dfe347ba22d5e04d8c8a31aed7883076e168ccc28d0636a8ffecf9c40885a72037927246491f086b138ccb04f01c7095d4f49f61a3eb9d391c5faa304392c5b6401372bfa8a24fc6a089a8baf908951ab9c365e3caad80f5a5be0cbdb884f14d6877722b611b87389334af8a1476f2cab7b25e9ca2242bb113d77d82bcd604201c472452f9148663ffb34a8ead13cda98ea821557686185450dcb796987f6110cdb872faa6172ab401c51e3ff5bb46581534966d43e07733f47cc945f0ac86c536c062fb7bca7f867739e21cedb8f5a2e708143c4eb8ed8a2e04196e1b8feb4506975eb8205ef635e8faafbd5cef830bfff80ca43cc846730d35e35ad2a914e572e172c739e181ab9c6abec51c033f7bdbb7cc7cc0009c3539fe544260eed992190372c772ec3dec01ee71844407502e80fc93759d6d97f53ecd12108819886e60a972267edaa1309d1d38b38910f15b1c5e3875b80ee322d79c5fa44459012f9181722c4bff07da53f9f77e50154e64ac1d199eff8db4d8d0f950e043c65fcc7b15728fe8ad6d20a0dabd3798edce1a066081133cfed57837866dc3916c3c2856a7721e45c275522202d446f29b45f7423aee214c14f60f0c8bfede0bf24551a58372e639401c6df4679d21fca52eef24e0ddf380642f1cc3656f110e787a26ed5636a4e0fa52597315621a3c2539d37b2b68b9c146e5295c60da03d7a0b1f243726ad26730a058f87c2e9b93d1b3728cd2117ed8f5cac3fcfd31dea3f8463efdf7729244b691c7cc8d1e93497a5c07f90bdb36e997c16cb083517ad10ef272caa91157114583d30558bfbf9fd5f2c5b5bc033a0fd6ff752c822cbf929d1e5b9bf3662980da2a5c4b80f2dbb999514d03e63c992538c42da631c26c966e98f7372a727b1fe7104e5956bd653b6a4152895c5b46aef8faf7406ceddeceea786806ce05530fbfcb0f18f2e98897fd6200e819f865e910c11f7f6bf936b96b0d7f171972fe23d4951df0d1968940e988ef4c51d8608ff59c07362ac1d82e586dbae8817272901a5acb906a827ea5f205078c754b5c9c6b0c5d93fb8fa7e01f69d3fcf9627dd3e2e445db32ef5bb5dbd607821b2f866e53b8c119cb5097387729267f2422f2bf8c592291c7e87135d9e41c25a0c0196d517e4f171b25bbc6ba26f89328724abc2e7a9c091170b1f0ab9a305f1c2c856bfed7ef1dc684f57de4ac4f434472bdd745525bdebb0f7fbecbfcaa7083e28615a36a3f31148ccd1cda31665cd4728bf537638772fd8f6e8edf2fdc20c6c3c02caf166c0e62fa561b45067376924671cba255642cc06131d4030955361b89ebddcbb1d4250b5a5c51a72ccd1393723d4ec32b881441bff3fd975eb52e61e77d7ce841c0049ef703c9dcc2a827d972532ba66d64919779613e9879c8275cb6fbef29f1b90e59fc2785bccf87ebb8725fbae3af4f3b60dc232b122eb22f7fc1e2d841a4e988f947117ff1f766617d7232de233b76478070e344bf008f46a3c733c54c3b12f06130d184ba894e97f26deab123d42bbb6430fe0a115010d6a94fbe99d95db2263fc9f42f22b5236446729fc77f02d91e0850251d59fc204852efd264ca0e0dbcf0abb6922ca1b82bc27244915aeb3dd5eba656dcf54682d7ec2eac4d122ce32bb2630145e59a1457f35877fc9b2374419152f70d559a5f919f8ba58f8e459e3814eedd90028e615f682a059266cb90f49473b1957403d5c4b65663021412ea46e1d1ada060bbfd09bf724b2350e53cf2dd12bca43adb3e79868178d05721d2725bbc8e05339c31380372840ac8f1cd9d4446d8416d59e0ffcd98bee88cc79097294b48772b4b6aea236b38b6abba99837847a9bc9db5e4ef439c8a0a1c6267f3929379d7b71d939dca729a5e54233721c6c9a7057e00f391a3e0e84626e5079872f3571b8789e34af1722944260b6cde5447115bcf24ff60a7677303048326bd4ca93a0d78198eeb6172266fafc29ef7f462ff7d53a24faa11a231d723d8f67ba988b1d75953b958787270255a2b3cb50a6174df2e7f81480f37daed01d9f91852bcede8a4019b9c2872d086915221fc7b9e3a591b0291d876163a9160305faad828c236cfd90e17f36211c43368884207f97fe33cbbfea2f7578c87589951e7bb9cb316721ba7531653d54b3b8d5ebc95a5e70f41a1129d1084002f385cc24e5cb8bcbea13b46b8e1325ca722b12796d5ad86a3a438415a2964c239f43484829773c1962123fb725772517ddaec206967acd2c2548110c59ddebdbc220ab26e3f4d6f420bea037de1266af1da4b52da0e0f8857f239221f35e341a9bcb141e7c537501e3c693a110e1041d287ad2fd22fe5c71e8b033122f10890b8bb4c7b3345bb915e51ffb6f2e8560ab0b1ef0a552158feb3937049ae6cad4486d2d2ca2f1d010ab2f89cee28b50f45e438553f3fc3b097700dc749781a70212dfef686e489c7fefb8414db32c772d273940b64aea827cce32603af30e581c4513d05ae38443bcd289cd954234072be02f1184dd16b871f031053123ebd9465aed2a15a6e0c03986d12ee573008017921512b023c7f0fc266bf643970893c39e411a50ebf063c955c69386f728c72306e3027707246ef6cfbe283f7861786f58a9a494aaefca6a04d1a0f9f19c0727b718a92a73e8314575d760ad2e0891e98216725d341bccfe2330e7a0252b100d77d8c4f6755391ae5fdffc6ee47757271df036d9eb73b57dbf410103c820772991c4d43c94107c06973e32060dbe90699c66aced1df7e933a75691faab696723814eafce4796d5996816b427eff779afa686db04bc3146b11beb2306c48fe0cc29439f8cc8204fc193542501ffcd4d01036bf4e1c54c9cf45143dbf4b5d53725d8af727bd52663ac21c16a3cacf0afcc7d10671b6c8c0f15c0c2537d714017253f497e42ee3eb599dc663617c7f9b76e8a98ea9570299cb435f415023571a727ecfad5337949f4e411c988e337320e49491bd74500a42cc8ee219599624cb35fc0d6278dc51a789c073a3ffb1f6ecdaebca82af486ff792ea07a7ff50acd472c0b94f0c726e5832042baa2c7a0ec707ebc8d4fb7f1f0bdcfd0d88cb4ac21559e340231639f72a20b3e8159ad06f2b10352484053b5e5d3ad321393c9392fa7259751eb8078ab0849b61270cb5ecdd561d0db386d1362981516cab8305ff582ee39a6d22dbe5c0fae0c44bf3f2048307c17bd149fceef340b377e7be4d88c30afd23d1d95f5474c9f1afbeff1d0ac68b596a95cc545e895b28610f63cb461b72bc387cb0e592125c856bf525b49b367fa8c0f9ab150eda2963b9cdd4cb32be72b906f9b609ba3e07625df72a06d02e36805f7059cc1679c1789545f893da06728af3115f4a2ab6a9381440ed395b0ad7a04f874a8413020f03acf4bb98476c7207f5d267ccbfd35b0961d655ec64ddb4f7c31d7a18ba8ffa4b11b8c329148d3a019735492b98b94eab926492c05018cc67e8996e538b2cf6f82dd7ad30fc974da3566465c9c1ba7316aad69f74b0aea56e605ea2fa3a1678e2e59ba997fc5d07c3e115a1765d800cf1a953f088d6db301c78ead71434ea3b7dea4a4746bbc07206a3065aca5f3d1fadeddd1e7e1c77b88cb0124fafbd32f25562b2fa95a495518589ddd4e044e79cc8d8d4ac7f40f30e465b2545634a1db60d79a1b2f47ba3722cf1c04dcd28ad570d71e01b5780059841d76bbf687e5515794c4d52f3ee2219e3978c98e1103f15ce36c46e4a63ffab9aaf408ef00ffd69932bdb5283ec9303cb810d275eeb8ac4da46e9920ba198460676bb4de2a3aa997d4d6de3854b89728bd65eae717689fcff07d4555bb02025c5613d93203427ef6531004a2b723d1c83ee1eb72524a190068a621dc5d34b3ba86c5a6d1bfa8aabec76a2257db4f73b0eb6e71191bd227141fd61f0f55abe2a77e200efc576aa86cab4944560dbf072944253b5210df46256227191e6a151550731dc946d967bd41458748caaaed272f7aa9e6854ebe598b829ae3ec4197f01d606a3ba4ad7bacc4d876082feddaf50a336833f864ee20a35dd5172d842d9f830cf57db92806e8b16ca4b57a755000b01225146d4c73f6e8edea86888cde7802868931efb3899a75fb74d3a3b8b7672b6da864bfa9806dd2521309d39cb485861743fc1bfb28f8b7c77e588c88f4b5c59c03fea5d6b4d52e93b59ecc586a032c374500f821115bd279f5a17b152f603099674462191d8838d2a9749ea26be5efdae8fe8e2531880045ea1ca4d193d725942d0574dbae61010928b3d4c46529a193026ee7ab92cf566186acd1f42af722e7b049713c6572f87a0c6fae6247485a1d168e0ad6f2e264ee188e87086f02efa881d71b159d7f17750e9d2196d11229779ec6e63a61c4d94283c104e6a905e91fef0cd5ba64d76a993461488bb6132c9d3c0dfd8ae3b5573703290b782e915ca2381ffed25adb755a2deea4df095865b1c34699201972ac5266c3c384d5a72cfb0fb4271a45e01d10dcf77e2e015aeec50849f7fecf3af9dc57d7fc7df302f4955b8c230a9a98c1b8821efebe8f7c2f252e52889996f788d00bfe4ddb1b931af25ae0ba65654dd33e326542cac9b4613511bb6002fc471dd57085f678e47342a16d7d650eb260c673a41e54291ef0b6ae24340a6897c7d70f9efae705f6a72a0c5c62af5bb312a988d5509a64bdd4ddc943f825247a812601ddf2cc337db72e6f5579d52114dad473da364a2d1854f144f4fea8e45c738bf0e901ece11f07294999b2098461320d43a455f98f7fdb50a877dfeb376535ee3855cd248bbcd714a0e30c13c40c9d1a9323db6dc307162eabaf9967754b280a31e33c95de6037280ac620f731022e0d9b7b3af4dc8b7d674fdb7eeeb7a3a36d0ce9fbf5a9a426ddd614d3f6bee1cd4518672cd7c01f708da75fdf56d54f1a6709c5298f128a272ae190e0b0644e0410654d49e1b4fbe6c2460c12b5a1ef9cec730211871a4d5720cb8e9c72b91096cee9685bcd0c34b4c9e2695dcddc925e087cd446371aec056fca963ef52a460476c422f648a19eb9765391b8946ee9c347486745d8c07a77209433ca42605e396598e3c7f5b173a0852f26b3bebde16e82449934738a2c772f003318177fe822d1eb022be178a0ea70dc336151c1b0885bb9f2a29009fe0728d167d752dd56892408ce7e2e9ed8df2b7d8e70fde403b375d0d84cfdbf4d33965d479be0b0f9149f8ddddbd6678c7b0068d02ce073461e9a599906bf07cff2842f0d9d291b748a47fb383c531759e65f923d3d5b1303f264b45ad619c13677287781a45bda7342cc48136bcf3665d8cbd818050d5e42a1c210c2ae900dd95725daaa0b2388efceda53a97dd29cc22b603419b6a0d1179e4d61e97bb9a16ea72edea88b0a59e2f598b28369270d04918d90b3aafb8115a535b3028996aed5f374a80eee63726eefbd970c1bf08e73246ca059e02a8850efedc4764d131fd3872e1416b5450ed0f2461ae5c4fef66e1fbc069c5567f52c7e567defa403e3e0b722b33d4cb1e59850ac95e30e54bb5614372601464abc9a6aede0136cd85b75272c1717ecaea520715f0b5a27511e66e24bb47ab5c1c0a0df3002c278685c80b48e59f94d30f508ed3edbef11820ba253e03db27bfecc5e8e26d1a2d7d21c7737284926d97be1d70b6ba98d809ae1dea0164d55d03be87f28b355027845a6010723bd1d55ce9f448acad9a11b169074ed8914daffad679492216c2d258691781724d421bac9d270ca9b1f6bbcc0904f2e21f9dd1ee95ad94dfbab2b4e63e53ba30ef8d512980b64e5eb645d147b558a86f05bd36dbaaf66533960b683bd9b823622f3a65ac6d6b7d389b78e81a2db26577320f37e759b5d3e464719a0f390813180c86ceef8310df69f0ecd86e61c2deda83b00643bf8805218701c559ff59b8715dd9351d000f352b393fe43b5789a45bb06c1cf6dfe4b3b722f29bddc2ca926b03780737b30cea026b80288d63ac4290794083bc2adc85562ed57dfbe6a08b7257fc7aa7018525c71e06e895e653f7182abe8ccd9868330f43362939d02ef3241768cbb193f59be2bd55deb2f76a4bd7f9338f4d26bfe0c87cef4c6e02113363cc4c7d44aec9f9a4ad0f748db86a93fc043e9ea87e42f3bdaaae12066d8aab721f973cf7c831bcd42023a56ed8abca2dceccfefeb502fb049fbe15c816fe5c726169cf70c80f46776d86600e4aaf1eb48d82757885d20ffd6fdd46808f76de4f985382adeded768f4bdd07304d3461bb9ff9d9b42cbca0cdca6dace4ac475c0379470a9ce59b9020f1103989ca34259bf72dc648eddf01e22cfcc000b1d5a6228cba51519edc2b1d7e05059a9787119eaf40c97d74ab7d60fa63d75b9f4c8d0ba6fb8152c80b698382a29007cf1c0e75efb70b4040879a920b3f1284cd9c392f9932b68bb9e3f2a71625d03943fdc8c278699ec2c4bac03fd2dddbbb8aa61b725958d9f57fa64270197c5653f47428fd52656323566756e172960f7b2acda87240731df471fa15b83b894f8b88ab8dbfc0d09f4b05c6e5e377f65ba4903bc072843375f93c35ec98a8c7c8a901e62e9bb08a237428070919d0899cbba5cf455c4ff3a39fe8d48bb64221f8107a42e4250c650e3aa7f76d0a706d406a9de415727faf05539d7f7ba860e0b929b752973c29053888193fbd829bf165c753435c7246ae8585b6da6c4334f38608d41ca8654afece11caf9dd063fc7319ea5d47c7215d1e4db49d7bfdd93725ddd089c97aab4f690dda4fe666fde8bed370056c57285917af79caa998021f93fb4fc385983177fb13292b97a263eb108b9d0493a25271e5183a81ae25297a267cd426928754a2f69d2da8a36bef842773b978b99260f4b8d8018484e95b63825799e416ae87217e08fdf296aff96ba0de9eccb6f72e4abccd093595694f7000e2b517b157f3a0d4d98cfa84166957cde309ebaf87266afac050ed490d141379a1c2c0bec61451b799ecf875d749d0fa5f5ba178872a179ff7763156af531053795702ac2d4b01ef5ae7990ce157d132a78e377e9187059d5b0d58d3789aa1067bcf74743075c1b47bc47b981f5d8c58047c984b90b32c7ac25ee445fb6cbdc8830178e962d12d3524d398ef4780a9f759440635b57e6e95c663f9585ed1ae37998ea0ec0fc4a1708641dce7098dc7a1d42196ac7727d02d86b3f8127349d3fc470d782bffb62d1f0e426b11d810855af1479a1e104dde3bcc38c10ca9377f44543e8df2caff0c5980083a83a9499d5ef6c89fd350715397b157bfc36b83e01455794e3401a7a895cfecf3512d77d3f8e5178c1d8723112d5bc0f516d371db647db82e2c0d25f661fe21ca17eb442cc65719fe1bb1aaa008ac8f61777ebb1f8a441a6b217bc0bbce419fb9f4de46e74b9e10d3bd50ed35bde3f610b8a708963ca9241b702f265006a77a04120d14f2d68d76f4fe0720d5676d6dad39d8336c450e04c1ee8717b7f3907c0bb58d4a6f84bd79597a9722fcd3c17f6132b4d96dee424e1daa230ece74bae466970b055d96df49b775272b2c2bb9f36c44849554f18922d7e32387dc29e929a1ab7b04b8aa658551c7272832ed1465faa974fa47fee464a6439c1c3896f63e98ffa89fd031848365481721b2c546c5e0906f24101f639c649a88de40dbd0da3a3e3a65e49bce281b05153961aff413cbfd28fce9ca410f1439e5d6ad141038f6d4c15c9a9a4baaa8e0972502d83dd921b3a6d3b84979e3a6aa8fd205887c7570d18ee6802eb452709f41ce798a71265eba5817f983ca0b4556d1445ed5ca5ba472296ef14cb58fe9d0722fbe67519f61edf190350abf184a15cf11f1561e8689d503f1c5f9e3f0bc10972ecdaaf2e9057b2f0f8b6e61d5aa40095d8fc0cb60ef13ca3aaeef844f228d54ab143046ad59f6a66fa6a5fa57509a4a05e7b4928d84507ae6ecc27d6fb6ebd4632d35ff5a7ef43d53ad7096da8dc1da96bdd94e056577d131a825055abf64e724041ebbc34a84e8345580f70057d17747c0ebf4205f76367a3263de2de604c61a659c72662211cffc5a0bfc693f5322466f3dfaadf2f09650b1a77705e083a72fde415c3689b3ec82afa1d757222e8627a077d070b9b3db8647759bbb2918b160c9e058bb57863bb6debb1ca260dcc22bf822b7dd708aa13fa70635501f7750c0fc2cf618b4fe7afe64ede551c7dc0d74b9c1a34b0e5a06bec4935b9a15b25723d5f7b681337cc15873724540d52244f41dcad676592493cf292647455466a5de1d90f40afd2a583dd841f039552d1c65f7473f04f3e59491b25342808911872f9fc0aad626c53569c4efc93e88a0ca4eda9ce4887e9334ebd65e24317cfa77225fc0e7038bc06d3bbfb1f4cb670c3de7d57c62578bdd8e56efce88ae3b90872b0c02ce4a0914e3f9386d86874fa9f0ba101bcb925605acb1c22011d6025ac72885da4d31712530433cd6f88c69b5284f4d6f59c936a8cbfeb55a5d2fd73b817af76b22bc50eba6f05e4dc8469f24ae780300716a963bffcc16b44ec001d447202166c3cac24095af91ab0caebde97cabe103cf206d14ecdc2104a519dfeb22181330539cf17301f54ffeb7a420e6affbef817fa017d20cb0cf35bf90faf694a547131d6f9e644c275bf0abc3574a32845558abb3c89ea45fdded08ab23b76725ba0d36eb5b8ae2a3ab0cc0a07ac4c2ccd74779798b19061fa51180ef44ef472492a6791cb7620e80ade4b6d10503f87ba2642b0ce5bd453a45b586d9506c3727529fe514028b30ab2e5e17e2d4aec0e33d8009c74995fff8baf540138881f72d37fbcf5611fc0389fce11e1bcd3f1885ff5280a11508e4fa47a993d3706067264ca3482b02c8692cf98acc8821051677a668818d5be7a2888dd7196630a095d30de324390e554a1db5141235e55bbfb5751fddf70a8fae23d758117f71a35728774cd26093927199dcc9ae2e5ca12dca96d81764ad3f3cc7493239ed927ae72f515a3fc0938cc3c2682133e58aae3ab38f0bdb50f9eb2d7605d304776f53e72c5f3ad63c27d38acc03c452141acc363c17cfe7290da9fc3baba62b2cf301d6dcfc4626014ae8f5e30694f604412faeba685f19a44b7db4c036c3c6c0540be7200a02ce0d34154fb1a5ae890b2bc2d5b6cddbacfa47a4898c35bb1920bc57b72eee32c48e68673fa54d93c5d22bb85a1a4e957601b8ecdd35b0427d2311706039d910344561b615406e7c790d4f50e37d95c0e15fce5e484861114fa88abc62e446cfb6d682a6ba236e30972f3aa8c76d39da31ed6a24a60d3244e3d3476224580c9fa86f7a9adc2f237785ffe656a74a791b45c486d833695d68eb45dd80a7254b22996aee8bc1d6cde15142d925b3ca1a36d8f48034505f8ea88c38963eb72debeae0f7644044484b7187e38dc0366d15d1badfcaa75febe6603620db6487261375de9000951632fe62e52fee48215f960128db6b7fcaa6c06e4b080d2ec72d1eb4e69d012f0feb858dc72a9ca0c208973c655c63c7cce9f97012c4a0c0a7205367779e959305a653262d5d375a7b13226f0b22df8da5cc00795a40a01cf72f7d1632be1a5ee101b7e7ed7abd22655c8d00b49457c6e18d30f4425efa7e9725a6bf4becf0e4fb4580fa7f33bb63d7513ba7ce013c6f8773459e164b98d0463ce18c168e1381d8a75ddf4b78d6cf334c620b61be353dcd23343a03cf50750720ba77c380ec4c9d1e99f80642c244f75bb28e9f12e0b154aca0c8041198d873b6b759cd3f0b00d14de5633def16da25d09eb25bd1ab79f8ada2b9be4f3e0fb72a1b7c23b78000f3301d91b5def969e849963bf9888c56a50f5f4df62bc73cc723e6254c90302d17f4e8bf8afde70698ea75449bb6ee6e3488982d219d6974a666ce77dafcb7a1ae0a50bba46e09de37c9f00bce24835e92a026a9a46cdee2c724eba973c407ae9b4b9aaa0c9ecb7d9fe694b1399d48e397781dc8b06d6b78172522f3d00e4a3a33be11c6746de23c7cf7e5c8bcf4381d5ac8ff2643eeca6487281d876b61c01f314c375af87b83e6db54ac6e7d7ded504af8debf62bf575f76511e13377009a6cca6a642bbda096f1ce4cda5117361426b13a77c745027a78202a77daf65cf82cbb1938b0d2abddbd9dc2db6dc133c4b9c966da1e103cb101236cb0a086ad499f0eca9a944acecd8dbb620e4cb5379bc23761c67293193e02720744cbab1bfeb91de044c82912045efe92f3858515c74d7c1df08f457e9d4c72b40969b231c62d4f1a7ba97af160e3e9cad772f9f1297ae15e2388f559cdd926fb26149a0546b3555f9e31d174184fe47e60a5d1e9adc9e81ab3910c2cd7b8727330f94ad99583d06e63f0d7e9a2cb5b9b7d1420950b78216230992e9d261472ef5c73a8c61822c87a59d78b6f1df6899fdc95933a94b5ed5fedd3a45a33e372f7eeffb10a077f24f29f16d6e2a7eafd865618e104f3fa310c980969464f8a6610c7de9f7c54da10f939fd9eebfba6b6578531b3654f86690055548beebfe7721f951cb335bf496b437ddfe3ba1fedc95dda90c9b2885b22bfaef60e08b10c72ee7e179d8bf1777637eaf0fb1bdb462919cc7221656d44c8ae696378ef15cf7237a0201b585b1943cce1ad04e4991f832fe7bc2c5ca6f0fe0ab5813ef99b7f722761f4a4979d1d778d66c1de075a3fa6a3de771b714e6f9fb8dd862e4e68d672cd8d75e7a3e419e7cd0c6b4893b939feb5d48f95f8e69eb0a5cb4b38cead5b2a59cc0bd9bbd93ef1f60bde61c3a7565d727f34c0fbcbacca72986809008b795116175cc95fe483c8b39de763a66ee517d155faad2aa6129bf9e2aa7a9456e2729936a07e52c53a7a3688aa7bad1944e41ba23da32e6d68037d75cf80a45124728cfe5e8716200cabfb3c67945b32e6ab802ea5213ef8c8d29763de59f27cde253396eb85834c0ac6d7b729f51e9fb5fa0731670f83f71d6988937fa10940f272f27ba35406d40103473977c44dcaac323af7129f3decf32c9e56a24766580c08b6de7967ebde1b2d9aec2d2f1ca27949f89d39b13dcdf0437dcd313fe7bd4663b4b88a82334ed279d7ad5ed89a2bb9354c02f3524f5f90d7cfe7aae569e1d661acdcd74fdc749831e6b089f1502465d9228b195ad02816310db4fafed4f2f3721706ce21f614379a2362027da2528f0c6274837189bcd261584d6c03fc496c6a8e0d2d2777486550496a1d1547cc7bc6001e24c346041331c899e29214f88872f3a420f40d13f21d71fa3926d19b14870524afed4381bcf67ad048e4028a4b7226d0e833ebd884d410c18a1111d72933fe33a628c1aebf3d593cbbca7108d33d2ab5d1ad718dccb92528ca240bf86b5b0f094fa5c956356b4d56b6f8dd4ec747ff85841cbbb080547db92faf1adbdb0907fa65c2e7c6c30b57c9ab8f7b09677037051387b17c6caebf25f27b58ed19f8818e99965adfc975fb0fa14c1583a643c5adea20df03f06f741e7f19f08dcf7811b11f8bfa947ccc4fd0c3987ce4ce72c526604a0defe4e0ba4eaa57c5b6ee0b9a889ba66265d20ce4abe9062d1a65726be4c7b631196a2db343bc14b8d3364054b93281bca8bd3c3dd29b1a8db9b1064ba57aac56550b81b015e20cefac545b92f3e473e7571a7356309bb75fc2974f62bf79e5169fcd82aec25fe862035e244dbc74f330408d9471a4aea8b6333972f49df54c2108951b761fc8f81bd6a18c6e076e1a45d9446c8ee9a37367e4de72ef70e12ae922bea4d3464e5b464b9326eff530316f0d12730361e275982954399e3ab2e13f211aeefd04379b68d3806fad62fc527eba1ff6527c74e4fd18db4e00dbec2548f7cb4d736e98b76d48c2c9cc325df55b8dc9968e476f080f362e72886edaf606d21c4587c69ba11db770d9127a8f0302e6f95c9d97922dbd43377249ede682bf8f1e38dd2f1eb35daa29ceedecec72d3a3cb4e651c69090482085252c240500dec31eb627edadee076aed3cb50a135b7d22a8b58cd43f1ac99a672b98b834cad6051dafd1c8ffb2003636d21e8dc64b50cc2ea7a76041c0feb557294bf2042e909855b4f74750bcc98c3bcccb232cdc16d4816d82217f561239d0ebebe3e278fc918660da15745bc04c5ac354688d3635c2dd74311789cdb25984bc9e99a57e590c555fbbc56acf5202d9acc42b4eca9de53289a9559f85571b53d0bce7f0da63269a5ade91fbc965f97d5edcee085251beaa301f3da07b2cc070e7a03d6fb3903b36d4de720df7eb570b6030082ad68a4473a5fd38be9215533727040b2c0b644aa09cbd5f1fe751cc9852ad4c667d2644e53a7953f4052b7fe72585e1bb01cf41221d9648db5e81fee886d880e267b55d660efe65c6ff0bb210d2af8278d43ce63ec4fe828d0ecbeda48c252335649a2a3495e89c9fa017cf17231f8845b2e0b4510f7c608da2e483186b24374b8ed51d31c59e993b1ba6a7172e9446080b699c8fdaa5b57223ddebec7c806dffa9b0074cbe7efd831bd1ddb0ff0acf1a7caedd9ec68cef0895939ec4093c53752b23debd1c27a486140f45c72078d5a1ac0096cf80e33893d93173a31410dae309bab8d89eeb269d316d30d70d577a16c1f34a5e6e247d9736a06b46ea7f89f692ab3e8d581e7b1a0017dd465289f653ea930666a4908380b97b1d8907bd961050e9c12db7bd89dcfe825343082f888711d6ce82b38db66d9c1d7b52c9ffa55cd1e5c23a8fa92caa2fc33191468ff3773f5e56383b96fea593f5c571be2fec4391b644f3347687fbc7c13760268efcca9b53de8a4fec7c718af87879822866ce0c25966e535cca6ec57240061554b5cdb04ad7673269acd082e3cb42f5eb423af2292889def8ca90ee51eeb7247a253cbed81a20a12882f31a01b1a814e25bcde1f509de887f5577621cca5728bf4273746528aa32e47171f84d774df2ae1a981f2155ca624a3cf0a50913f056b7cb2f2a382e241398574deb5da083995a0c0a44f90b2ee4ea25e17e500f83d3743aa078164c8e7fdf7947451798191293796f77afeaebffbeeaead9c81d03d37e91e72534741146d4bf8be769df2142aa7997573abd67d37f77cb3a935302154a9198bc2efd923582f07e1c9c634c11b6a601f75f4cb9a50d5df767a84f944e3c21f21f5234ac53cf6a14cfeac7e46b1dadce034ebec6679e0634f52a3f55c2d577e050a8735d169213e3468cbec76ee2a435900c6232631598d8d9a441d3b2542faece96dcce5d0a2ccb03422fa2c5af4a7f67a050f3fcb9a1d7488d8e2612d348856aa0e3ceb06bd4d35af798eb6911637f279ff0e20758bbe4cce3f4f724db59c937fdeb0719486c938ed6511c472d27d53b27f6cd30c66f5f386fa4f7255990aeca498ed31f21f83442f07617a67aa4d8220e54d505c58d9fa0006d172e66a007338b7e668c9b78a40d4ac8c185d4bcab1933c9af41e415b47243cab72414cf001bbe3d63761b7e7626d758f27dde2acafc16fd506689fd4d6fc44147272eb00e91e271fc84b796726fe7bb8cc954c24da56be22de82fa3a0e8632d5724ea3d00d38a7ba49470f788c9b9c4a64de33164948d6376ef19e6fdaecbe4b698d66a005e11aa41d9c33cb945b9e45a84bf6e03db5bfaa7a13fab46fac52b302552866b6fcd89122858500b04f354d5ce5225575b0253394298d51621dcfc772fd04f07897535d98ba5e2bc4dda5f50244355fa2960d3c0f0db6c3533f0fbc728f5f718ec89539dd16d9218751d5826e86880daf44b016b31d7c6173479b767215a936301bee24db90aeaa2c7c8440d8ae394e2f9fc0d30e89b12f6cd482e272496ca48dbba94e010d5509cf08fb461d8334be246599bbf3945f3b8e76ccfd6896ca92711da145d1bc7fab8cbb43f6894c44b17d19098934166e50deabfebf722add78422226c79a1b44c934f4086f90532e9edd098ac7c4b29f33f5731d97729fce1a1232a9f0ac660b24706810f72e8a25ea09b30e0cabb4348e02565741724e5dcc56fef6bcf29ada458df597623523027403603449f8a2463330f0eb8b22005730641cad200146c33ebd7ea1bb5254360675bbc2edc01ae977ee141d14027f41d49abdcb993bcf15efb847a368d660924a70fd4777397a21b8823a22e11da7940aad657c969d55eb0dad6c55b93f588adbc450e779178874f7c61b92597222e4f14a14179bb0510554bcd86ab399568a90aeebb61cd99d0e6627417c8343570d20fee2e5718df460cea774d5987b74e1e8111b5e944f2a3f583be97a090d269345453f49a909ebd123450a9cf16487248d8efaa520433c7a56746cb8fa72594c6c4f444115255b3aa9d41f8ea974c714634884aaf829ba4038c8ed2f3d724b7251fe7b8e610034d7efa421fe0d63acff2a31185c79e064e7e85d79944372976901fda69aa44cca76f5ed0534b14b17952c67525ed9df9ba4b200adc8192e95ce2b3cc083533f81eb3da5d17711fa3cec85c44fdee5375dedb4ba2faf7543ac8ca83bab9e93b106821742664a417f51eb754979ec5ce70a50c6b9c8b80172b24932620656fea87ca331cb5841f43c1b568fadca708df32b4047fe6c1bd972cac8b6cacdf4d493839ae9c8e79fc23dfe63eef93872ee3f421967a2d372fc708ea3a6750fb24f80a6bf5c07a678757aa15ff48adaec1d287270c3ec0fa73a32ba0e6f643376d8fc3b2114b3db3a0d7dc0bf25fc7bd4b41b99e54f6c12cf7b35979a5c4abe038b9bee2d35d469227982e73f074dfb8e85a89d5ff1d72660962c3a6ca252acc6272087fdd57ac3e7328832c16bc7516724f36aba7a0a6a0db872a8e978b7f3d4d87e07f763c22961c85de8a556c8cfb670fe9569c021e2682d3a12b93a147c074aad070e234e1b4ac40cd96a5bb76edfd4cbb8afef8fa466d3612b6e07de0e2ae640da2da25ab273d0d38eb9401e54144e1dbe9d61f3407d1529c50c7090489326c211898200f4edb9aa50f72b92678afcb82108bee3f51cd1726c4b74d8fc7e82d6af65e037eb4945e7501049d9c5c5f12d36e93d6c1f491972e053822d36fd4c3c1989b904f10ffe38140ae3d9c9037bc7e91fbc34fe92e772fc3a1f79504a164486ccf4b2d7aeafcb9ae6f3b2f71fbcc6858a89a99e600e724a02b7ff480839ce03294f15a2d15533036e3c4b21b8ae107c6cd8274d429272eb80cd74f0c9d557ede286caa41a589bb3f1a6e6418b296c0253adc2b143fc728078cbe7a3b0526ae6610ced6aefdbef44f3d7e1030cb58f72d7655d52c88c72705a44acfd1dfb4e680d852ec6aa8657ace280614c47e0f8d6f9f7a6e94857722387a5f12c10c24e5bd2eccb3be7fd49e82d851094f3c5205718bcac443384456b22b4d88701763e7b40cded1ab3377ffa8be9f99c329d8abf61883043f08855b4cccf09e3509aead46dc7feaaeaf3937de1a6ff4c0540dec90df1c577477672ee83b0070c717c4e1b81550b8fcb57e7a39ab5e3c9812b4f42bc731091929f7217e72330a7cc76f30cbbe3f1ba950f9e6ea168d96a44257b98bf8bb16ec74772250376e9863e88f7c4719becf96da2afdb7c5745086f5fe9b7989e65c4057e72917164944118e4861ec74d3e220ce18f7e51e67479db420d9ab96b1072882e71ee537cef171c76250a81ebc5992d258fc19459ec2ef984809556e141b23cb244adc1da9bbeb174dca4bfa7213779450cd7eba5cdfb41342be9f630b4596cef3ef822df93a0db9a11d753ccd87c8ee329001c9ec8cf97e5fa9e7a76de3442f50320aa1896faebdfe452f1eba0aa3e5dabcff52688a219539db49c3adce059d4726fd9f31c26d0f27f6b8408da0d8c21317cd13b02554d0a9800f9b6737aa2c272cda4fff2968a0850f0fbef99bf6ee9d8c4e9f86a160cc48d5ff93a9ad829a66245f8fb39c34a3ca636105b53a853ec275164d56a09bb06e6f427a45437dbd0727000840f75cc0419be8caa345e8b369b69eda9aea2ba7d952c91d4a697a0fb2ded57ecd93ba6708eb36c6633749f8cdcfe84be538f8a85f92eeebe28a003c652d6d50e3b522b954213d50e0e7e5f3ac55cd38a9338d40874cc10fbd4ec8cd772f2fbc05797866bee79fe1b8773d440e5b5624f625c280ff34c594a8d8d52a20151bc342c89dbcbba446310ae7ab9cb8bf46b4cd547ac6ce40e5ea4d316718672ece16b5f348cee2eaa953f43e8836bc8c45d6f39b66d7b6beef073fc51062f50ffc4dab9e595312848cbf90c559b0b5c10e8173aedf1f1e05c4d608216edbe72c18136406a135c7bdafdd7e6e62421aa99ba97b7b014c6914ea3832662808d570bebe0860682c75abb3459eb5aa8491d0d28fdc8a4d56ba2c9f8e35236de41261792f8ed3904b2e7d97731c0d02107c1d6b2010918e96aa7d2d479694ff23f17f294940fbf21f04f1665cfa6f7e3ab64b0413525afbebf486ee8ce5d0ce3d319ca86c96efe869b01a1bacaf6d302cd6fc2bc04503da14cbad308b8caac9bf913dc095fcee4e00c2bb4ff6fc38afcb078f474666cc220479351e9fe949f153a729401f7b9b23f11806037d99ddfe2f4cbc83593649e932a1c7ceee584cd7a7072b5e7cbe90ea5866638cc1aa85ae7cd451e37e751ff500e5893629e2726578e727e2cd441677e5aa00338675994a9c64881b9da4e8a31d68ecad95ca8233f33727a508549c2d687a38c50ff9f639d2057acac8d8e95a2f1a6b767ec41c2c766293a1e3b0d02773ab22892a8a0924209b412d1594536b3a769f888f95954309e6e355a82084990a26670c815dd4b429f314f0fcadfc3b3dee35a1a0d1165de8109dcb47dfd9c75ca3b3b75fdaaba746790ee1bc8ce01d9276ca70f936cb5b3bb09432cfb25b0f3480b229e0a16df23c1a5b2778e6d8cde968c61a7bc2634f5da72fb4d04e9ffcff6c33776d8c288488e297adad8601fb916953c2f42c88f128a727fb67a3a3a2d38329548b8258e87a9373c4fc8f06b87058e7b55697721db2a7292a743563232eea2e65f3c44c015913f2564a6599a5f44e59fc0668b58857572d5679e387c65414eb123a305c04d737d0446007f3922d34c9b67023bae475c72f690b1e640d4a0a84d0814c2fe16e255327740ef2899fcd17f4370e638413072fbb1900f6e4b04bf135d7b1ee4bd032641d05537e13b1b2a3976401204af85725c835e65344e74505185725b125b432e253bcebde21727bc1b534bab8e3dab4a3d2d9183d8a4a6500ed2609753c2778e19abf21c4e77f016a0618ce4d483320a839ee89520e6c782229ba4da0fdd00122385f55e94d27e3a5e5430e69fe5e3293169435f0bda8fe4c445e11e2b3273b24cd15a12dd6706daccd0093133c3067241d2152771056c01ff87507e3da9742723236a434ad91e584afc0279e876752110411dd9ea2276a10217a2f901fcb6ffffb9f2108d9e0cb38d6fde7a4251a672f8bcd326d44d965d83d2e3b4bb4620f5a59dd0bd4004811f6b084356ae8c98729c90f0a49420cb815fa86b16e7183a216218dad980c5caebc31ee83d29283f72b0e50ed9fe952a3e1f68140a59669907dd8e78bf859a9e7e04a6a087c9485172a6428c67038b63a7f979cd65117e2775500f4d2909a4586030d5fac087bc0272ccedd50c5d74ebd267abd0cf84a1bc72d3ef023b310d846d74c88220545d84723e598cd550b20a9e26d02353d35fcf2762ccaa7c081a7d17d5fc7262a7a29e71cdd5454541110b7724346da3c198509aa88b03db1d3031c51aa02127c462690b505770058cd8b89d54a9e4a113873c121c6fc15ef5a1735029bfe125fb736072c078abd712b6700a16f66aba2cbb67ee711281cf35821180cc35a21d7d3f737292abbd93dd85bdad41dd5743307c56a2ed77d2fbf58a5dc2bfef72159a11b47267cc7147ec079080ba9bf0291ce96e706b1628e54cef87b2b944b672c2c3e172418ab2b150f852950136596e2a767576f2a3c82b5fb3f7daa6029f70c6a1df7203067cb836847c102a76dcff3d30f9c93ed55c4126004e6eb06d8240852e5c1a36323d2efde90c4488f6edbfe0c15f9f0eb865bc8c466b4684fe3add7c8b396fac99b53897bd57584902dc46e0f3065e569563775dba55727ca8134f4c69b872495e25e62d5d7995f6c9f7ae305498c62f1183946b9fb7410eea985810be807299b56d914c30c2b25f37fa81950bdff9a240f600966fda62337e9d2312ad9c4f41ee4b0274c0c6137343332af71062be72383637549e5bd4a2556fe30bd78972e170177df585d6871dcc9c5fe98c92037fa48bf900950ac9348bf6c3065ba8727bdd50ba06439e2a35b5dbff0a33b978aae0518269fdfac094928fa478010365ef7ce49d629195faa64eb64ea82686a4050e959d1ed60818644f2ad90cf21e72a7821cc5c9f6283c6a7ea77519a9cbb9f694ce623cca55e7d31fa87bbd1c13724fa656881deabdbd8f0ce8bdd4786d048a71249600256c7d1c08b943a4ea8d72e7831982e6de480d7e847c577d1ca94caf583c27ddeb862d9ad16265e85f824c53f64883b5a189c7c3a07f35f0d6511e73fd8adc4d661cf614643086f3d67072cf3dc41204724a58d00556792e3f8ca505630ac1007eb77d8279207300d7b9723021634fc61c5154e43b91514d0a284961d0beb175b25278aa0170447d89ea726136a63bab66a8b6886df800d7895db9540d5bb6531a9833e709b0d438843747e977d5e2ca19c833d3a6cc56fff1335c4b67cf6e8ae26b00a3671d93957f0672542ebbcb36b5c316cd76c3218c9b9c3ff4689e8a75396f8d401686c2132ed072fd293102c7eb9abced31e315d2e415c91f2d1e11f8731046dc9c2b5755524672e5c454268ccee055b44ccd59235e7730a992f3cc0c39397c6db1c4e8782b7e720f97c3783b991cb8172479c833e9886b15576fdd78d1b6418882b333d3c9d9729948f212e7be98e710b7659fce1000c5801c02b83e22223a6505b7b4dfd9b672e8cadb23d274610045a00bc828063b76c33d11b3aeb4880c484dda25d2ec876e0d67311ec76e8049b66e566bf90a192793a6f9695e4579b63627b4e5fb94d74edca244fc76e84ea0e9898d6d59690e4105770c8607ac9664eb493fd475c15772253bab8e920ffa817671179799b667ec4716629efa67742b22df92dc65282d6ed7b2743c044b717d0b0fdc0625b3719188c62fa97be0472248d12e039d2a4c729585095c42422c933fad88898b8673aeffadf06ce3c44755463f58fa18149b728512b52d317744a7a2429e63caf864d1820c4fc37f282f0dc99c8128ac6f1f729d529ff902b014ea9c8ef9fcf5f19f71fbcd85a5dc85bd56c8b78c0d065e8838725bba6d90e65ad151c8725742ea5abcc645a66e294b2d0309ee10304999e753d77841274413e8795817bfdf81ffa1d5521bdec89202510835b2d98c77a1130236b5b5e3294cbdd44e4b050916fa8855378430c72abbefe32fe26b960423ea72e294a3cb7b490566299ffef4411c11d83af9a497e39c6f8caafbead4b4e2d572eea9d3228357d3af5538e1459fdf3173bb678b43718d92329006177bb4ddc2727786e853b7b353e6014217cee136cbf9bfaf589aab77dd2a220698f17c929e727a2dfdff13e326229bfa76e018f5b6769018ac18e9b3efe4110750735f5a4d27d442cab514a6e0a4e3a6a6c8ab2f7dadac5a3728bd7582a592af8c2166c10672797f18d969c4e440e2d924a0e8edd649c90940b75da56f4601b2038344fac900ec29264df894dd0358ec9dcb8e33e07027fb0dc0b0ab4aede65ef2fb7168db40e32cb8969b073d8b495e43062f7a84e65f699c57719aff4414825dcec1ee7e7281a158f61ec76e90d0c16083e9b5b2486078b774f6d0b5f1dac20ddd3fcf190dcf35fefc0c9b6f0705fe2dba613256e65809baafb786cee4d15da812b5f4ea0fcfeb48298b50c1a9a40fc8e49583cca6a573ba4610aef7765fec5c85a228ba2c4b7e131016163e81a666a534729c731bb9bbba1d884ba114f7d55b759a05be72b9f9d99bf3d6b98dc702b9ca29370212a60f21807058370902ddbc6a73b9284c4fdf35e8dd177355013e54d2071694a88abd1ae79eb886980a7bb0193e7e4335286b248f2bf247ad1b310e7b05e9f6bfacaf5b92e37e56d613bd450c065c724a6fd7aacaf7561e80ba100c6f40a13096fbb47053cbd1787497df213af868cf720244ca3a73c4d9e7f901b77713fbc9834cc8dee01322c56f3a237ab74d431d72eb25177416c8ae575521432ca983919fa3543b029bf8042fb575406b1c84a0720fded20c1859d014b27f91305a8052cc7343e4766ee027af6a60a24f4b203636bb6f70c440b1af0153636ff2608d1e131e29d45aed04b8547749d628b6e3270ecb75a7acb36b119ad07821e7fb565c0cef7933b619ed04ba46eb4634c24da272dc59617e3e3723f7419457197953117077fa6c99ef334e1d3325f87f55952a72f116ec641a719c572daa2b4f82c6ce6989170cbabc9ff865295d532dd2ac8e719992dfe45972337360b517867354202aab254ee534a5615e9898172c94349172c29142f61d9331efd01c6592f1d38534794ff03dda5fd42bc49a3ae38416de72897116a8c991abe531a3489aafd990c0724950966d69f948a9cee3c59772a872229252bfd60117b4d7d11d670db57ac9a52a16c2543d3c6d4cd341e309dcb37204cc28e4e2f4f2071d9c1a6af74d886c8c797795ad8cd1b355a0336ea4282b72da1f752d0bce2631dbb0b9dacfdfce6bf10b4844c965e7930ac91485e810ac72fedf4e837c5dbc6dc8e61fdc02405ad500c38de0a3b0d99d9b9043addd59a772d4c89ef48fab8bf8e47f0102d0ac8de2e7cfee3724b2095958fdd570107a18729a8d5bd27592dc69292e73905514b2d222431159c27cf0d01d5c38c1064a3b7267a11cdaf12f2c355d9c7bdda11e19978ad52d0722ca44a95f72cb27d5e42a728c1dda49135086f51156571d28fba5e3c5e7096db4df107d1d6773a89a5aa37278bfc1c3740a10a1bf1a6c84df7445b7c65e93b41a1592fd05abeb832abc9472c6f8a478e2c66cf0ed291807f0e83bfe1b2daff541ecbecb8f992689bac6327278b158de25324207e4775ba7a4ae64a871db1c46a887f79fe4b69634292c15728b0f75bbac33de751ee25ce7d4800c0516bce374aa4eec3db89e0e1c8dedd02a414f5540a6ff949694b26b95e483ff17dc3b9b66723d1721675cb72e5a1ed972797006944ee27f3b97e7f4f5674ffaf79645e2aef461a70b6dcc0e34eecf64726b82e4250da2da6e2d686f9ba687bf2c1cb414f5c8b9333d1a4487441c88fa3e0bd0e5cb0e199d0fb9a93db2803610f35d9e27e6a92e9747687db539133430722e89ab11da9c60e8c1dcca221fa27869d0383dfebaa484d9994acf795857fe4e8a50dfb0b4c393bca85d0d792d1d7c8a774d0af89cc69315348fd0a2f3dc0e0223438688e0c3f7d724751173af5912c402ac77ca81faaeab6f441f17a3c77b72f1a46ff95192ebb6bb00e33509b201a827b6834211aba27e08425f72c3fdde724bc268fbe019c404c6611569fbe203c110e98c9f623d6951272dadddfe435772d0574af5a1ae0e1da5db73c4816a28ac6d0c233d99f46053d97e2a4b1c3e76729f7694e7fce923453a4d8bfcba2c60d179c5b8de01ea4ce1f136744ba096b57261066f6db3ca41fb248826bd930210e8a4a1cab656c9f71e82feb4417e044c727066dad28f46c2b8201d7b227aa34d6649381eaa4769f8f0059f5739913ecb5b92841eea47697e1f4c3943d9fad0427f81dc576cf918959e31ec027d1eac4b7274eff819a186e39bde9c1489fb036ffcf6a429cdff0f574ebd2808dc8839e5726e81ca2f8922f5d596dd91b7f219b9f5d4fd147002735bde0935551c934f03726c31b12063d5169a64677307928536f171bcbfc042e9180c62cbb25b45457029a2f50b51b062778b9c67cdaf948f6dbec5385e6c79d81843b3508f9cd12ed172f4d6a1ad90e501b1cdf2e1ac22c3da5004c39b1b1c55762c188fd29df1f06b34a6939ad70bebbb1705f5bf5763311304e781ac8c10fdf558b71f995923c22772655b430fcdf5dacb037d688c8d673e1d22055075368bfb10fd60adc83cc59c0351fa32f451b6ed25eb7a9fa7ffee2b6861b0f409b7b04ed23f7e4d4ee1cba47208b0d1c2f9d7b4cc5f13cea07f29c9d4b528964d9719faa3b3c8ca662a0d787278b586666907e39a55f9924d693d94c118e6dfa5444af30f0a3a2c58dcfe78720871743d16401ace91428cc68f8cce260cadd682a79f3c99748646f3a68c405a88490ca48b19e906bb27b6ea3331dd83215b722d4b6def02cd6b2f673695f81e8dc366784ef6c3e995d93766e41a0c492a9277b362f419331b8d0ef15576547245fb171939820d55b15227db70c3887001243a14444938f3ab5ffc74711533724388cbab0a3af28a78aafb98a5139c023565bc2e97e6a166f9cac551ed22347224f53e491e79d0eac6c08b5854a95758b328fbc07fd45f59a594ec3f32c5700d5e3f6582e5b750d5d5c27f5274923dd0bff76c6ab4a8d6b6c7fabc45298b7949795c42e299d66bfe4d6e42bf59a8d4990e265e2b1e478dcdf9d59337ff261b5e961939f4a90bfc425ed4f6fb4ae388782cdd30754bb68448f41a29c9e8cd5443d85e1b56b51d0c5d3b42835e858d963517e4ed0abe00b7998bf16d6aa1d19258c18bcff69c0fae235849d5d830c45b8be1887172f2f41d229aec33f7e13725724ee64cae0d2b157c1d12bd93ed2721394883d423e4ff317a38c893934afdab7205e9def197c9193de33e67dd2115bb3107d2c75a6050dcc6db08c01305f32c722b70114c12b06a47fbe3a198d4c5ed9769560ba9e3fa0182cc970bb2e21229721d11652150b4697587fe3190a3ca3da3ce6ad66df836f1bc49023992702b7572d6d154de3fb8632b8a93d619719443c040a6d38e135204dbd0fa2182aed34259e31b7134f46147e47ee42ca412026ec31b7c3cac2bb2316c9fbeb65aca3cfe72c9c50249e0fbde05489dee8924acead4902175828bfbd1255af5ed75661e705ee07d775ea1b37304c6c71b002f8e27b421e525c9843c3fa4d3ccfcd94cf84309580d5ed0ad14146440ad14460c68d8c626fcda8e9a81930209a500d8eab2805744dbdf4e803556e502d4c529f7d06f7186f19ff6e5cf11f8443d6439442610725de4ba9f462a4887430eab0564fc25f33659ef1c279f42f2f040021b288f2d5b98c399ad4dada7f4b7efcbe313d8bc83aa45ab95b699114b04480155b7dc80720edd90eff3401facf7d88ccb5958a24946e80937d1c65df8f6769c6daea1bc19ebf9266d8b3c2af0ac00f02c717b50f7075368762cc43ae292cd34299cebfb724e8a6d8c110cb5d595f8e8285fdb898a95013f9549bd31f303151a96bcc76e34e09ecfe16cf067395ee51b9d5f6a1afb09512cbc4249b4bd360fb0d0c789b105dedba8278d19daf1c2c39d595457d115b96b3981d72c328c2411e6a0c329a7105320cc39ed9b5d9a0a7fde2020fb02cae55525043a649a88c513f6bc23d5207276cf17dd58fd379beb260336fda1c19628bdad7df9c6fa56c8fd7ad64e2c297230d1e76a36528c25752b67ab973ea97816951b046c5b8aeb9265b4ceb4f6c31032991ce3d64bc12d6dcf8e7c731b3566dd9e58a1afe91d87dcaa7092909eb70135a0f90a28b45b15c1554256ae2a534bf10f33782d91c2b2cedfed596154e54d02d8779a700bb40a8edb8801920461bf7abccb441187f384d15a36f31ada045e62c940b60d80e7aff16db4993e0f15e43fed21ef5ba88ea52aa5fa70a4325028c33dc6702c0371bd75432573b6d7c7b3c625eee4ddbda7b861f88e2f6fbe1b59849fece06e37c6ab50f8d6ffecce2394c225ce70d345b326302694de9ffe3f2490252ed8dedbd97d1c6e6d868fa1a4f30095fce3f509fd6b17a27758ff53f0640cd548bb42242a525e03b47aa2f8e659376b797ca6bcb5da71c2a54f8e214e22ae0b1d50bd2afc7f0163f150efd8a47a38216325abedcd01ebfbf7784c2ec472e86b3462b52e3240afdb7348a0c82d38ca37bd6ce7e07c9596daf938f64c3e0f22b7a25e59920eda4793017c2243bba6f6445a670e5587dd3680cf07a597a672e81868b226b930d5f16cfaf11ee6114234fae483159b9a5ca4c1498058d2542f74322128afc2688d1316ebd00299d34442a3dab297ab7fd6adbfc5b55f174c10aaddf508630c006a923f17d84cb43707cdba51288a452c40ce99b14ad0349c72fb474396136024685688b74b32176047e35961cf8ff481ce80a2d32e06528c7246f1a0cea8a06a61582af2d1fa451ac173e081decb925345b8a1763a4fd671722d5f31128e030f5b25fbaa4ee36a223338a21e2459831c4375d0b572d49d9b727abd463640c9e2bb08c4fab6d1011515c05691490f225b3728426ee228ceee023c3dc8d17e70175d60b56a927375133cc69c45fa9522c56dc5dae20b5b8fbc4bb79674ad23c07c681a5e110e1b90143dd0e7ed5f275c3dbe02b51cf3ae302c50ddb6bf8a446b328c6bed19a4dce9d1871ab854219fb6ad8fd206f14bf2b38c7279ce3dd9ee007802e8f56421b2062f8bba062dab27f221d982b44464e5357815a72d0e279b3123e98ca4dcab47c70c2fc5af54787c5c41341556f190ded7807215ec53d141b21502353f141f90c414705cd6f073f704264f1cd4eeffcdc5ef72239cda58bca7a5287ea0aa6be38f191a31910b2c034e909c53df6163650cef65aee250138ac318989ff74345042fb38f9b67e74fcb46d7e8d6b3906226e670508384af25d54d2cc40ed72239578cbba05499bf6f583b403375f4ca8fb58e70609da521ff4e9cf9b3d24b78f1144696facfa6723dd82f963a05a282aeb0e62872c8c7d001b966b0b0cf95949c38096d7c7d1b6b9dc31291963a0b234509e9a972c74a2e1cfa6b1c3dd09ea0a61ded1c9c3286110a5a569d7b2e636c0b5bbb4b41cce62b93aa67034e59443d570de8a5cc733aa5474a210b464c45156488a32972b96275bb7bc50abb1163827eae19b4ae16a3ab433446d05e20f6b21fe08dd372acdf74880adfe8e8745f4b46da16eb0964d81bbf55c5827d6ba9486b453c9d7293cf5dfdd61d0259912f72133e5099f9ad7cb95adae007c9432a6d328905f1726569823dcee5b9c2042f79370d08a3e120c020c2d8f4c03dc5b290c1a7f9cc722b8c379d798e6e8dda693b44ff74e4f4ffc533d530c4deffb3f4b5736a8b3b4a1cd1b469b45570a04aa97ecc44745c7a0f46ed8e8869ad9e4384804c4b6f306e8482b99076a5332c674c310ad4238c9f22afb95f741dfd0f98be7be0b8675472cdf411baf013d0a01990c61d2f350991740cfc4037312eb39ff112e8f423d07217e86267b3978b8bbb25660366089110a37e898410ceebc57fa0aa620e0c4972bf1ab5351f4c228cdfc210c94754b424f192807117ba435029a64ff6b910fc72e6e8eae1df9eaef7da77a4fb41dc9f1c7ccd7b27275e9b353844b6c73712041cc092883a02f7beebc45d7b635854265d8b002e7723f0f12e96cee77fedc4632f49c4fa3c7c1ed8c0a7df8fbf07720627e8a0f99fbe425b3bb0a961c89d722372f385a4027fe24286e4bfae31dbf91510c3138d036d291f5c40a861d1d1ee47320c6a208122c91e2d85e32da77597202131cb3c0c218c6ea7acfa2780d9947e5e758060eb4e6be3f496ad0b5fdf8d657a21caabeeb84743036fa8e6fe4e7a1f502d8618f64aa47327cc8b88bb598157a61a4791f6941e8c76a081a7a895165a727a32e70726731620d52d1e91fad0b27c541f7a434e4cffa783d4b78e063aca7285df8891b465232f396e7c55b74e5d650e2fef6bbc86a4eec2390dfeb95bf272b6a965fb4d49cc4c1ec0ca40429aa2917c2a02b926bb59eeb221311434c5a1484c05ce5f306d15118ef7c982885ecfa385a2a13c71e7d578f22c4675d5e79772931ef771096ef23e02860f8206ea52fed6fe26965a3db14339eb6d94e233d27254d7113630b676faf80b5af84fdd6ba45b14699d43aa8092e6539e6924a3aa727fc00158ee73b8a040aeae2cf8ebb7def934db8b48f88873d327baca6b53df49f0a1499f6706cbda08848ffb9d2639e802c5252cd4dd49bdbf80798ee802ab2626e5629eb2fd364604358b8d38f0983a04a0cf5011ef037e24e70c7dfd55217232e08daafbd7f9c7a06af9369f2c106a008ec86d71203be5059ec0d9373966699ec748678b9b768dc4eaa757a8f7f2f31fbbc828ddbd4044d6ff348347aa0942d1417400166fae45553872357b9b58e921eb268710597433a02280a5623dca7235dd49b9fe6ea0cd869918f66d4df93b3a94dbaac00abbef42d0d3a377fe047256ceafdd8ec67a77b6df79b70a934583c8f2d87c54f350931da18c29be38797298774d22f8c6d101546d00a70a9beb98e90dc0b19ac722ea3eae535f7c65731cbaccf7f11662421b49312c9858ed2ffcaff00ea2a4ceef20e88e6316c5d41851226d575f7a3cdc92c612d54df27007403bb3fe685e0d70afe2a09504033f06709b15c0bbf968065ad65351060223f10cca7384ba3da2896d012aa8ae799d166f4f1f0800d2b2445ef1a8a71cbc41575d39c22b8c635c706e7911498dccf6e6723383a8e610b6d4b5009ec4e7e59dce87816b7a15e98df6110977f32a81f633727369ea60521bd1d69fbc9a70dcbcc6a2b919b540407ec8fd48afa635f3e6c01409760f6d4cf5af8266b3c4c12c359bb2fd55fbe61229b24c6b498577410b93054e11c4c5f2a99ff482ec5d8d1164e9a832c709339272720f05e687bc00d3bf725381dbd43d89ad84856fef2426f6d87790713b90184a01f2be37107c6e94d830839d93ffa2aad6ad1b4c687eca21999652e44494a4f6c3757a55ed2b3f5d6e183d35d0f9833dfb22a7b9662236d6be698a1ee4656fa10d372e61210855a64d356e4bac48620fb14f1ccc08eee1dd65d00d2240ab4106bd9b49b73f340df61c7235738bb97d254cd4f149bad3c3aa5cff78abc40f6b8fbabf4eba329f929c2472c15e7cbbecb62ebbc86df636094966cfba48091cef923bfbc84e81b741a57f5294abb26bb1136a79e837ce963f86bbda24ffbe3879da804da9cff71a519cd6729e12b2b38c3f569b13a4ef052828df21d8ed3139c28d501e43b03bea6d5b227268721f8e598fbbcfe39428ea037dcc295eb4a63b74aeb28538488856742dd03ffc2280ddee80d1e57c0a605e36f3ca4866b3afd68be94584f668deb087a4b20de3769dcf9f2c0ef438d01b1e5451f5f239476bafcf56eb64534be204a0766b61180e1935e004b30803e92e76ac358d8c76fb3be28ea67fb39d1fef34886f0e7286e6564e276c4be58e796a9907dc57a6ab38cafcca951e0672b9b0388b7f45729dd6f1c687a24865bdd08fcef080f00f122278cae88d30b3391a28c6c3bf24720e2862008f87580c3f50aa9ebdb95501f5baeda74e7f1cdf6ef766fe94efa26d71296f3b912f54c82272868c8b28c99e3f23257908f90286fee581b6d82ca8143f1a7f608cd6874016155a68d4747a8071acfb4aeeae866755d60d8d065236722e931589a25c8680104886d0f3b6caaa732c0d12dd6e1c0aeb30cf2ce86f4e72ac836415b8df074cd33d472e6276826f645321c34aa6396772a550d7863b3c72d0785d0f2f7dc22d70d3973265886831896523a00ff4ca845adb73352ae01c2e155e5a1909f8c31e63f4bb10a3d48efe7671eac9807eb86e2f8cd1ba26bf90184594bcaf222bcba75e7dc4b9277d8d18de9131b9c9c6b926e7ca82bf5fc8a44337766f6aee9446a7479d42e6757896e0f9d31acea681044402aae95e71e3243174d1d0c5747a8fdff4c8a3419b0247d0fc5cf512389d9224ebd50dec30c9936f82d9fef66423120044e79ca6445d0cc7189fcbe0706dbc004809a86154ec8772eaede7f4777905744319a9a4b1adcc95b0486c998ab81d5797b9c3fddf1d5501f5a7c23432c7bd37f5da5ad63f91506db8a1b58fb9f9ed8294461bb8d23d3a185de435e21d3076a7aff13630f93dc188a78de6979a5bac32be31975898e1335f5bbc8a802da5a03f5e9a946e00fd5f556df6a48871202abd66152e21c557c9729d701573c178495fb09f76ba8f898f84dd2ea88dbd63d298a4395e749db7bc726665e6a2800f9223cf7f3ee6aa0e0cc800f0ffe6ebb4ecad0f98be04db242a6ec23ecaa6a1c24dbca7766aa700f6eaf3f2e49a5176c3bee0df8b0025074a946e62e776f3174fdb1e925da2c629ba422c5348fb83c5b69050dadbe9bc5181e4203bc685e5f84db52e234582e889642177fec2b830a909f96b0ece6a251f757872c6cb3789cd47cba07d93fa70e33ac976df55726c1acd98e52f92cfed21e33e721bfdd81d4458cce9fad25e56557c763889d16b74fb0bdb1f918431c453d09c55eea3fffef8d00cb57ad6de4da48d55acff9449f2249de3dacf0e1e9ebd6fd272a3f9ad17506adf58366ca76416a0f5f59cb98fa5d6559594b3795401971b7e72f3d7b46aba19e31a7c3da455f1d918a4b1d4ab79e0e2f5d74c8220b0f6d8b071439238495c58d79b237321a5bf9cc67f0c6b3e368d63b039897a7d9f9d001359dc32dfe314892b7051aedd0cd3982d0874674a4b297d8379b96c55bf292b8072328865177fce715890c27c7ad4bd0089eda711ef2e0ff9716cb8f50dc5502972ee52d67f5e481396f3c13bd95b206279706beee72de0e2f3c5034a7e10174f0d65852a45a8dc42219544a8b7886970469f20635081fc5fd403da275cca4ccc5afd03cd053283ed99c56b659faabd2b529158be4c34aaf205ace79e2c808de30ce3bae0e73be538defd1337b8fe492761e6389c118536a9f56b1ecaae0a8dcf122ac93304faccea11a776b94c9c72c324931d8c24024a162c535bf9dba051ab725416301276557c302d8c1e157dcd04e16db9e3ec7a9ada40c9fe1d307b3b477241991b57a6580642ea1f831d7e39226bea57e6757e2323d977b552fd6ed8597231b6ac6adb70509b0d42ec3cebbf11dd2594b28c143a7939647af901c3f00772a6b165fb6f40e722a9c924aa04aadd449aafb513dbb5b63141ce6041f18f8f72387d9e445edc72b7b929c8ded6430760006f291697bf1dd278737b8ecc03100936ede73ca9a5920cc4a692928293936d3181b985024dd01a90027365546f6e64923ffa5ab470f1980f874780712ada800199286d6c779f3ff0fa50d7afcefd7202f1b0e13dbccd15ae5a29b5b64f37a00b7a48af9778173badaa9a231c6a8172e85c79197d67dc72bede6958a5ff6a0683bc18fe013bbae2c91cad53da55ed721fdff9b5e591f3ef8a192aac440ff4a3f18d10a164c647fd86fecba88c66b9727821206b37d833ff599597d1cfb3239995a7b6f15ce7beafbeaa76935a4d4e39fa114de14c62f49654c73f03e004de6732ee53c0387581f0c8691e159687ee2c6e7000d5572e7dfbd39555fda1b36c7e4126cbf6f622f648f2b21d81dfae687282188445f75aa35037022067b02c15e4373116d2ee9b1c01ecc5ae4967e41d17d0386d5ff7a03aaa2cfbb571a0bf3eaafb59f547a22e5b87fad504c152d272584a5e2a51f28102cb05dbfc75cb2c5701e1854b26ec39e49174d1b87aa3f2fe647d897f7c34a69d04926361e601210c5a127fc72a16ddf0225737c7aab0add0429754cc750b29bb3f3dd1f99813cd590dbfb12501b1bf9f8e3c78b884f19e5b72952daf32c8be259c475687a2d55287f18dd844d3cd895b864f07aad5d06c5072d5c584c1e8f32949ebe8582fa19e16e2e58215f5a6c225c7cd6c14c779d8d6723177731bcf439b59c5d0a67559dea8ffa02600f8b0f2f3824f436a22252f186f84cf8e2550624b2f1d322701a69f18fbb4b081b08afe090841711a4245cfa572256f6e586ece22ed30a67792a848b349158d8fc7ebc07c56c302cb6f76c65f23bd8f488ac0f74e575fbca3a21c6e715316a11a87b9e449c432146b44b3ec652d5b09709abaee725eb7971a64b73edea605960ef0ee0ee8870990745c019d91147079e302740364147e5c8cdcf1aa85431d209cd77787c6d2d91c1e998c8bbd721f74a24ba278db4cebdb6877ea010bcb30be2e8d85ef1030d2ebab5957f177727955bbcc46be2cd33b7ccb46a21e6a2668f977332e653c5d81c88db7e6b95e725264b59825d4a4130b0f4d5012cbc30df24745b2af089f955ce2259fd7566026b6e5ae63ce3d53128da7d015143fcdb20f51e0011610d5c0f7650a136f389d60e5aaaa459cb59218d205d0128cc0c16e08fe7f48f383dfbfa5a857fd3bf23a72d9ec2c13375799f81b455d15cdb66c0068eeb30eef2d1d7d97f11ba5210f7e72f0640d5f27900f3d86a6c0afe207553bfbc480d9e84e04edbf1f8c9fed7025314577f000399d6df0ff4f92cd918711778a1c1f93f44543ffc1319fb4bb5b0f30f26c246bf0bff5f51d5bc8a37055afe320f89ad579cfb473f1ded348640fd67214850f7dc039fd6be9ac7ad462fbfb2544086c273821f0c774a6de682ec330724264ab41711729bad7f4794d78b8693d2ef59a1d96336af3d498e68358866613498f59debf88fa36ea470c88967a6bccc291957162e4883e0fe173449a5ba13cc67afb04c0f26bdc71e239f7d6f127bbfa6369ee1bb46fd9d3cf81da5b060272e9bed9b77d964715b8106a02b02979f30b9509a7cc9bc615242c97c711dea73000b727ad7f74ee453224d01ad2e3b41818a6eec957d8de3fce42c69b0e720e72d5dc16579bca120f63ead8e420902b5dea49dd399a767e2a6984debce3160f7260ca9bf1592343f22b10ee2a69268791339421ec63b610681ed976628f98aa72427160a41ca08d8fc75272a6e11eac086dadde9ec5c4a4ce602562b7b1cecd61b454da8327ebb31f71025fa9d00669baa4fabc5766badd9622f7b7ee21c88d722fa26effde9bbc4f087e15b9d298a6e00a029237547d9d4fb403b8b682ce3872d509dce235aa4ada4f16feaa3b7f81b66461f361a7291a9ca0b752a364266d723862fd87c0161b215c6966f4ec1698db7f71910d6f61c80ab475823f265eb2725bb0f2d6c4b1b65716eab23b44450549a72422a5e1119f2392ac55d2b9379372d48fa5ec91c15bf7db2ec3f4795cd967e9da1cbc40836cb7ab5995b9a4ec01727f644173791ae1832db66510ee1271e19f48d945ab9b5ea78322faf8c31a5372328020512087a4508b5ea46ba7558eb0d3ed12fef4ccfcdfefd8bacef6d7a272ad3eaf296d6144a9403ab8e084d87de704b04f999fea2bc051679e1b406d73728b87db6bac300c1968163a8f037dcbae4ba1f4d5ce277ada1c7dde75f863f11760888b20db37e774748c3b0db91dabb8244743abc80c59f41a93360444e1fc72fb799a538a298e7404726a75d6b390068a0ac3f7986d7a54145303acb19dc57239fcb664eee4f8100dbdd02ef3a15900213f5c2365e6183eedb94d5a633ed9728456abaa7a548190874d5fdd4756dd313145afabaa8872ce38daca50bd88067272bb7b0f997a641530d09b23452f5176a342f3284b4377316324291db17b4b7240f7336fc63249b7ef09e1d0f4bf9878857847c8821efdf594c8d2cc8b8c9c72d94184cfe24e6a91efa7a6adcc6494d0a5083502c1dcc57483d1966ef0846f49f6c54dea6252f1728333405b8ff4e0414285e1ec5d7b6ef5470b4ce7e7ef2312df53c033ddf8a6a5767c30d7fa865c7688b203445398a4e0eeced76b51198172f263f1ee104ad505517e7cc0c37505c254032b7ba83bbd7cebb6b9eb9ab25372885c2fd6e346d257b3953b0c314e3fe455a0783f97bffd18eb55e948343f431022e4178ae4d6a1b289780d50bea933c011f7aa36cf8aa1b0b355fee5ec258a72fef9c5ac300e18ad50384be443f25936c35b1208b0baabb87afea98227088c172a6c8b41bb5d0de247610a2e8da89b7f3659034a1486b64e38daac3beff26b72846e4c5f70ad19bceb65a543df8b46a647a13ec67ef71672cc216924d224913864c5941a554cb8c277ab38d45f014520fe79253cb97014e36de85a517beea20da3994851f904a17556b84fda88813b6bd3d6c50ae3deec69d3ed711a29d17e1dd38d9e12f7b6e2f0da3f1223dc5abe5b72e797f493aadab08fd244df121b4d65cc1e52ef88f3380d8d15deea66ba719419a02fe010cffc3e7d51a4bdc4c14f1967429dd0bc4e07bf6c94ef5762fc783d7b4d3f3eb73e5bcd57cf5d92657315725cfd9c48222164c8b57bcaeab7dd0a10bc0818e48e6abf3283844ba13f6aca72c73cedcbabe099923c7799680a073fd9b71c1840d576ab4c7cc2badd6327f23b5d651be195a37e4da1a1e215ce7d4af9c0354b2cc1692a756b615d71a448327278c47900952459dd606a0f88425d2e7d5b61ab1506f136f6b194f7d1d4e3c07218ff7e74f8a4a7a84bb1ddcdcd66fc084c8437f94c967cb953429f3627b79e1e164089d5ded8308300d0cfeb751ff17e3156897d39e2f9df59aed3c417b55526c42b5d94ea6bf02e4c29afa393ab9cae3df012d5be87794b3d5e7a0fd5603d4d05ebb9d865118d560ce0eb76950c7ae87dbe9fb3c5823c6c80a93ed524c8da72b6927660629d2b7945f55ef62e46e230148511f55e2518a3034bc8dbc0ab491079b3a09a533688347216d0b9391aa1e03cd3a90222739a36b04c6356299adc6c16d2971e7cead60ce2d1b3040bbadaa4a0f18e08102544ca8db8e4629a2d1b72d2ba0bcb505a69d91ed763f454c56b8eb448202e9a3a21c787731c84005ee0024128a7f0cfdcad852eb531ecedfa9cf34bca75ef614d034f7c489fed44e12e724e1cc305bc9b7265b58f717797e5b03521f3013584a78f0106f5a3af3937160cc36e9fe94afd77908258331b0c51b578cb4eac9444facb4e51bd18d2ce97de5763e5a7f3a3dd5503d36c7537e484bea6242e86941ffd6ad52127fc7afd88d4726356183382da27172132ba01574d80a8ac7b1cc79963255b0407d00c612c7e727fb154101f00067b630370f3d5486b29e469c3b82dce3c3cb430a9bce7d0f372c7c8c512e14a58cf14cf9ef347b5e6faf5ea6da8b33ec02a9813d9455c3ad2727349d19ffd0d6937cb6228a2624d7c134fc522460248981d1c0636b2fcece51c752b075f5a1a8b318b52da65423c1edf7b1f37ba5285ced045b7cefd8c6ca839578f2e7cb2ba3014dd3700474e625b4f89158e97c2d3efdf13d98031d9217672f55c612d75d51ccc6ffdb5759a65816a05aae6b48005996799f4568cfc1a7c72b9c61124c9ef759561308ab16b2721aaf6f120096801205818a038c209766f2d94d054fc7328cb5f756ccfeae446657062843a944526138ed47d8787f13d137263ade9f53974f4ff12f0f19a72758d66d58428fad7a7ae499df0d398191bb77292a47294138264cfb0656ce4b013b24aab3c793d4425861618b2a347e204b324518fccb56a3acf628895d53f4111064ac68d366f3af385ccf03e55c5c8f0481aea69fb5c51ee86af0750b52fb4978c2e1109f52c50e2f41f4a92e357dbaf1e72d61f73e95fbefdd49a7477131f2edc0916a61fd407c23e1d660376e1495fa772564a5bcad66c44eca4aa9c23244a69545f8683d56d8ca305b93cc9f8256b0f5bd69a172e087af2ef66ca8398474f96ad6524b81c4266ee294f9c310e5a457c72571779df9608ca2d1f2a3dacda960b4c98188f914cf420cff469cb726d71256ac334615b862fab6c9603f7b3691dc0fa98ec7bf7f74b000a659aca0448556c72460532b72824936e5f1b9d01a24eafd6b28b2ec15f46cb9e1953bdd92b71e247156f1d04b88af6f9bd88530e7f43a118c6e1e347be7e9a7595879906bf6faa20d8d149fd9dd5a82294ecf4d3f75d90ca3cdded619f1442bbcd753b705ef39d2b0ad010cedfdb0bd7ae969e5b6925fc50d9176422bf76b0391f2eb626d54aa27250b74d7371a975b62212c6f2a17215076585d8e312ab4983be3c67dc9be9b9722808ca76b5cf4ed42f343c0628d7fb88d0523d68c4c81ffb78abe1c53b139472c52979a983f4d1f8dc4969683fbc7f66d9c69ffb17e8806585a9e543edffa32a5ed1e4b346a465dde0379cbb9323df4a64f749e9c260ca850f3fb424e8bfe22178a797eb7575882988586078d181b37fee1ab3438fc7849be27b1045fe44cd72907685c4a6ffe8ece1e2dedc31b1424e3236b3bc1e4051c89396538064eb4e696a0370bd67c2f73ede995e919d2cd904e0527537e5ac683dc5b697c70723c672aa8c102f0872c10eb23cf3051daf50452427a32e828eab29fd9a3560ab8529128b09f8ee4802ad69380e187238f9467cd68a744f59c9c5f95acf544cd3e96646c43dd83cd4f3d7399834b5481f2297535019f91343f0f395cb05ad09a311637254e275b34fdd8ed52a19773a48ce6a67e45a7e9ddc37bed60c28973e7379c63bdcd705c7eeeb58174fdd26088642c171ba0c27251ad0ca3054232898227cd27206f1e3a74652c0c85566201be9630704524b2868895da27693506b9b15c0550bb4889de5fdd2684ebb5d7d6f0eab8e14b49fd46371fe49bc3516ecbbf4a21e72dfdb9acea9921b11ed0c1b7c7219af132b7eecd291df78e6cacd9141fb234f72876a96b0cb94e0e2b2204474f1d719a30852662365dde0b5cadd3bbfd52610721cee96a76be1415529c7c7761d695dc52114a3c95579df1d0ad21c59f07a114bd83014721cba4464ae55f0a56d12234f1b979c5d5d1555d67ac07d40c4681d72942ffb2821a28af177301c9302cdd92433305e02a5fe9a19d776cd9dc4b8cd72eb9161442ea3bef696df6499cd06aeff982549f69c6adf984b7694f8eac30972e929d9b1cc4ccc196020ac203ed7a4ff27a7973ef8f8ab88dc9eb898638c56598a67143401031e3e9a4ba4105b27a43f55c1ac5d07dd2c8be6033a15fb277a65ba0113253ff8a8535e1b72e21fafde43815bf76bbe7196871693b1443d1efe7246b89c78a0d227d398ec79bb3ad77b8a187eb0f1a501a5997520b5635c3ada38378a414d48c848d5d604d435ac331e3ed4c2a01d08935601883c5eb5b83b8272bc84111259de84f3710a3ce674451eff686110c67b16fe5a6ed2a7391f73f3720ee12e37acdfa628154328de0858515a7a808c54e235058ebb57cd417c490d72338231910fc194079846e6d9adba1aed281855b6b299a5f88da662db0d9435725dfe93407e115fe5a048d179b1704485b839e6aa0b189a312422d89b3a94f02a0c4d734cd3f7151f3919ba4f4e6442a3b37ac829cf186fa59a5a6309655c3e164846b9ddae53007857f5ddc34c32d9351164ab08dd2bd883cc9cc88d6bf32f721d54f3e78f67d9448cf9005ed5fcd09ffd2ccb2c4aff523c8c5b9510f7936a72c76b1f9223c1729edf839eeb563b0d42dfb82ac4e9d42f46cd99d4b13eb38672adecc306be10942a6482c8249783f2bd96905bd2d2dcfdafbb066cf97d6a017256f0aaeb102617898af9dc29fdb794554a494f7f7d5efea208abdd7aef910d720f01d841c5f7d2f1e6b169a0d75f77c7b0b2cc2fdfccf3e30833dc6d43d4ee307a91bc2bf28248943565e81dbefda82098938afd38d9ac0f553f08ad2f221a72b20ec33ca67c7698c1860a9ed3771d4e164bdc6609c20f76238997464d456704831feea29dcc4880453ba718da96893fe39f7ce514276d2cf7d785fbafb0df72df95ed4bbeabd67c3e3610b6439e02342494ba875759a06a2b0f2bdb6b013972727353cc7fa4eb3dc2af8271e60585fcee32ac59e72d1257d59e945a12878b722602c291fa15c77747fe8f7777244f520dba56e0b01efbf1020e3127025f47727d460162904bdf9cb9af743f3ce62bd6e748ed995062f00b0f6ba65b2384b0720d0620970967f1a0bfc4684f9d119d455e9bd1e5f16d1de57a32c2c9d5460634501c4ac9d0b2f2976966b0f1b7ee9c755c7188d5e5e6779891854e290b37f3728d7680af4f92aaef8ab6aecab7de0b71efe4401251c7c9f3d41545caa5d97f70eeae269b9263e90dbffc9908c24d0821dc12ef9821dc0c6c8a9ec95967ac277238f67ad061fb677358fa0791e3e58cc3ae181009e5da54be3cedb9ebb965a6054fb3813cff486596f2f7a1049834a438017876fce81bb5d99409a2b33c873672ef230b1c241ee399a1929c6356743895983691b1d02df6b586a3882f654fd322d9d40a53147036078b04eda3d448ed3c4aee1af0202e2cbe10db25a3f7b59d7275388f5f99914febd3f8d5799724bef4727339a44672ab6f363372913fffd972e302651594ead782871c30e69d918545243f4399145777d2533414fdae1de12fd8553f2c599f2edfe2a4096ede36f49c45a99b27daf53c775e8516f3c7bb100c25995e7537383f12232c7d7735133558d19a5e6b478e662ab886b51cc0c00572b5d8f55812a203a73199d39a6838064c4c98e6c7f370fffd9968347546b368690784335dbfef0cdbd96163f1293440d688de552b73bdfbf7ad3abc2a8eefe872b25639de263aaa40cd78c3a42e1cf4bee52a498e7f4c82e363ebe7976fdccd72bc348335bdf27edbde8a5a11dc706dd90f68df8bcf1f0ae731edb97ad11889727baf60a9b7f048ed4b2c51562cc82b82c4f78a08fa8e2425818fd5d8dc297361a3595a0585e51f1a9ae78a5b7d0d82addd0937265d49e52755f56c6865395772611a189b4bd91ba7803cbdf074ede2170a6b9970271a18bcb29fe8695a95dd725c02c341f287a2cb5729a497ac3f5cc2fa0e2c5bae0a560d1cf19b9774f9fd6c3bb50292bb303a847fe3acc047078c029c83cd7d5683b8fbdbeae99237fee225c11e59adba666cf3b90f38ffed2c77e8676757fd98f7151163e45648eb182f207062c8d0b73fa5d0ec40d92879d6cec683c44443e7843ea0de6043c1ab2ff472f4a25a90b21ff8284defff482be6f37679fd723e18fa8fd5564579d7b1f029727064d6dc09a3d00ee30a404099ce1b34886ec76e50229e8291a7790c6b46fa5b9c09ed6a10b2637cbecb8ec82a07a82f73f1c154b97a14b1422c1d6ebfd20d711096eff24e5edb0553afdde83ed59b232df9269dce4bb17361008f7b731bb45f431de075f141596bfe4a08fc8f707a8b7e4fccac6f60489eb88008723d81d77261b7d2dd6cf4b26b1be471cc55f774c479efa629ffa580502964c61a89b99840ba36483cfc5f2af9cb1dc736f3989fdae223f45ab00fecff19a9c7c59a593372535edc9f0306e2ea85d37cfd662f63653cca658bfd677102b05dd5ea39a1f040ebf3717a4f74394a25cae57ca2e013d897ee107c80bebfcb80ced8add0b35523e6f98ad3a9df98b377a2412efad9f7c0aa8636765d7fa813c027fc590c0149723bde3ce8ec88cbd29177d7a38c23eaffde4781f3bd84adf5ec896b443220f67247fbc82daba2b5bc2b1edbc0d10d9c8de832b2165c93f12676923567fdcc4e72c9719f010d179aa959de4fe055e3ba50f1b79477e18c54de1b7fe3cb731ef3723d7439070a5bf96b58ec5979734a24bc2d95afef09c8bd791e0cd098a0aa5909e055ba65edaedf38126011ab9be3f97ce2e3df5bfdbe42f5a2fe5cca9a306a72c9d3e5fb295cd733fe581d8b842955fc594a381bbd785a6a3f1868d5886cc6722a0fb3451adeadd4aeb3240b110c38de84096625345eb0ff13536af5845c507274cb6004e2be37fa00bb073dab5626e0dca4ca72fa315fe85f8338b9911dea7003456f3b88b5bd92a227748aa235e81cc19ed598aea1ee1e15d550940d866172201e32639fae1673e84d552d758a248d20432a3b55cb8a4ce1efa4e8afc266292bf4685c19084c397c93fae4454d14ee2bfd44aa1cd35f119258a2b9e936ff7214ce7e7892ec6a52205a6b1a0d56a162cf981742ed87e4a6a27ce63dd3720c15cf8a987fd1b186cf231d98763bf5fc43004fd8d8785ead3b67aa4ad04a70c772d6289a551eb463089c2acdfea4c77fc7353e75cf07e69c53f85213c0fb4ae57270af2a9f70dd1105685eafc5ebcb8d8737d454cd4ea11c2045f6d22be85cc84d45e8de6dfde7cf4baea6db8f309ce8575facbad7ec3ab5c8cc95643101b3cd678d16a54e857cb7e27fe7256ba0755dd804d6aa6b97b686a0112ae62ac0633a1b62743e6c5667956f17e98ebdebf3e2e63f838431b01fe52878fdc82993edc43eea150de6427fa7cb4ad6b1c779ff03324e8a49690651cd581523dd7b4ceb936be4b00553af4837d667fee1b4cf73e1e56db5dacbf7524d68ea04d4d5ba530b408f16ea2e700c36746cf9b39d9673abf17df88cb0c6c99da4c6cb67eabcf3c357f816fd8bae9359f99b695b16be120b67815325715ca904e4f5a026e2e30f9227c35c1db52232adb37eb9d3856c77351d4e2545ba555b4935ccd548d7ad72c6640f47ae969356fad04f1742f0f4cfa62514013ff47bf133d885fe86872e8dbb52a28fbf048c00514e43aa1121f46850a4cb7fd23a88aabd175d5508dab43fea72fbc33da00cbc8e4713aef5055cc5389f8208206da9056be8808411916eb7d9723512e619238fcd4123931660dcf4ede867ba2d700dd095cb16b245e49d361d30e2ef2f993327c0fc98ffa4d5ceaff919ad743858a9b62c3537af4af8770dda722ee4ff67f8b733b22152ce7531dc898e213950c498ccc15c37474a77276a2b72e8f4a2ae69a0cf90e68fa50116e7539b45fcadf4a998f81831073a7fb8a31b2b8359692273db5e5e0b4eae8e5a33cbee65ed115102f82c6aa938d696bde0e5720c5db6944f7b474415e712e5d2000678874dc6ef14e24b887f9142e4a692df074f9eb6e9b78e78112ba3f9d0bb6ecbdae1b67a1b0a1cb54401e9cd2b2e6969726e40e1ea15a3f335617d0d3aba2756a419a7bb46b4efce5effac7d87e07ccf72887c8d62d9be98c0a736b8e92a69544ff41c0d3ae4d679d47398a763d79590528233c35631165862bb4c7626a4b61564b3516169559d9f94a4b9e5c373cca3320a3ebf9ef548e4ae101ffd155f193e5e8d5b5338447f4296b43864c75998eb72033bd2420af205aeba9fce548af6e968e3c093e11a14cc4fac88d997fbfc6d7299829b9b84a2336c44426e36ccbfc6a063cfce9229080bdadaead3a635073768d979976aa4a0c0413b8b936f9981ecec83bc537df037ee3f6adec697ca82c35a51a323fdde754522f8313a0d24d5c2b900eeffedbceb5edc6f81b47ee968f472a47a1c485cb6530289f0287deda19695f41d2875970ec9c5dac279099b424865cee46071fa38d7821f66354c87f90e73f0912a8b5777ad26ebb71e3377759472746c146b67262df3901be8dd35efe1b26bcaa0557d74a2153ff102bc7f0ba272db86df73704ec3856bb3991420088ab12e709c7b4ea7d9255cc05ac78ccb57724c0447f9df935867c8d81c5717da376a904723b43bd1274fb364019232416672d1ad082cc855aff84956cfc087ad2d6a278e9c396e17bb5dd32e9e4850764c01043f9d4b7f40abdfd2219d12d73e4982c84b6d3b87dc1a63a6f1822b893c2e72f37f832065816545c6b7b4aad57a41cd12c58985844f0cc971cf088233692c316cb3fd3dc55fde643d0686ca056387091aa8abcacfaba4570c08da407079b2720a143eeec3604a99373f0ad8707be24c3a7ce99e10be093bae5c54043e6448086950a012909794c042cdf8358c1ae15f3c57390debdc0798a9767a4b0df4251a8d61956e38fb43c73642565dd4068f94af216b4c17e7aaff6388efe58af224728e333cbdd138d5aa62664f8b9bfdcc2260e267472322000cde2205fa07d49b72e1c24fa92ea5469a2a10fddd0b7f7882cf95dd626cbf424b18e0b465d5988e2a5675c53c4e04f60c8e521c98b4fd0386a1d1444ab9906ee0ed68a86fb9cc4835b59e06c934c1431d9f5044b25d8b74b1352ef50139ce50be3dda465ce424c97289947882ab10c885abd3dbfe2db9bfe276fb297c52c07c739b1d914235ccd76b0bb06e85fa39bc8a2946a36aa5ebbe52db7b1c5f39d3a0016f75d329babf8300c89d64b55871b773c587dcc390774515d64e3cf659cab8737f3e684dcc8a4416a2d54878447007799aded77839739ff0b57f0daf387981c709d078ae8a7a7363163f01394053b3732436d3c3f0e8267d89994874293ca72f38514d1e8c4461720fd372ed9e45b62a71136ae690c3a60a0352b6ce53c521068b301b4cc19b9a612ef8452178a2dc86932cd7546feb8b8c3be12c24a4485308aa4375e50976c0104c1986c6da0e1ea364709311b5d954cc2cf0214fbf327ea56e82179625217072762b0992f07f0fc9d60d097845f5799a1d86a3f8ea8c30ba202f7ec2f636ab7267421f2a54995d0ae012c7b4f4d2da5079fa972e2309ac46743421dd28b23c6f6c5288ab05c186012a275e04d75c231f563a5dbc9b469c0e84793409c3cfd3727cbe7817bcba77b9280cf7e8ea738373cbb6b2fc169c8df8b2e45c0cdb8f453b245fbe9fd4048714ca95bc04da844294134a1fc3ffeb378a36b6281e9e7f6411406068f1f560bf26454d519c474104b60bb2d55c99087108cf457baeef5a5c38024734f97a7e5d0fb0cae7c5384ee126966a412e2f6b21a8da1897f655c32a72eda4b164dffed7f0b667b6d7fcb2246aeed7b46c740dabd4a6c71a0eac9cfd72416ae2e190b592e386b32632ec9ece046230a6f174ef844fe1bc2ba02c240f72cf726aff6802f70a2a3086986db08ff25b8105732164eff9a0cafba857c10f72d2981dcf7d052d3b4e269e2410508fbdba4a6bc056d9a2260e12f7a74e8e4f72b4377f37fb8b10ef8d63aa7576f25c052d2d99152d883b4b7a89c44bbefd4f721549b60f862222f53005f5ed08be602f59078c3643a38b4721d385b68d961959915628523cc2fd79fb3a03328e2d83e64c66694afab05bb4d7935227a98e03722aa8b8b04ded1252f8c9fdf4329d2130a216034f7061375813c47878a3d52b72beaae052fd39f15a5307a18a92775b60c85280744fc93326dc9b8bfc0a4c101ef1d17d173869963b9ecf5014c07308f9fdbd15e18d34402401693002012ac37249e03de4745f9e420b6fafa8bc67f221ac5fdf1fe2e57261cfdafcf02c6c113d921ab833d636d7f50891582a07c5ef90144b67902fa7f2e40d627165a3875e2a4b7fd381ea5dcf356fa42a70ef94d3189f081eb8c501ebc3afdf5ece748e0d721e78b6e70c3eb861d0dad7c0c5587658377c94dc558ba91aab56865ddebe834d002b68aa9e48367ae2aff6954f625e42c692ff9e54bba3400b321d91f7c5d772163dd747176c41c94e9ffed5ef4c2c3e33011d93280e92c8a4f588238e72735a6229031770ab8b6591cf3311d5ac54db00fe674f8f50a2bbd74e333d73786972db02722ff95025cdb2547e6bde061d153805a7ba70b0fe0efd2d1b6e27589101bace80ca22ee585924489ddca4bd2d3c99cbbb3e3eec07bf5f91f6270e239754f94e66a1449ea51588bc50c17fb877d5174e7e2eb2d0380f14efe815b77cc6721c28c55886e46fc7d2702a5246e44c048200d43392a4af8d244bd92b7e2ee3720f3606b048cb2811dba4b0db180c85b087821a0e4b9235b1ca9d6d2aeb308c72af1e84ba1c88d2c5c268785de59829e4e1888a1563b336d29c55a4f14af1820d705d9127331cf27252fceefda4e65bb9d608135df4786db7b7b6ba1666f0a8721e14916036e150ad50123c5d9db69fe3be1cefde11e121cdbadf0e0dfc2062724d72a4fc59aac14365bda857fa495a66235e7f685a55e80aa43743080a5765726dbd266ec06c4ee3e521353d9d65c7e2359f3ef3cb07a51ccd153a7a41decf6a96e5b4b0ff2089ae76942cdd6dddee9138f3b8f76087dfc2a1fc4fe6911d66727d3c2a5898ae14e6c3b0cc0ae70452981915f03716863f3a7640bf10916d392ec3082c7b9859aa49fa46f1cdb73acef339050835ccd32277368017219935f6729eb26ace2e79e34b51ebed1627fd594ccf43e8cb2910abe241bbe305efd7fc720099a88503a0bd081351c6d36e43196eafccfe265e937796d39cd3f18041457200b6639ff52ea09822d411d7ec8d1b0cec70b471769a402a41a90f236f2dbd723f5dbbcf5f7d9f37ea88b8350acfe8595d8dd4823750f7506817aa5779553072880b9872e96f1b1be386f536905057596f626ace6de5e42454a385fd3046650142e31927321c5893d020a7926ac0160e8315905dd460efbd246d6737cc8f41728911ad45b63ead29a8c4d229fb02dfc67ab04885751dfb06f7e7816098b086724b21784f0461646c41e0d35e978a1c3afc1c6aee7fad6653627e47a997134272ba46673da329f0a20bf19e904f89de8e80662d79a73467a9daf6020edb488a727b1ab391a0713a3d64ef4a41a9c889372ccfc179b9dc83364d4a360138ce3c282194748993a07f735d6d5e51f36a33bc7e3f542a03aa62d02782cce92992ce5953729527240c6891bf8542b6e0f34393dfa36650781742ff600fb5447d199411073183116edc5411d60c8ca5824a93c98f12f491dc96cfc0fb5269f4725708724e62abb4867b3a4e15bae1877a66424abe1eb0aa999b167a2507eed89a0e45480f5e8162bdf1bd1ef4c9d7f892976678990adee3f000499346ec02fbb97b6b07cec9e38405a6a7ae1aaec5862dfbb397094aa3c67ee4fd9f301df46e2cc61c72781aee2de8ddfeba3034c5b90599bbb18c0f4f67b75e1b21d63137928491d63645d9682eaf388dfcb99802323e92754d41c9ecf0d695fe13fef54705b34d0f4ac26c49ad5bb11b4a859d908cf038829394f1e7bc44051c97478be8a56361d072ce2543a9dfca288454da3bce9bb09d7e0ac1e546dd50a668a2fce4b6cd5ab73357e59144b32a84bbedf61fcfa78a817c0d459af430d4e482f82e2f194ee69e259404e3fc48cc8ab356f105869f9c16de6986c674462d24a0d5e911c126e6e4723b467fecb841d0cae567ea9cd85e1fcd2c3fba34e5e82203cbe35a53a4d87972cfeb42767245a7f0d0c937a959b4c20d388f516193d3ded646241728c4b8cf72c557f804f5b44c27fa3d88552a6f61241ea490187ab2eceeaa610e24353a6b72bc1b790161a4831e5932bacadc197aa78f50871f53a43c146b205b02bd765c72a13b0848d6c40b473429e9a76bd4931135967d5b0cdbf0f150b8c7af06ab2e61fb646882b07a453869a83f733a28337aa8671b99e5d02f5aa515af3a9b39527200a83b4505ac3a0c1c254d0a543dee275628aaced8200602ca4a9a23d78b8a04251058f12b9b7aaf9b95fbbe921f4e6726c6337c86038193f97db2a6c79e3f725c71a7cae5f3e97016abcb8b20f283b13f0deef704c45ebc56f8a39f25ded872070cc467a005a494b186b7eb830b091fe0532b8801bb0a05e5bb9cc9682d2d7284e7080cbc02b6d0fb914c274b3f6651ef459558af28ba2a8f4b6de98919b77220a6e5ea4b30bcf4a088bf3b27e7e3f721fb35dc40cf913efff1b892cf7b6c243920cbbf861624df5419b4442a839eb471642521b91ca01afe52272e390b6f63196513f566b39757fee670a7d683998d874f9ad047000652658de448f79a7d59888260eff835bba1e28b9f8accbfcd45c5e77731aab1c0e486156eba5761d567bfb92beb882134bef6df6af7f3ae3c08e372144b32b98d9f0e3ba7418454f672ef3f149c58084737832c331068bc92eac987ccfcde181db82f9d0205befb1b72078ad4987b790cdc7a776f83749275b8459bdb1cd010b6ec33df0d2594a782312b8720d23f59ddd41e2675962637111a717d3840be1426ddab1f410f7c37f145fa9785ae4f8072c786fb33252ecbc365e78d75b71123fbf44864d9a0782f74720ae7483025a1f28eec77dd86118dd3ffc6b39979eca42f5837a9e7d32d8ea60b81a78795a0179222da4818ee7e1c60a05368ba10d937a80ccef522aa2f74a92b90886766c9e018d5cb574922cf791ff3bb9704256b38132cd9d68cd1643cb772866b4af3ac9b5088c2914047226b1c098137f4bad8a18441751c2ef2cf902d601a2947a6fae1e7571dd8c2de11575c342c2b036967326a8eda0c0973b63d515f12be4d8386d5e993cca073058628cb438b6e945e88909a11e304efddcced360164c66f039a3f4a1e50ccd60876694b3fecc3c3d773202b8d415c0fe5fe749902fbc0a3fb39f1bd5cebe27e9c05543149ca72af4cb791d7108e2a400708de2272a1cfc25938c0588835b536c0e36f391cde9e800baf9b9288f4969f3a705a830382d20d701ccf14c87c40a1f82e0a8dadaadfe9affb629393081158592789ff729a8f440adbdfd1479467cc7f66dc43ff46837c57bd99b1405987ec7f52d99166426de46010fe345df14897ff12963b6a872da7970e6068fd25232d041d8328370da3a19cd85f1d3d77f6809846318926a4984db4ce6a2c5690cc5b8adbd28c72695c9146160ce84070ee9351c4f92f12c8b01fba3bd5bcbd8e56856cf9ec7e19377c10197310c9bfd1a9da771b86dd94570cf17f96cc02144ea1b95de9a6771b3dbd3b94cde104401c2b5a41c32393b4fbe21ad916626ad1620dc46b2b6bc60dac6f842486fea20d2f9bbf8541ee3d0b59c15a2cc8e99df47104960e292a0672e78c1c670dcfe7424632c199ec9d9882edb6ab84a14bfdbf2f063534014f1672e665ce9211ec0dd14563fe4a92ae0929e170e05c85687323ae6efaf02cbddf72c1648bb51554f19f65964074f54a6fb02e9656abdeaf7fded5e7715ca69e5c728400fb2acdfe5e8b49b355c9560ee90f3e616cb1cc97d84497287761a58c757204fa627f6e4c6bdb75e14d94b43f454c26c300f87796d9e0b33a4ce66c87317269bd7bdbb5d273b47bf7ed9522a7047e039affccce46b828a71d52a07f5830589b48675ebe5b06c24b87344c3dd58cfa9184c4012b4436c6e363d0b1aba5891acd6cf91ee14144b291802b9eaf76a3c936fecd004de2c38389a028247db3c772cd518c2c699f21a6ce87f6bf425f8ffde0c18d279c4b5c3e6b5a171d741a80724737afa9389a2a68de5a74becba471b8cb4f5cea6bdcbd6fcddcb28dc4ac3f7282d3e7b54fe4c24ea9457e9ba6f1eee2df228d414ece8b024910ee35230c0632fd8d6297dbb0161c7060a960e9020bb6db5cb84648deb729e1adc668269d2072b489c74c38eab1a99581c81ecf920432dfcf4ffc453f9eb1f024b03633eb3672066a7d51f6add16d58cc096517f91df2a1a24e0b6a9d2d9e556ff2898f93307275a59b6d692ab7b1a2d85eafbe099dd5ec3dedfa69880b5dfeef157079770d32fd01c6d808d0572b0deec1aa9aeb7503c20014d0d3c7940f22b3d3bd03b104728bedd32261dade7c4d5a35879233d1cb79aa729cf33f24deaac652736354547244bfb3504f9986ecb809811e4687e75d184abc27401ba60ed0206249c90a0772d61b8ab847a3e00a408ca56dddd3004c7ccfdfa58a307107ffc551c6cacc49724324d087729076e2dd8953e95adefa96fa4f669628c132897ffb0422666c8b008fd9606cfe2c7be96c2c17fb9a2cb4bb338c6c488cbe0a660d91bb6458a56f72af8d229fd246bf7a766b46f62c93c246aff8eec9a7c290d6f38a8fb3fb9c6f362a9d07cc5e8b3f9632235b8dda70a42d15ef97817197e33c3a5d434767e49a63d97778e77cb12d3c8fc6653933799a864ef41991b83f6f6cca299b3ba0e82a5f3870673afec780559ae675c37e906d8f22c47e715e97625e8738bfff511e32722c8d108ecbac2fd5033780d2ddf450cf2418f33905e10c03ccaa432a0c1f9a728f04ee204ee1d802c76dbf0e64c016572db36b2d77935702b8fbc2a5989dc5723d3e576f432a641ea733c5dfb0f52266cf318de2f52f45a79d23278119041c722e5d2ca0c0f17c915bbe7bebd691a7202fa5cdd5aa1a9b5ae82cbea72513ba72d50669f3f2a4830edab9768aaf7302e5885999de7153656cbbcbe6463e518a72e3d69174f15478ea6d80b01a3bf636fb48df8e06edda9cbce05ebad0464fec70dae90d75226f4558959ac43bd9725232238a9129eac481efabdada32d7e5b77280debaa6ac03444fedf830bc27f103d8a4a4133d381999d341d5acdad4e5ec0be922f2b7562d1dc3524db02a689ed0ce2c15aa701a1337144eff70304db82420005477b0b1fc6041f4ee534e75a786446aeeca2ff8ea00efb3c7a0c879756f72b351af7fe24516893a2f2d467e3f1da44002fce340050786e48a984a306aa17017569d7280b99f1936a24e6df79e352328a213bd2aa11993b769b282b4ae3161aab92de2a807a0ea8b1b0da7c218dd25d8c155ccb3f5b240db0b881f63487b1a372e5b24e11a536b8f3b04fb7906e9955ac22557a23db81880e67f018ce2cd7216b9d0733d2ff01d9c16c4567bba5affaf8024660469450ffbb58977a01d0a72c191f4b69fe615794c482b68c2968bcedf68c17b67dd8ef7d754582d85fd05723b8894a21ec6ae223ae9419335a27e0c9bc0728a5157dda08b7df996dcf7cc474117d52c2fb4d6b94187a892765bac87cc20f096aaf1dd88a17ed5b9c6030a729819e89c6263fb89c4b929384a0a2c244263e846a421be859ef38caf03867172d14a7ddbf1314ae0448119ac00f3a534719ed82ea85fd393494c1a9a55348b72a6b5226baa1e654cd2120801b65d4e7bab12932c95658faedb30880bbcde437292557a543933fd820b3776e451e382aa158970dfc35c79046984296411f21372fea508a745516f02c0ebaf31263003739dc656eb7dbc21970264e0b64b49e53ca19a85885125be2969f39d484631936f616d36a002e1054145676e5a53237a724c2b074e87ebebceaeb4f864e595d9ea4feb119e9f92f15d69fe27fd05d38b72e567552ccbccb1334cc17afc8fcb7289acd5b76135019df002c5788757acab728ddad716c299becc3c0c2fc14bb44706211675382b22f59cf79f5fab2b90c71efa6ae6a429bc496dbbd952d3c36f1e52751d87c445d9d3e9fa20eab094c78203281d25c88210c116aacc70d0bccffe89c31010b7b52033694788b5d4e2a68272a6ff8688d9b7ebc157701e867e37d58e5e035bd9a9807b7cb07ffe13a4dd8a18ac4b4ddb831995a25219e0148fcac14178c1cc146c17040e74a19a836c22d472b65a64459ab20747e6bb6623083f0ca3bdfadb3cca8e1597af321474c0526d6cbd1e7f3a3824516fed1de18dcd0f8dfe939a29402e8f8b42bebc218fa58a3172aa73e229dc20e73878e1aabe47f0e0f07caa00b22eb83a834b53c505f7ef2b72b539ab440a587ecc95cc7d8d56cd003843614ddb41abb54bc9608bcf11e09726c09f77fadaa3741b0ce214af0bd094cbe4c3df524fd96edb70702793decebf341a7f26a2ecf9520874d77c7270afdf0279180091679271347b031a54c8953d1f60eb4cd594cbd3729001fb0a81ad16a5c4702277543b2c6e4f9b32ff5123fb09de9b1eeda1f79dcfd2a838b0568c95605fb06cd435290a25861b1c6d458be34cd319dd508172e3f83212f02e6e8fcf61eaa66a09a3239fc13402802b110648725e9b7e63bcc88d4bc0e6f70af28ec3cc21b540f3efb6437388f4b59162b2a1728be7ef927523756b5a7556ba2e5d0b0d83ada110cacb2d6fa3e2792c5da37072f7715b83b8099cfe54174743a1798ef03d8816387ccecbc96edeb96f52b324723b7a73147e743228b02400cb069a2b89b9aaeeaf7d7c1ffb96717b2f599ccb729b8dfffd1fd3386c4179e3a90011874109b31106ae45587e35839777776b0c7266ee7c85665addbae21e848b484dce734721b124fe94c01785d5bbc619cf6672e945ac5303d555836e1ab59110df7eac4f5b74e3d8035ed6068902b4ac76eb72f9deef5c201937e202c3ca4dcc5f619a6e97d7e4cd736dbfa6b02b237c365e09bd79ba01f5abd046c52ed5a5d135582957b2d7d10a58935e9f02e128aff30c03580ea239682323e897fd320455b8c77e342014201617e4aed94504d94e62ff7286014c0d27acff137cbb7b88d2d1734c3b4a3786320f84b9dd93a1d6e13c3072465a478e4a9c3bcb5fc52cb214149600da9ad6148ad188892273735ac4a8266c2152ff8236478af0922a6e18968c7a192bfb640ae2c4eca704b751aa3bc9f13a5697b760a140530418b9f04deca1ff88800fa4c83b1d8e250df949a2d22c74183fffd54fe68e2b5b713c8f1752fe5184a46c191692ba77b6960b0be0099d5a720abe923a231962fe7b61889ca3e5ef0740046e37c6103b57eb4e24ea1de2dc72cd16c8a91f77b53875f812b12c22d2e1ca1d91b6a3322970637ea4d0c75ac3118de95069af8bea9e381be466d57a25cb2d2790b4e3d6d32c039a216e85468672bd1c10b8445ca8f938e6eb27519375712cb4e5ae322fd92cc8c3e10a8c652472ace731d733497ca3ab5fd1a281f5ad295008371eca20366b508b769495fec972fa4e4acb99191435b942abdf535554dbf746f8b766ed87a1e579997f66654d052a74ff117bf0364ee5aa1d2880fd0e1a2c8c17efefba215366f6d92e1c1cd172b63536b4aa513388855a0fce1ffde451e9d995db71746f3b393da3daf8a2d072f35a6b5e2592da6d404ea8bc8d1e7cbea52d044556269cb31677037d39144172dc568852d8a49a5abe91ab51bedaf02f60b8b980b3320f941534d42cbaafd86d15a2991151d71be634213e3dd257c1316a10e58c5c59c14f860d2a6d9cf22541d7578eff226ff338411e7b6d9a33da2e1d436a5ac51527cc7746815f172ada4e0c39923dc244c5a5164b4a4eae71f2d498643312dd9c86de22feaca591856872608dc10a43a5d055fc8e63e04f7291016227455c2a8ddb23d9fbeaf0d19c5c727d79eb16c2d4d4d650f2867749a5361e79a24c16c16a24a56725badc03a53872152e39e3788fbcdd8545ed7b9a1f8d5ddf4dc7b8fc611d1961da58a06706cf729e72301107a031ced62ebf78bfba23921361ad3f0418f1f7768256b488fe2c7272f5c6621447fe3f1fdfb60339df88009983311310b954125c7496a61c1e1b48fc99a7b6b9e00889810510efdf79d20473b468b2426ab1f063abd995f55916729acbbafc20ec5e091f8d3d7dfcf63be11220d5a604e898aa0967ea0ccb37bb72386b9cceb3105f79196269b47094da5295b2a675e936e01a9990da94bbd1f172c5b9492afc4c3dacec51ceceba6bb66ab2ba2c215397dfe99005ba1977715372194d53af3d133b4d9e5949306542ee7bbb3972de7e7f79859233b73726ce0972efbe103406814b74927c9561a07b96aca8ed158561062549295b8dc02a03ff1ab9a8e44c81edfe36978ee90216061dc618cb5beae39ddff2ccfbcc7f1a0af672f37b59fc1dad3d71270ceeda5fe83e35ecc67fb728f8569947d771efa229915ee2bee5406fddff79248bd184a888b8a9c49f36e89b0b4923ac62a106dab7b7725bf139c39ee2cb599f8fe74c3402301cd364d41d263590b38aa0f764d6974f673a65db665db87ff85bd3b5eef3f4aa10b3e23b3bca3f0e70994ae5e171108f72cd46adf71a5e794afa4324dc35e0237dabf0dccaec14d6d0efc7078c11965a2fc971c661f318cce32dc46ec3f5dacc394edc18d79f3d9ba8ad267b8d0410d37253512de03ab2c0aff26f2e9026a7bd634f0399ec56f38358b9ce696227a6f4362516a1b3a40e00807c8f7b0c2b48fa2e829b754f5774e1f0458f50f1e90c0b0b16af26d86b4e41ad877eb13311e54d9f3d4de527883da82739f88e1e79ce1f47458811df6bec0ceffddffc9ad30c6394e3e51eb5d8b33e72deb0d571eabb616fee54c3b8b0f6eb96bf9055cc0714ff375b66ad487cd846ac0c6d462b4d8012728710f5b3b00f6a7e4a503f5c661659e9f32beffa8052b4fb317d96702c6854722e6a3e742577e9c2594b3952873392eb549095cc5e9d81f0ce833f3112cde03125f656033b9fe36b5359792b9bc6efc6ad25f0007de4a6072407bfeeb1dea922635a9365b263bc18c532a432438e33e710932338d48766502d37e969422cb9723ac147f2af4bdbfb2ca9de000fdcd4c478b756a96669ea0c6e0869a28dfd6666f4671e16ca7127e346e235405c7f3392c6ebe428fbbac1dd55d562ebfad31b722fbdbe15790e415cf9ddef515b3e05bfdacd121b07159458a115b3429b597572388d90369916651da590fa231b26c1db1cb7456dc2a99fc6d1c139fabb4dd7722b708f4e1413d14e036774755265d167b4b7806c0618390b5c26d101ccc08a729147597c9c8ef58b2beed9b01039871133dbdaf1cf9166372033a1ca35ff3a3d950f43d4bb9fe3a354246f91a51d86b890fa29ea8074ff3bcce5f0d481fd4a723c46348e3948a5f5650d74ca66dca2e71b32caa73c2b53ad9d50b73054b1f97201aea877d11ce91f57a675f256373082fa1f5aa26bba155be9dbc2587b1b13231ce9716aaa2904dca28742834cae342a34783a045940185292cd005e2bf6a6721c2e0c1194dcd0c305f89f834c07f6fe30b1460fe81d654111ebaf9446cf0160903013f06ac239ea6ed0d0e15ac0e7a6b8c81345a28bed216f39aaade382e272ec72d0635fab25e1431a933d77f3cf52419da0572ad5d8dcc2efbb3a1a2e6c72800d834d11630f0778bbee7e591b4479433fb9f820f569b0b66e4f895d7dc64cd9113dc07cd7309b98acfed9a9e66778f041c5debfdaf14134e40b904bace0095b54ee0186934696f0936c1b20d1808d961e17aaeae4d9792e3e640a3660b701533306ce7cb6e24d77710186430138d2fb6c721bccb4d2f5643744d4b4465b72cf8ac53ca73113ca251d60375ec405361daf801399e1750b3ab0845256f5d87272b81614eb4401aa64837a607be4e2717e9dce8b1b674a91e79948d2c4e9601d6f4ff87030eab79d65ed710d7f81df7ac45770e7a1e9d77da283896a3ba9a372a518a1a0bbdbf34424713b7554f2959d29344b2b6e70d476ffff3205f4cf4d727da609fd3506140cc66d695733863d75a2b1e387f1bc3fde3d9781f2562aea5d2649499a7c8233f11b102a64cf9d28b8167893cac581bf1ab8a02dd0435a36726131fe50a97a44d57d3ee4c3934b2a8aef0ffdbfe9548d748b62773428bcec7237508a83dcd9a1b7bcb2ee512db1228d8ef54c60c0281c5814321c645256815b48fdbe1675ffd5bbef426f14dac6490aa14379bbfa58446086ad3a68e03a4472fa2153ca5c88a332cb4505546bad5a1f4b3c561f438b5f6b35c214bf9535d26eb4edf08f45388f9f42fb50f9b95f089c55c33dae8e682eec4650187ad896d6728edafa9c86ad9bfdd8314534250d8492cae341b2d4a32a5b8c053892dc510a1368ae2ed985fe0a532652cbc0192545cae6140839b1f7ff33898e025847b4ea17f6c372d292fecaed14a3b5d9db48d051e81d8b469535f14bc6d6cff2415b607222fcf22f190f236cba3d188fb0ecace2c4c9e551d66a817126eddcfded7e97269f176a7e91edaae4b904fd6238937a3b7792c6864df74cf12c59038be0a1c76d7cdbc818c4ae9ecdd05e0351b65865c401367eecf8b9804677a6a3536ff43f684aa829592851371cbccd1ed19f7617ef3aab89739e4b83a3e16aa2f8605e2a19f33e1aa64b8b33a7a989efb31c6d171c1a2bf734671dd06fa80e6bbb2a14dc64dc5607a506b79094ef48932da3ff53eb7d536b26ba88d097118483f504278a722f5f2c3812c2b28f19756ce02ed56965270f9b55c58bb003b5c6caa5e414b1723bcd0f5616269b1a8e8722ecb331f180b8dbe38b386f2aee92bc4c2568381572b8546702f0cfe7d54c92c4fa6765a3186ea3f951ea5e51808874185b576d7122230774f45b12ac0a7660d782805bcec1b8c8a1ee8858cd65ec61babcce627a14b03aa958ddb29af752510ef6146e6e393d4d6bb8f8cafe104d39f4de5e3816729a137d81fd4185fbd05b63d5bed116512817dc1cf8d8fad07378a5c6733dbc727b648ff222080d60d42ffede56ebd93d54420e2523bfdbb764c17f6edd308c72be2d51e61fc4b2c60f78352f59f4f0d060ecf8d21b5ef38e2182046371f3bc72c9b57417f935575090aa94863153266ed2069e8c2aa8374ca9f4a5922c4ff87260b9421a1afc7e0001e71db2cb028c5745274172a15cd6d0cb0062ed9396f2720659c0c640fce49f0ca4a05e32063664b727f4d8b71580ed55ad879b07b00572bfe970e0fc33b957a193b8e11f9bb522230ba8bb40d43f65b862d25774d7e40984ffe6e9ddcae2c2d861434a45f8e045d1fb3cbd6444aaed7c0cf2f3b5acae72d0a2f2c0da1d5750e49586e2aa71a97329c91cc1a17e39e430cea005e794f507c9ca18b5ad1fa47305bd513e7d9b9b30f85e8453c6c53029abe6ee259f85ed726bcc207f5abba68754575e74d92a679bc64a73b688b33acda9ae398466356d291af6d5656dedab13a17fffb2891a8f874a7485c00c3527dff20c4aabb77e0472d9a63f6189f6a667002917f36d01927ebfe9cd5744eaf9cb188aa1a1d9d925726f8e4cd803f41056e7b559bf7c472a7db4af34e5582145c2dbc13f2b25a1556b3a335bde2a4fa2388a56c1f984f83364bebda835847546603d9dd87d8c8d86679a1d5045dec2e6d4d8b933592b5cd397a78621b431fe8105f4fafd4519d16872fff549351bfb4854a5f91cc84dd860eed226158395c85c0d96ecf631586b7e7228329a64ff3dedb32aa9c73ca10fe5d029de2491fa22938b899f74e3901ce8729970ee9e2d63faabd876935caaace6fb954cc72fd6a05715d04c8265a417a820e3c51a8f69756f9c3b446f4ffc2159d11ef962720dc1d97c95ba38620ac224724006218bbfc18c4f2398541d0932c47cef7a1debc465c29d690a9aa55139403d8907f15f413b04616b753be6e71b5eca0cbf9b71e2049a679e7ed5488e13e072b20851c7e9121e3253c71eec9f3c6a37ac5d573939f2f511052288b8045ad5723442e4aa2e3dd9b3544ef18e6ba1f4a5d780b475a0a737abf7c55f44ec601f72e05519c0798a1d3fc11d27f4a55070471ee0b8381eb6eb4fce087bd2c02d1f34f8f24e01ff93d25545a0a66a85a0d1559b32ba174eaef1955a3f29b0c265d772f03a55685f8085d77161ed0bbf8ea09183f97732588124aea2d0342a417261724cb2f584b2d1e1d6180a3fb4d982207db4f29d4dcb16045b90463d3684df11722adad4edd29811e730935515a8a93a6a4c1f2c996b30cd021e16b5476cbf6d074c9807089d14ce1e2467d495745fc4c716c663902f6515603d69810768efe872c21a1993ff443969d6abf469bcd782e0f591ce011bcc7793aab8651be36d5e0999347d829419bd580c38a7457397340f254ea71836d20d04b23a8e8ba809d3167f4c9993cc55820019236be775540f34a730692d88f81ef2104a48df9747fd722fe16b2826c64f29b757865030444186aea303333b8280010b58f7cd5fad527238c6e1db058d26d327f60ad171c25a6861df8b7eb886e0c53f7c7c0c83eb0956ae15d3edb03c964015cc9b0fb2c045675e32ef4afc4ec9386ecccbc7c84ac5725f2dd8b5daafe09d62be8ab455fa778c91230767f99eab7453d327a0287f71720c0b04c063b37b3abecb530c39169bf9e403851e8d11524d5319fb3f5e3420725df03dcdd9f859d61f987bf436c12e93868b18fc8facdffea815dc49ebb27b4617ef3a281a7f1471ef4ac1f1d38eb4b7a0fd337532e60945cb580d22cb109b720ac9b95dc4126f119a1e8d1c3317ef9fbd4e460875998452110ed076704579724018424fc94ce9a9cc7ca11af1eacabbcd0c4b2f69457fe7b78cbbd70316a5443c63c18188d0990438f3bda762464cc560e3269fbbbfa054558c3c885d6e7272ada05a52ad008834b80b33716ea2eb375be70cb195e948e59f2b0c1435532d723bd4771226d91ed52034760f6bf8e0cad693324e543d6d125a9a1d88f9cef25c27fd42e9de59537a36e06abf3ce78101fbc0ce969450f327f666d246cb08ab5f0c83dabdae522174205dafc252b638eee2f506f099e3ce69fb26a9648822b772c3304f05967f980415b615366d80a54f53a363b815478e3c7418dbc5483446725d89cc7230a1675643c5d5c50cf62417a698268198b1dcd7a0701f7587e53e449ca6021fe9e9e031efd81c0b523d03274507f780384cc02ab9aa14e1576a9572e7d15440db7cf07b183d39786547f7eeda4a592aa16a73d7a0559737e985f310ea44610b2eebb943942e01803b10cb43702c371920179d393db2cc1e83e169729fdd0cd7a632196ba1cf68969a2b7fd413ce90623bed6b4206da90d67564d4727a8069ee8189a5b8e7afccb33d5dfd48396697aa40d0e550eb32d8f335899445283ebabf6f42d11bfe7176ad68e0fe58c88f08a0a28c655dd272af6bda1dde7243d7dd1b15d7e50a5a1a2a41be2581da28680adb27b094cd03d16df0fb275e021a076482af50c710c15ff93ab0c53ac69e4a71a3dd486eb9065cbf4b142e12729ab807a33f70999702cdc440f125a6a7151e414831ea24910707d6911a6c5729f540c9414d61658d812cd857f9e047f7916ebf2c7c0a05b6814f3c82cdfc2b184ba60845c93c31f1d346503745b084ca1f5151ea485fb67ea55c9b3194090872e5dcbf5667fbf7aff05f6032b60954dd07f3e5e094c28188e690e7333ee7d37279adc3a977cef66b4295fcad139b699cbcc937b7a3e7d7550993af7ee0aa7119d4d9c5d81e88f9eef789248bea42c0d73c370a0137edf6d05bfe6a873db6ec22e641a6caf1ba7ffe6cad9dc9c1466fdd4a0d94497680262adfcced88d61ef3666d1578fc85ebe8ba1e714d0032b2036e92b718050ae6a5aea08e495b7f9e61727a81d48f553d7fe6b9bfb8fe81d2c7826e23b23c1cadf3a72a0286eef50d4726e6a9a03d8e0eb4a46d465671374216c70983712426c6b447e1597017c69f0235e3ead2ab30e39567e3617d73b92f4a8bc46eb195a45159076eab204e09aa7972c682a72b67b033737c57a2634d8247be16d01adda6ca85a59ab03756f5c4486913522e47d6f67c2d1cd058c9404b1dc6322e1b6e3b190809f307ef53f18f5972468a6f671257344e10279f0655ef792722fbc213906c866b2b25fca2108fa572d2fa01d5786fcb15704bacc9d385936365430b3e54b4d87f78814092c2d0db725f36a8d1bc772a2b485c6f0430d9380b6620262bc3365726ef9115739339034de3d337510f74f0ebff3de5c9cb99f5247016a81348b31d0e70f9e975fb350d72b3e40566d305f8bffa626ca60dc8f5d60cf84664dcf1268b230b465bbae0a5723d8f3403d685afb7affab348984672b3e61a3a0517352d5c76a276f3be0f8a72287794424c17a1e63f703257785c777cb8b37448ea37736487d4b18ba4a47f656fa9b285630a8941e16771de56fe423ae3a395e87f0c6dd3cf01f3db96a77552f8168acd52d3a7289f1e6aa1ac7644b710edfad80d7dabec1c9ddb66e9cf9f2b32164b343eaaf5dc40d9098f9dee79e52fd7f9f37b8e8af1ad8083e291dce972c9c03cf3b0c31785c191446c05a6478874ff654ee1836d1df5f091aeb0f7ef4a8338eda99734d07fb054199cebf0267ec0f38b4395c8be2f5a01e821ba15ec6188d597dee246cd55d7cfa40e44997bf46775ba2cfb02293b31b6b5846a151d72a75f033ed286d8ec52e85e6e46cb05310c719cc52a830a376086eac95c018272846884c26a9ecf6256b10c6f3e28d752b710e7c44dc614ff3aec8c95e6be537280f4595fe0c6ebb51e96eabb1a479826cae2b39478ccaf6adbee1c897e255272966ec28def7531d17df63dee36154dcd41a39dde8a83c6b8705a87c7e24d64724c0e998c9cd81740097277dcff58c4d3b630b52cb97bb83f231e5a1416264472dacd55cf6515f3c198d144f806b7215a30ca754e04960adb032d12d5c66b3643f70d092a03c627ddcafb8d0a4f9410bf8918fc0ca495a3d4ab06c5d258e1517293edc760f4388e2fc509e7a07dc446f1130487a808536e9ae81eec132335f37254a3342f63172f4c1f0364e23507c1539ed0940db3cd7567569dc5a0dec1cf4668ac3f46edda25ee4a171f33d54b75e199ff1c5a163c4d966afb9080840595722c5d1462df4b89d1574cd019ad84a678b3e8cdbc090a38db46ef133dff657b72ef3d45298756635845a607661714e7a13872c6f9e3490e4bc0fef47d96d2d372eccc3abf1359b34877ba3b9dfad10dee9c7923e327d0f464f8f3f1cf92bef45ceb6ed4e80226bdf2713958cb11f5ba6ac29371fb0fba72ac1b303231ab7c0272924764c6d73e355c6493337bc1a1f70a9127e9dcb1366bc88480fa2e15fe7a72fc3262696037b282f09d9db6f75efb95eed8d5c9a2b24651d3152db0ccdef7726d9ab98400f1a6966af4c6b4f275f575ab0d7cf1900742082dc2c73b71128f278ba72446f0a253059e9192d5485d4f35856c179c911f931f5ed6621221f54a01b4ba8735532f8920492582b6e32174517c6239dac751e485b3b00125591ce2199624bf52b33f0d55c331b2ca2956908e249dcd374836ead3418c17b99f4a5a31dfad5b84911c653934f64fb0c2d44496b8d33c5bcdd43c9e65fa4b146a770a728e35ada4c81fe9abd0642f1911d09f1c35290bc6e99ec8c5a9ab4db662cf5d5f477a5812d8234fc45ed09b9b915d29f3c46b8d7d545836e009e2f33e0755973485f187e6c754e8a22db0549ded298e8c032ab8de38b920bf1947d921d62b794879f1d14fe9109fd45955fd2737e239ee10da56291136f6c604c8f648f418067237eac751e530a485fbfc43213591b5bdc5edb5219e326df74b269185da19a9494f3b2fc0846315ceb75b71e065286334e34b1e60dfb934b1486a23e75138c172d11b05dcd5747318ed432de5cedf316a0dabc16dbb8bd54975d3b00d2e914b0017e0bcba33c26a24eeebacf3dbde398ca1d92ee7b16f27bcc00c2c2adc1420729595140c48d7c68b92adf9e2aea8feca9416f83bc853abf6e849f354412379627d8166c3844bf60cc69cd71caeb85d2715708f386f5ad1fa0814d0734f7edb3b95ec8cbaf2173e7c4105a7a80af72bad55515de8518945e9b149e5306fffe572b26142b2985e55f487f018e2e6a2a0adb738dd3a372bae00ecd8c30036a8b00f6579f8fc72c7f8c2890e77a02b0484680af530ad5698051092cd8edc27aa9b723e367b37032c10f504f4e20778a6ef4edaae7348c68826dfe7b7eed957e1da58dcece523d2605b1752a22f2c665d33bd8c6f30b52b40a48e297cfaec3f1fc172a16b0b7e1ec334784171c945899cd28e42beb620e7be6ccac7817d29fd1c5f2ad485f8b4a44fe00948430c6604fffe52ffca8355ea4d4e32b0395ae843eaaa7205e0070d0ecaf6715cd4e4546ba0f85ca446f6c7ba958dd12d153f8f17d248724ae8d569f3c7c5d510e892519644f89d8fcd96c035268359cf54812c10de5872bef589c95edeed53dbe78a6ccd8542ecb154c6a38f392eaa62c60c6f19bf7272898be9d5a05628df5310b342ee9f1e5b247b73554b593856f74b2cbf257c4f0a45371dc03d4f41147db13fe91fa7ae56982b4b959199cd58065e276f598175239a72655ab52b4461a043da4033ebb8cd778a8538e54c8f856106cb05f25c7f5c8ce12d73aee7db524d16ae61c49c33520e42a22956150fbdc9c312ca40ce5e061ecd55540c8a227568d6eb51905e193bc6b20695adba9f9d3dfba84b52a5dd6d6c68148bac9d3a144e1277b0c546e30873394f51f8e4293da521a77465b87a0593787ddd71ccf9663d4463fae0dc8b58c6be2a9533cac53fae9712c68e9b5172b17a1eeb86beb19a4cca73e409e899662aa233f92aaa42006d6e0acb52953b3dcc20d77f46536e9742cf4c1881a69921c44a57f39d5b4e66fd9001545c6df50487391d183d9b77eefc715f421294e97962c6af99e542f43fb79d62fd15adc4562101ae74edffdf3cc4e905de989685d8140d8c2f19df75026105bfd3bf12da72ad0d6e5eb11b7fe49513bc26dd061a5032fb6951f91324d37867f0b70c70287242cceac68160fc1b073b94ef32f9f05e6ccaaa3873a0de6b79f1511be258021b320b7b399d2ebd6b1002433f3a48efcf1203db34f8068e35dc3233ef2df26972067896f3fe37de09e561ecbba5304c7aaf9dedb8c7195111fa10575f13add548d8b883b64ffdebc91969f8c85c03a90b99a6b11efa092eee83ff3a812c893f7255e22a0982aafacf4dded262092dada60c601dbafc91c4f406ee187edefa3072217f267ee97a5bc067a9bebb9ee760884daf314d8d5e15b8d3f3f3372bc4e260c5eebc5a36f572a73f54e283f0851e7836a505d8c0452595eed7fdec990ac864a62cb3ea97183d9d457ee78c7f747d1024609ff9190e7b38f582e5b39cbf75721223e3e1de8d44d8273c7e1f82911b823d19fc76ae8ca8b8dce28f6c20d48c72e72429ef36a7487680da95122944679fd14d3c6d28c81518795bbdc811f1ca6116dbcec24b26c708ae07d82b8f7284773f2334946f15bc23c95728110229553b2abe58924224ed0ddda47563a8b45ac805b8fed5584b7372bbfd3b5e6070f66cb48714f3b42da31cb0114831e4d194b869a540a65060622ea39e48b4b2b5397281dc7fed91f42d1c39c1ce86b43725748ca2eeed7171339245b201ed12c65c177ce4e9084d8ee6f412246fe5d058d2d3ae638db9117084b5cad196863eb9735c57231f9be1011183013c39e2d2d02bb6cf9aa4a765186a6804b6a893eec6bf724438eddc7c6196d4a139ebd6988a1bab0e41de685b1302480a9e0b964715df6d49e94b9b7eb3cc1711d780d13bb16311c6f67ec5421ec6b608dbd6f37d13dd2ac8fe5859c6b705d084534cca31cf08b2d0c786d1631b83197b23ecc6aa5300726994b2680004b531b600aeb208ce53546dc606907bc5e340195b6f8284341a720058cf3a644cb9c030c3be90b8b10c779edcf1ec0ae00e15245bf964d41ce772ce56e966fcdcd8cb6c7d040b1245af5d084d1892d7466d43d02fc2ed14bcb672ae14db8f2377ab216f24b519b9957e49a9ac022543a3c3630b1835a6650b51723ad4faf8c62cbe87b75246156696342cc7f6654750e226b2a38fb83287f50072030bdc6dff5bd7623c93aac277da9257d4a0e574d91e492c05b49ecaab3b6f66b12f911b81e4392b372a54ad567b11661d584598f0a407da3f68487f5a369a728b43a0650dafdcf58efe31db2e35d603d61d4b7c776c3821c9f3efb7ef6e3e720b267d3863e7a862dffd01b1c9320f4cf32759e22fa73b5f21361c63663bc3725a26679bf2deef3a9a56b90ebd844eefbccfc47f889944c1b91df982137b8172652ad984c9105787e6287423cf4237a11b5c5a65e8533e1611a80505f2a14872058be83d28d3bb1ad4eec67ba537e601da47435319d201e4e6e2706f8bbc3772a7ec76f570c2970761dd3676e22d0da8aaadfbe120b6efcb8f1e7d49c17d5b72f768b0996cab0cd136186645bed53d75a5238c90869a575cdab37b2ab1a0d77259ac6934b5a8f7dae100675bd24ed24d779aeb98daf1daadb34f10bb5ec22a66e432713c9b367ecd91298cbbbca4e27f03e332d93f721e0878efa9505b7a2660b64370d37bb7d0fdc444580608fa64baae9781ae018b0569ad3a238a55966b72b6acff803b69c15fba08ce425864a9d844dcb562999956eaa059e4cb98d36272ddb340c405c6206628bafe8c34a67c161f4c8d46459c610b08ba1bebc264ee672a9e65b3dc566899727d183804fe02224009a9b1708e364c8ef66767c7acf8049fdc6d20ba24c219e69b4958a2e0706128977fb1aad9a5ddee88f8d7cf3e890118263d92e669a44043b30734f5768050d40ac09cbe8d95cd9436619f5ef4185218564709cf92cf78f7f8a6f2b292c0ed08bee1c1f1f8037d222c76de1b8b5e721db60053801dd1e9d5808c84d82073d64588ad082ff2b20bd32f05e4e0404203836377b8d3b80cb57be27898839d4673a0b65c7b8ac8ffd16c1cda358c9b0a08d94f9a0dd1d8fe5cb9af5a1468f38f10518b21026e50a6cea7fafc7699754572e8df1990ede53f0c6f7af08e99240874bf1533bd3f597588843da30e3f37094ce562cba42e0edf05860089c09860a8e8ffd54ca587faa41f01c163d65bf92139a529752a350e16015c5a728bd814d42d9379e48d52e09294f6369336cbb32f721e1ae920e096171f25bbfa1f568dcaf9199a21c5fc1609c536f5080dbafb877250e4794fa19da950c9790e101b3ae69b92044024622f2e2d0f0b84efcc122b3760f3b778228c66ea7b2befc5184b9943c140473ed40ae3eda7d04711af25131363b8b559f9f6351d03591788532b6a42fa4e64677bc88573a033f59c4a636f7227a7332661869e77b7c6a79ed311f3d9f3f83ee1eef2a9de4c5724fc6633da32ff9673eba7ba25b4660814b100ec88a2db4884595b95a8f23ee5c8da2ae4be723e2bbe43d0bf691d2b460d9ef9e8163802278bb6b033b561d1f55c45b137fa1975cab9f8edee4e7ad1f8e517808e12a49ffb1374ebf75c980eaf5f42ea14a372fdbf62915deb5fab9a6b6d8f70f09ba9533799c8eb4ff41ad4d8e6c61a82307268d6212517e1689f1e5d49407d948d1aa71b3e55ac633d0eee0292f6646ccc2e56d4805ea1615b1c17a61307d611004b9340d3e17c86ef315fe7b804563ed172d33d7d1b3bd0dad38ff4648e3c7a5714992711069fcf4b09d360dcba14b93d72824fa9ce05f1cc284bb628c7cab64db8967728aea388d7d5b0438fcc0d87a57211cfc60b85c77bdf4cb3e9cd7c7a4ca1693058421c034d76c188e9fe10f83f47e82894f1446984873bb1522bccbdb1ed2111585b7b22d658ed18e272bf340d72fb9465591682bcaa71b4c0618f92b09041ff7609f4c3e6d0725c9bacad6e59721106539724d02fc9fbe325fd0361d9ccb0140c95589fdb29a5dc1cf21cde10718f5ddc6b32d73d97afbc66cebae652b5438a19239de89780da5d0f6946c3c372a590afa6fb1f0cd82904f2868cbee5b5ac6f2b2b6ef09de8cd9ca9f63e50ae0d0c6b1a21a1077da6816b78115e4de82ec86d63837f371e4ba533dd28db84a8727a49cacc0ac103cb98769c9739292bd651e000e818f079bc04484dd124f41d5470fcd8fd4f54e5d2f7047948bedb7df14a3b210fde93e29ed05d19c472467005ae561615d4f9b0503ad3023bb4c128c513a68ce6aa0a30cc5cbc1d8f956b594250e5141a1d73300bec80a43b595bdb2bcf7ca7bbd166cb045804c64b6124c972f358f5ec38c4cfd11e12ae6b44132bfb2854fd50ff2af59b38c17bd8ebfa667217d4e98bf89181370cce75300c290767bb3bbee37df8137b8f1156fba685ce720d611f24a8b018e848094936f5b15dd81825fded2d7d8b11abc508a26edcf872293d3a3652eed9a4c5322329efefad0f9bf41cc71f01c72010cf67af8a092c72db918c2cbf17f14dd59568d3d85d8435e73bb041084c607eed84489dec95d5631f552248b6f30e69ba2ee47909a8c6eab4754aa8bf650494831768c9ba837a66e500b92820a95e3e914ef649ae1f5eee896b28836c88643c9acd319a6280d672c6a2566909f4d1fa5783ea392ebac30dae34f86cf48a2289934fd953651619724520bdc7491a7002f7d06271484834d997c207885994c7b2f94db3676da69b7285966ee77b554ee85c7d69739f82d373ab18e3c796cd125d25f91efb897e455265cd23cce7d57a19474b9bf616100149b1abde999abc73ad51d67d62ec4ec8723788a0a8bbcc9ce2eeeb19e88ddccff540c7d76fddefee396760ffa6cbb08d5ee3247f80f8720cf9045bba660611483824429c6ca144061a0fc0cbcdff39d0723c8371691ccb6018ce659a10bd9ec650f3cde65a4dc38230e5e6e97f600ad772885b5f1fef7d8a88d03a4c09391895b7444153829c04853e55b31bbf43258b5f68557078c1a1ac6dcc29d3376f1a9cf454942ccac690cf8121b2ace6fbf4c472458e6869a9d6a4620ec6592cb14fcbe73f22e65b0afce4fedbd5c281337d9072cfa211e469ca50d40bd60f05d1681af61d8e07d3fb1c4839e6fdab310bcad6036c90d4d0bf1be5e822d3c429b57c73831efa69c62e733c9d925673e656879459a1fd278b93d8f2637634e7e000af8d1ef64c213ea376ebeed2c858d409a61e72ad90e49d6160b44244da2d0fbdb9578c5f6bc9bd891c7a8d2a56fa3d12d0903c0d839bc42f2d1a7e14b9c2b71a844f0ed3e2839109c0f7589902c390c2214a6a4fce3a2dc61975e769750d8059d394183824370b610db25cd2a5fd4c4bc295722fcd3dbb767d3bfbe6486e319768483d6bd23fd859c98837fc6106a512aee1559ff1166432fa859243cb2953675a24913c2fcad93e7a67020a5b9a07f992f0727587f3c1b36f14b1a1b217f481df250d85b1e9ff21bbcbfb628e450a6c3d946bc5317f906d52528820ba0d99ddf068a9405916a10633d76211e994b49a1a9172751075059336e77dc758a2d675e0d139d2f08829c8a31b842b3ba556cb6dd9304f998b749cf57e12f17fc64f69ebf28af68c39e4b7b1348cd658420b5e3b44724a0de7dd702517dd758f3c31326dc3e35edefee59502cde1d4ed0e0c9ab473721e1a25daf980c92c2d02f2e96af0506fbbfd898f26ad0469774080c16f009872a042a1b39045eb3f587f12ff6b158a44f4f66c2f0c80d27299406f4b77368172d119f7df082363cd9f298072757fea7f7217d60c9ba37e126c71e0c38fe6c472ec6303282d50d97b2c9cf4d50641a44181e86c3c4b5927bdce7480d8d300ab728d2aaa6baf70237550ca6bab1b3868197e805716d6d723873ed8ea2ff6e40172f22dd49abb90608812c45b6d8dc93ccb978ea75f4d039677873a5dc4218c111510be183972a4de1cb7aee152c556ff048f5b7c32efc33ca5dd48232b6afb4024b7a08f8a8f09d7144ede6dcc9a3debcacdeeba7f87294543c604ad2ffff59072840d1f63939b372666e8f3bbc7f5a684cea19ef7e5ee8fea8c9913a9d594126ef7aec9130271ecd1b37421f8f17c7918303130ffaff51551ed873ca255690d728942ed8e41cdcb7eced6667473fc2b570abf38f17f0cd6ffce9555de644feb7280dfbc530fe14c946c43c1f6e7b561e172f662dd62559df31b25addeae5908029f783e0db5c79acb59e4f9e6a602e7e58c666f0494710672fec76531963fb806a53a34c46bd9c4162f6944914865fccd1b1d13179bde6fc9de05cc020ebb42728cdfce4584dad35c901723d2cde49c9538ffa15feba89cb52e4d663f1efa4672c297434a90907d5df23d3ef93a2c6e4247976c635f96db6175e3023c7f024f72c5f206983d225bdb93cf99541afae81e18c476e4d5afb9b23deab3e1aaed3172fc0afbfaadabfa7ca8cab08820d9af6ff41a77796ca5d80c5b6dbb8ceef77f72923e0fc1857dfa62ccbe25de5d0bb124734e9a512abb7a70f138cd54ccc1e57256e5b7a86d37474029b885a8b786d790861d8563342f43a223613c33aed8cd72e1637cdaac83156b7040fb8ab6b1d9bca6a8afd407d73e9005dff4a6dc34b8104d556d9e86d885cb3cefd5e3d80e4888109246d5574ef1fc39e0133821ee1d72d2fd54492a7c644855d8730aafcd6dadecfdac64b5f6cde40003cdcab89b6772885230911605a81fb8821e77fc356439a694b65cac3ea1225d7802fd299cd36081673e27990d8b3df99fc19872d3e9b737003b6765ff7111018fac8ff28b420a247875505db29295c42bfcea59c32da72da540aaf0d224834083d097b7219772186f1543d94d6d87f5bd4297a9f95adcf9124309ad7d9887aa4437b552d217720d96f1f9456e5b1c32cdbc433f1992b2f16b008ca78e998c61d1f858600ecc7200572e824f7e933b2bc9decd7de34e9919aefc4f7991f71d8309afeaa3256b7280cbeec3d715c78e9587c8ada8537759e420fb3722797970a680fb9d00118a5b5f21cb730ea6bea3a0d88dc95f187a46ec15ff09dfbdbcc4c72322a6b10a23477a9b8cbaf685767bd9f24d27584d3a0b7f6bb153700142643460e2d61471a4651faa37cf1496ad2a5be1f8d9b01ebcf52b4967ed591d24d0024294ec235546725bb442d1f081ae7437c95f27a8efc376f8d35e3d4b9c45587a8714e772b3bd0f7bb3022320c61ab3751ed199bf84035a2bf00211d4d9c62437ec413ab4e9d0726964e8b3d8f2e912406febb55bc0e1776940eab17ad858da985f2ba94492ee4d41855be9a0319c9d5fd202cfa5d8306b6999a870f0bdb4e2694e3d562bb3225d3a6033b476b894f5ed8c762c8f376625846492395a8464eb4ef3f64ea0a30d729a4f129a538835fe6133f152a33d59b9062d6d94c1ceccc80f334f74b373327206ab6359da32effa92239f8de476045b40f54725484d6b133f60043a4b505172943ae341534552ba8febc8a95df1256d85640b8a0836ff92f32f9b3c825c1972143a7ee51111d87741a3b596cfe87f10c0e1bbf7f9abc641ad506fbffca64472f8bcd4de8f72a58f15073c36561d05abdde2b943e344d675afea188b7a3a007207670e78314cb93c27d88da3b55d0c69291fbaa8802c0672fc64d037edf6b462d0748da98462b26bf866aafb71aaff6881d90794c1ea333539cf7a0ab9e0d772a2b8c216e596920eec9269a93109b24e104a6455ffceec0bc1e47449e5554708f5445acce1f6d56eff99c2d830cb170bf79d012ecc65c8c3381bc6034be8e872d065f686067a3d154af9f22b0e34d27105e47bf2a2e8ed073b64505176107c727aeb1abd2272858acc47bb5535d559b14b91d84592ac13797c8340c22052fc198688061364b571e2a753ff520f1ce0ffa9262411be4a22a9eace4a55b50bbb1a246f51d3ca5ab52ece4bbe2003a34e20ca9a2dc7cf1e728932ba62aa9b4a0372254365ada967c9c82cb819117b545eb0090bf5bee3dec41515674796464ce472c1b0e5b04186cc3ca01715e567aaff5c72848af0aa441bae2a0eb160315d8e72e4b3f949e64048e001b4bda2f2b5e6bbe44b54e8059329cab14037e9d10f79721c1a1b363dbae06cc8311a68fc2d82e16892541815e80a0f864a150dde82cd7221f074f342f0c2bc556c1457e9271e13263f7b1e8de2998e4561c44e90c66360a62b7f7576d51d950a61f7fe240d446de165eb8add4ad6f858122ebf2b145a722325ba092234ff1ac3bd8ed3a99511a6fd0190f7653614e67c650a9c9d32320be2504aed2bd27d6a478e8143497879f8b982e4e9ec40ca193b320e8a13167b23288e52105f776a1f8ddae9fc44cd033c6ec57d3a88705081bdf59b08af63f57285b4ec7a451a7e9a8e16d38bd0e3bdb6e606c4fe08749b224b566c12328eeb72a137c10d4a83069991d7098f2b40dca66b5f5d244c9c7faf2a51fa9d3609ae72786db23ac629b1c7bdada96208029d6f2471725da23f84599cc2f6397009f131c3dfe3d9abe11251fc4367123a8ad6c2061fd02522d9be58845b5426a38f600803b9fd8c5d1570cca891199d1a810178e11994b95d182ce5b538d6f376e61672511453caeec266786f95914ae7b7fcc6f258898e42444b80ce2b3f960fbe37720540ea9f14fb17743c3fdba9aa00409a6d24344ae82885f7fb05e5218556c76e1c39345c5fe8af2e3b8b17ea0599bcad23d1489d7f202a343e50780dae6e7a1c6553574491c99d96c7ce0fe1bf28af881893ade044071bfac1ec6e9c338c1a1aacb6e089500ee541f31d984ad0df8b388c6f31b935043e715b0454b63d3fb472eb9fff083f749d866cd5163e8b5c895cabc0d33da2cdbf720dd78616fabbd072f4ba53b9e3e64e43efc592558af7998871569a220eb90a356dac155a6559ed20458d2ae9815861c52780859b7e984f9c3d0dbfe6f2f2f7a3c9d1ea78d268047292d97842521927aec0ba49e69cf54573d51cd9f9ff59883685fea4c40459336ab950225fd7caabeb4e442be288122de33d50846d5fb57b697e4a35563f6b3c20c9617688802687e508da6e143fef8763f8c82ef33a1106ab92915d609e6b2701aa9ce393fde84742befc0d18f91b25e2c67bb3634e850da103f54d7feb9872009ddd250501e384159dd9cb71e945ab30b5e45b9b8511fb60310be84c69b11972adcd32d2179809be3fde58fdf1799097b483e348455c1aa0ddc68a1f18dc2926e5f94d318adfbde181200423f5d33fa9315dbc002a6437903a07f5ee77e2de51e18502a46db9f5b15d0880cb8ff5919beddf6c4820237001f944d6ffa72c9b72ce0f50186cd91560e61979548def38396f1fc3d3e83d69dccba4e9f97fe71072245b309d2b2d1f12dc35b1c317c61f14f8fca27f5b23f142a77d847dbbd9ed3b7e16e3061358fbf8924aad62088cdaca924e541c22be7f8b315dcca33fe89b720d96bfd4a65df599c1e82436265663db6613e6a39804179515471e5f145909573f904c747c423e0c116ff1a0d1a4b75bddcca9282d245d22095babe004dffe6f5bb054c972ba2a861a6470298c21d8b08a571aa7e2f0fafabe89dd29499f1b72b55f7e1b7fbc33cd1bc8b84c567ed668c314c9a7c0811a6633a2fff999f4587206f542ec5bf8f2e47e2413e6887f2c6d6310699112ff51beec9fcd8a7098a772f627b1e06b480f83cfed52e05315b43925da8684085d409f179dfaf130593872b6a52bb195921720f71f8141a276b36aee3bcab8eb7926601a8857e74d1bf272052671f67fb5bc713d6d1ac2cf3d9148f8db7b266464bd53529e72d049caff4692acef9c832582392d486c5648c5b03f162e8d37dc76e6a0716c33cf83143372d1ae7c0a4d1f5c2b6236eddecd05411f9066e89132bb11bfe22f0948fbe32a72cb87d82a51164d19daa18c7f648eb83c97f5d5975b1cdf7d16de9233b6080c72695379157f23d7a55b489fcad23a1c1518d2e6357aa672be4877c13fb23b900b53327474be6d2a677f8d14a4baac6c47eecd9c7373cffcc1323547a1a7993a72ce105debb0ba9761ff8e68329965df274363547cc5a98d1971b38896ae4b797269ffa5998eff53c35cbdad337dd298d2c869709f58507a4ff5c53c4b4b10fd6a7db491a99caaa8fd248cfb980b7861dddd6ad5bff492e69b2c64c91cb555ce725bfdac0b1df812a83ee24f8abda2043bc29e767cb49031b1a0fe8ecaf2559d72775a3356403f9222ae864bb16d310e293a3ab56af5a86eb306ff6b459de62b72bd75eed546663e71634602cbeb43933620de330f5fdddcf7d2a54df15acd8972e40bde8e53c5ba3fcc54bd70c5735d9ee479dc80da366d38580db1fb3e1aa072e240bf3475664ab4fc31404ff7d27937a59ac49a62902853cc4c60131a386c062ee6a5de325e2d5a1fc48a15bddc8ace1bf533060a9a944729b3582b382e2c725488a5605cce2767ddf39237c813866f4ab0209cbe4f13982df3dfa67d551272360f1df0e227c30c19fd0232d685b1d3dfe2ebcb3331d173a18ef301b83c104eb44d4ff1d39ee5a4ad580652b700fe246015a1929f1c8f3a6284d9f905c84c72e0762eb8c671ebd50b9159c6f16453773f11eced58006c58c1c6d4375c185b1973725e4cd7a8804df1481af960f513188a7a744ddf363bc1c6d24c65746c3572325ba5492d1955524cd2f75b3baa5557e10cc10839f0e680179ca5ff3edcc9721eec830b348681f7d79b375f7c5c103edbd1b29941d7c2f969581cad9fe58072deb0c649d2177a0954e7c677f4c9df73b8ddefb02e95313d5a0dbaeea12dd8227f9b8462643d0df3a4b8782bf35ee6f3ad56292d245c6f39b16c0128636485006797a96f47802ece06700efed158c444696e2fe781ede23b24f412c5c66bdb05c9e0f2157cbcc691946935fc220a09f8812e040c8b9199f0744c8631c0078972479e2e64f3810b6f5d23d949a068f847133fdc6c0a67c7ffe7cc8beedd53fd43aad5e82869e4a421790e6be2f107946b65746696c4ba4f2b8961b0cea1ae2f6264052cc0e13311646709a5db9a88e6b44fcc87bd2da2fa2f9de83789ac511c7235c88f6d68c5b4cd7d03e7edbfae879031a05418cabb40de5415da99ca145964753c4e8b8f52c8dec61feb02f7bb9663f36d7eba8dfe4b685789c369db786b726fa859ac1023780c0d8ae2527402d92a9b2bd3d5de8d7ac7ba4af548d3c7497206054e84c8231976b102c9ee9513c8534c346fffeb04b3a22265b124d6482f56dea63f165301816c717971dc810ef5007a25ec41df034a6fdf1e597ef240ca13be37c807ac2b5d48d32caafdc3701b8a9df18fae2e518cf51db233c27dea377228156ca38ef261d6594b7a74d69909eddccd2b4dbae8a05d5c4b9050863e82195d85b9bdb3236fe86db10227f842e35522f5ea22bca2269dcb4cca9932ad1f72085c1bf92fd90cc6f9272099e45adaf8694986f29ed217a17ca031f78a49d2725911d8c2a7c62d2448ef22ccd8368b53cb96e7febfaf08cef94ef06d8176f57258b19bdb2ddac5d47bc37fde5ff95519d8128a605834cea8035f7f0c01642572a0c46051c6180ebca12687bdbf24985049c13d9dcbb461e795a0acd9f635855cf86c86a5a86eb0e5706311c3507938b829ca2e52b6836294eb43771479129e728240adc08bd08053d2186a6f68c1eab70e2f8070cd7758d8be916402ca62df7255ce09423e7e44c2f1a66773b9fb749edf9fea960e355edc1e0f18bfe22ef172bf7a8c7d2c9f61ca4ae490d096b7167a7e8094f64f6be9995e618f31e4bf6f72314b9e452244e8559589f9d4ce42f18fad41b90345115c3117812553a7a3c94a4c732ef225cecca5d9c6bb421df6058789c8cee9354a6d3354dcbd6e67cc912a68500ce20c9d296e62637aa9cc9aa2fa7185c1aebb35ca9abcdf968d2b2ac45fa016990cc15f7c94a0f1a5c488a1d08ad78ebfbf6528266e0e5ceb62cba29b72e34e4ae6b7a9b566c6d2a374606a8e890e7fab0a5d994f3a796c85bdf8d64b4b89a21511a6d7e607fd1aee007ed819c710335949e590b75e9d36c48aa273877245233a445a4d8a109338290abd3c8d2fe2411d268518023376320a29c618277216fa28a67da45db99e3d381cfa208f7c703997541aae19e5f7bbd4283187287219fc522e3c125047cd5db09b0a7b062699cd2c144ca6d430736f2e142cdceb223e9d154fe730da99e145a0f7bd808071c4e1d6fc14547b4670242115d169d472ccaa3973ce0ab886c27a5155755a6edf07aa8709a974ebf47b78c87a6768e31e8333e668c7affb5d0cad0dab2f9542612e5cae2c72c55c0d1f10102c7c666f2c379fd5ec1b909cf522bb47bad8de37dbfffd69101fe4b9a3750da2b9ec1527722068ebc7283787b1ed64ab398d80491531c31c57026637059f31d89b59d3b5721e7fef34dc82093d903c64b40d20ce2951e0b84bee5f21b4526f1eed63539a0be62d5f1faed587d6d7f6f160ca84f98a945d3052ac58e9b7a136d17ae323733b017a65d1d1bff08a5444d263a7241a2c0de299cadec3a895df7ed3c48f980c6e183554bdb0b42694339d7503e08e146301a5572fd5e4de5802d9e46a9654887281809aaf3b57875dce2c0fa0b8950d6f28a569c67d85d192c94bf8b7239ec172d547dff8658d3e4f237f906397c5419df40f2a3067c9a67fd93365a8b20dc3720a2a38646a5fba7452b22f6e29f8d7a8116eb48fa58d658794387f6515167821d68b1bb0602c01a1361db6f56987ef798262e7539e0f1bffe8adc5c10d26e672173a3280c2cbfa03869d2497679df47a3d930524a33787ce4b60be94cf657672ff19a2acdf42b1fdd5eaeb6dbf7de7587f7cdc45ed8bd3079151f80c073e5e72f75cfd64fa2b2af4ce86a3e74f91b1f161fddc640d80f01cc994c979adbac072111a52735999ac47cb5ff79cc286faac74af2d26dc185f1f0cd2b60a97ef6572008dc7a8fa82416c6e986f1f670a7fb51dc5341b7cd6ab29065320528c4b3572fbb00649ec63a7e5c1749d1765e00974de35191b7000d50032d08fd3534efb1646c9a6c0e491086e654e954e75b4cfccac7dcb8cf48803463e349c8592520a4547d4a5d56097395527fca6cdea13a14bfebfd1f1f269c3272ee7fb319273a868471cbf78180f4cec601ae91e3b0a260fbceef48256fdf337bbc234cda2c53572f1bba84a8b407e53397e51891961a32388d6380e36080ebdbeed05c4fb4a8c4b4afeea157646f4c00974d672f5e2b99838eee829421314f46576c2ebe3fed272621672e5a0b47ad08ed27c87659083686045b7f48e28bb2576c80c0b51895a72e529f30d6de464680ddcbf263b622fa16722ac5dcd8c747d70d82e9734c8637237e7fdcabfa2d81150327064d3a036f156f7cbff3ae446317a711f397023e972c72330acc6ea3120fb06d167e7ee9f00e8e06e75e3dbd30e550086dbff9aaf72bd2d4b8a0f7a0e88542f7597d178481573f2135f77efcbf12da58dc141a3f47245bb26b13615c13bd6e8ac3a76452e1c4e7be676daa3c44bf6d5f2fc242b2930e3605ccbd762c4ec1e7facc11fd5356ab436adbde61e31b77689fde11a936f2213dc53d498819c00fe83fc5ad3ab42adf8735ff26d7d8eae6728b19f5ea4237202015568f790801e29cbb28aad8106f51bdaf9422da47c6eba6fd82ea26f207229ee1fbc03ce639b1342adb91fec9555ddedf1dde1eef070226be286115975174c0ff058db722232b0099133346406a4e2ce9cb311c65461a8924588e94bf97049b8e6d36cc7a568704028275101bfee309dc3d78b0e4cf310bcf7a115df3b4449df616abfac742bc109fe76efecc9e19a7293951b3d798642cb53a827b50b7240c66bd71fdb488df0b3d678a0a3b6b08392b2b5b7a01367bd9cdc8b32c50746c2e45d75e5fadd3ec75bd727f1c3b58b53118b6a7b7907334e5e1a2b24d2b572253781b6b934264a5c4925c60143cf6b272d4de4282dba6f0d1581b2bc948a72f4cef4224f62ea32e67dcc17130dfb848076d7528739d5251af776e73a6e8623755a8591f0e187278a27c10427f400c6bbeebd8a9d1cbd132b15fbca953d9001d68999cd8b74cbd7d911fd8dc8cdf83d0cdfe5b7b1ed89cc435c73eeab38a272d90f7de4534ffcb507382b15b1861b2801ac14c12795d06cc148f3f15763c8724d2b3eff3ac4b192a9d4e4b0f700d38f791fe0fbe242c10197cb5bc32615f543d13f48dacb8ae1ed3891f5697039f820d521ac2578060373d18d3cb3768a9a724ec8666fdcf611497a9095375596af21e9d057c1c74266c961a2f0703b8a3d638edfde971e718057108fa5397e5d439ef33425418f5a86d2aa4d2ac874f19472917f041ec53e9c80de19aec9014cafcace6f3a7910233871ad912cd84f59da3b277ff3624ed9a54df8042a033565c43ed37eb48e01d7233211cdbc2343c598721d686d03b1532e5be1aa704833681cc003f8853008271c58f79aaa368e1cc51d6b8d5fcf6d265c0bc12a7c8736db5223356908eda710a6afda9f62b1242a5272be7890a9de2a3d5e859a945c60248667a07038e9f8b5a53c3dff468d582108725565665d395203b92ace207784c53934b0f9f278bff771ca6d420787fd037b7229b43d9aecafa2770f104c77a6c3899693c376c82d704f8d31925389f20c3304ff76de54225c2d6c4826249a617e8cd12275bdbbc38c0ed97c1f5512b34dca092d74c52c6ebd128874e2bde4604620a0106b87932bef30e5f70c5baff8229d37d77a173aaa056324faea24bc1e8c4d95f7d7acc94891f9453f21b8813d788b720ee60c335d61875b4e478482796e8daee6b91d6e9e2faf2c788fe6a8f76b5f72a14a390877ba0239e3f60965c9559ed95ff0668095f0b96fa12972b98194ee7211263a766cd0b3883b2436111cc1b01b200361a4be660e92804ef4a6b25e04723fd3a7c5a502e548d7f57cb76787870b7f5c02d66efee5182da3c8005ac3202621c744f74c8522c618f4ebc2216c1d0915ab06c44dd420455cc89e517d37df50b88bc3da61042c8dc8a30e89713fcdfa5dc30b8755dd5fffeab7c83f3dd3d5728a53d9a2586789570d1eec14dd6e5e72f76fbd33deef27ba97763277d8de00726d13ea28ad64a0500b0edda6e19f16d831692d8bad2bbd6077489a15e309ec53cf9251bdafabf991ac5ce7059116a78855015e4413da1e7d7667a017d9ba1c72ee6a60d91aa6d239b2dc1086aefa344b3755fc6b018a20ba1b56d144c2566c721f3fdd2686b55921ca7589543cb1ccbc83141d5aede3bd973cf83521ac72c32eb9e25c78567a0b0c3a04487d120af648d1a9c16b8017ecad66c7121f185eec7235c2896c50ef6d84dbf20a6dbd5e1be65685b0829ec24447ee9b0f91dd649825083602c1f9b38671230ac83eca9d5e4b339e982e90500cd4ba23a6435e2cb97222c1a4c82b26751c06362a29a16bb43c19b11d6bde8d23ca40edf65238d56472ceef319470f9fbc550a8e3267b01c4fae1b1a5f9546f447ff57ea24d6932b37220bef66c1c2c0e0d19f4df997e9a825b20c14c735b33c3b08eb00def1b26337271782bdbc4acef327d65ddfc9aef288aad517d4c5b244a7dfe2100f89b4d5c727486ddd829ffab487349bb8bc47b6b097dd2193e762feed26d1287b17934877253e2e495854326310ebd6f98d1264d6eae88935e2966aa9e9d24867d35b8aa38911b5f6fcfecb49c3a3b1d0256aa4f64d834a318c87e1f6c2e37696b6d4fa072b81a64c35824cbc5ba983e4850ab3adadef97b3dc8d843d58da31c666e57cd72fd65619b97d5881d817360a3995de611760e9df30b9a7f6baf7422cd0dffc0725bfeee514b67369f0c6ff75a6a179999053c5c9a23fe27be70be40cd2fb970723bb95eb67d15ab6d041d69068947ac3e644ef5ce11a3dd22777387b068a49312ebeb101c80b019703b9ffc02dbaa965c6c15d2a264524bfa35662e99b26fea45186577dd9d0a2351445b790ae300fd9db5cba1f1fb2bbce470fa1b1a7e9dd872f89468e00fb30793f19c49cce568efde2112fa1d83dc5916af373abedd1c93297b34ec5f735b485ed4888e09319a73eef86a687540d324465f9ea3815e9b3b720dbc9a0ba072a75c447e1623236a8b9823bb89e2c82d0ea6b6809384329ae07271cf5b6d4be58acb3857db4f4cfa663f6f736d43962cbb7230eb0a983b87480d00267c508540429f1dbac8bb6f0e5c1a06ab338c0c8a6e8200520ea647b28c45b57764611b57e2143aad3c2effa213963b7f7fb385a9ff005a578fe36c8b374f16718bdff64c56cd67c092be7f5748f94eb2170ef9ab4495d545785b5bb77e52722048b888ff3823b2a38bf9b3522875fc16483cf1e7877e827e094047c09172ff9bcdc161c3b4fc35d7e67cf9531d0fed9bc50f0914ff600283194715eb6b4c5f1ecea9bfcc61b7344832150e6cfc1c9c095424e23de92f1ba7e1cc03b3f672a06d3d07bd4e184f52206237400efe86b6b635ed40c4cf80ae03b520dcff1272d938e8f0c4b3658b9275ac47aa5d25e71f3839f92ddbf110b88a3eb54980cf72bf2b4902b1f4365fcbf735d920a76d3d7abce37699d62495c405c8b7fe23cf5e0977c47d462dc460d91834b4a0f9233229939c6f6bf18a98fcc535f6d283415e386d07fb73387bbfc0bee763a732c28aad821bd28e886ee1faa6301a578cce01ac1c84484f16a8f30fb59b7b820c7de23b33a3f47886851dad145bac2d808272bfb435a357815cdde16c12c4f9bbfd080bf9e712dd54bdbf0b76ddf133196372d196221f2d68840f09044d2b3dd8c450e0545f9c80a9a75a197e8afd0ba3c363e5eda7709ceb943441d7c871a1a61f2e140abb91f049513996457aa2cb132c6da6520ed22581a0490043a43953c9aed29eeff567447fe391caa83832850d004b820b087cb16d3d86136a8d3912c1d38a647a44e943cf208867919506e08e48722ecb399d4cf4a423ec7a287b267e6290257cd07967616e43505db585ae4c95724106c1ee2c240fc516050ec116bc3751ae9ed4cce442d04acbf9617f196c3f39882e204b076a13d8a96b3486134c41c5f8c96a7ed9522581f408d7c45fa6a2189ca8fca7b19849ad735464f772cabd59e27cd1edbb7579def96833f0c97a11720d55702e7a4ed987d8bbeed164c4ab56d95054457205708d8d52c82f120f517275383a99b5ce7504f0e3ff3b01baece26870c8451f8a63e9f125dd3b2f9dd766505583a464e4c689ee30f0c98df9fbb8691566df686d2fa665ce2ccd58f29559ec075584d0555d67a3e2d47019f084a062884adc1e75a05e8ad1bc17708f0072f34931991c1ec16b5a18a3913138e9da5729c3c639f7dfe3fc953d3a90596872cc9e674d539bba01689956f2eebc5c7ccd3ef97ab74e2e3e8a377d39d7d0465a9bd64fa7c218cd5fa1172c2065854ab7451333235d4c2625fdec842cd7af1762ddaba09802698476483725a35aa2f49cc35390254deda29e4e22865492a19272a465e84e74f8205f125d2ce40380479891f12ae9ae2c6e15190e63a300c10c43254fbea081633e501643d32a3808c3e28507ba0721dc3ac80ee27192f0bc54721029d9d0fac2387f66f2bb699084c661f6dbbfd1c3aebf7031f9b6d6152aad03c38f6ff8503ecb99a165d0d810e989ae8bb807ed270623c705bf4bed5242f872fcd90bce7a521760a76d6fdf3e1ed5bb3bf886a50f870376d69531ddc8db18", + "0x7204a4754498e06db5a13c5f371f1f04ff6d2470f24aa9bd886540e5dce77f701dc67b8108505c5bf675014ca41c819ef786c1de2a8099f6ba4c79bdb87da6055fdbabfce532894fef0c2db87a07ca982d1743be29a773b3bff5e6e59c2e298f72463dd5d53f5e059b0765cc9abd2b26a843952879df2bcb8fe88a2d09d5c612728079d9acfc46433269113e3858a4f22d7a92de1846678681669d38b1a5e2cb7266af98a66999923431cd5d53e797ff0fba6a0054c1496c3afb5564bcfd19de727bbc74ee6425cce0c1bbf296d913f6aabc7dbf6947fb984d01b8421ca684d87244a1d3b5d788838df7bf2d24afcc411db8ad3c2bc6b4ff3d964655a5d5e55e72c62dfe4bb029af1502597969500b93c0134f8cac9f66594aea7347e21e4eec4166541a03ccf0be5c7e24d33e3a57bfd0dbbefc8ce28714d78a369bb87f3d1447f26f9cfaeec65cb142cbc158484deb1b82e28545813459ffc10e6cbbf855dc72544c4df4205eec1b934b87518318c79e3abf9e706b80fb73b19081f344d7e272b1289104d30c3dadacd25ea8e28cbc6d1da0353f346e674b8feb4f1980d19b722e5b0c197590050d5c20bb2e3d5369763d3e7352486e0fa57f6c4dabf56f7a350dbf01e73b24c032c0469c6729c9fe210e2419ad65e4f6848017e18f5ba65d72f3733aceeadb4148267cbadfe7b21f12fcf95ae3584227128c74bbdb14040b720426e7e3d1ea6e7d23a4bb7bc973d46c867c53464e3b500333b03a4fda717857ad21acf7ecdbccb5c62f016db95b5bc9249650b696f69bc53ed6a41a20b00872d8fc88e52885b9b8856ab5f0868b21d36b6498801b70ca22f836ecd5713a5572e3f85ba611ef0d69d3ee322e4d82e9565d16b9944d80e8357b288a5ca9681f502900ea5181b7950b8b8f606688a7e32793d2695c49e6bd3cf7947465c0d8b172f6f7ab8c403af8356794055e8d3fdb41df400e8bfd0ec36886d6920df17fca5b89687c28a43d46e47c20c41f0e626fc71c848f3fac6fd8f6f6fcf4c328efae6a6d21212edc8b79170213d6eb89014e8cec02f869b1b735ea8054a872181009722405f9dafb4d7db5626803c1dbf3716957ac20bece27991f9110186290915c725516f6747d6687f4c748989f9bab899ee8e8c0e320574de9ce621252d7a98a6029042617dbda870fd147db91573f8b50e1d4465301e7d0d1e711dedec7a098491fdca3a66067d6fceb31ad36dbb2fd92c997f744fe7af340eef510ebf0dc72722fdb1354b9da81ef977a52843d1af8599776eb9bd6529b3153cfe8f727fbbc72c4b20539a45ae92f1101902c468e586254808560af368d2505bec1b22d9a4c5039b20ab25b5c8e17a4188d0073fa57b30c20da250b7d97c60a89b85f0aef6c308939a1192fee65a538e775bf8cd82fba17c144f6080bbf5bbb910dbbb8c4935d5fac68645ed58c7b226c3c275b6bc6f8a8f8f80282b13562dea35683d295a2393629379bb984c18b1166e42eeb264666b530bbfdd3449dd9758237cc517999568b57121751350ab7019a5feb8e959b967018250829783bce3d13452ea698377215048f10f786e606da085074a81121672faf05d8d706993e1bf12d0f6df5ae7234d690f93495bf1aa0c6b9c620358ca50848f157b13f016f297100c07f599e72b6485a7905d5b6077818be8711444b32c9873dffb587d5937bee071892ce9e72e9dd7536d4d9e5abd349ad6c4735964e7e68a8c6005f77078b7d21c0b8796872150fef2e9f5af0a62de63be673ce3919f794ec5f71144d25d0e0bb517c8abb723d72cb93f9aa2b7aa112b13218eb8f524b8db1bea060c730efe60029ac7494727d9b8ff27833f5b9b7c5a85e3a359736884cd6081f1461114d4a0a535da1810376c6cf106035d7e198c1428e42526d1adfc5e907fd1885d4dd63a23ee45d2213417e5d1e61635361945e8b81e124939a1028d500e15c2a4b33f056e4aa31da277b51d8573e44d147fff0003ab828de6613d54e47d63b03c87d2bb43749015961d4d15edf362a352810fb7e0ee848e6232097d557d1f70634d7e39ba61b06c872b860b33d8b718cdd28ccb8c8ca4c35100060e1fa94d4f48921f390ecb2f8c14a33c33c27bc7b75b78a3df72112be1390c2e494e282b6c4cc1bd12737012d3222d346c4ab3873ceb4900c611003ff2b55923f08b4ff72ec46a3bc192b6d777210a008db3649e9a9487ff8016c6d3e257bb759224f25d88a300e5e70509de54666ac5003e1afc51c9caf62dd1c78c9b26460263ed73a2f675a09c6427348d79a285246b1be213c2983814db5116a94419f2f91149ed9fc39f29ea2afb15486257201a68180eac98f4c38ecbae2d3b789d75ff049415bde9317125fec204f62bc72f22a92b2060e5a312181a33d55be8a9540021fba92d309fae96d248c2f4d15724788ab1b022591bdbac963149f0435f21dc5ef7eea783de58f3e1d7fe882b17276ccdae0ddc7565e79547515ad87b354c13f16b2534d3b2835489f76ee57a84d07dfef7423f608039889cec153de18d62b3bbb80d59cf73f669910af3d79077282c4e0e0ac792b3a51fd7d6b459f376bab1ecd63cfb9963c40a4dd416d37a503b226691f701b9c211cffbaeb23ac880e28b8c46eb0b40d34f01bd811868715723ac015fe0c90ba9665ff231040713c20afbce75b4e09e6812b0b102958f72f7215f07a19522e5465f5ba15babb6234281e8fc81c8dbb287201c19a560d5e2872acb1c440d4597edefc84713235f2985c699d7c82bde0bdbd21f475f72a694972191588900b853e16ebc8bc6ee04e4000c789b73792ae9f4963a96c4980c5a2531019bbbd951aa7dbae207d88a298be95c613d3024e4059d5cdc43b29bb66840ad854b6ccae894802f7c0a6b0e2ea3b9e6c37ffbefeabc3cdd749948689d5de45ff13aa24722979c3e2ac2c525efea7591431b21fa16158a142619116ba87b339cc0e4ea71612d2d6153cc1e2159ba31a3735d023e3b972ccba8eaab4077c1f1ea39dda1d3f22674f2f30554b9e3ba0ef8a5ec74c83db5cc3feccb6c1ede0c8169941ef30ba1bcbe5e515413c00e88d6b51966766b2ee3c64c1e43c061cc020246e5757adc61515534dbe30e90047b46a9da535bb40bf25c1a10b98a2c9826e721891f11d63bb0a144e719591ed3144da8b6c8169c96a09ef6d6b873320bf9f39a17b131bda4fe44c26afacb4c8e3010bc25347b331f39f0e1d7953eadff6e031f689760d7c04689315a37f517cfd363f0610ff5a45a1d3362e3d1c99aac8b3726aeea188811faa87ae78bc4465960a2e6cd3dc0d5ef87b7bfec7aef1bde05a6af6b8ef8714e9a15f55e6211472cb4baf423b6f512379d8da2227c311e323c272db7469d018290246f731f5a746683c601e96d3f1a51aa860e29d80b99daecd7286c105854a166624025543561d70a631760312a292dc82562d951ae89ea2b672c4d3b60a5d1e41161b19efe6b759add6b64c966d6d2e95822fe0b248dcafd15367fd7bd53c878a8b731dafb6d3fdd0a9fcb22c21b9ef5badb008c12613ce06726897d1272b9abe6cf0007fba825150dafb6de6854aab55a73a76d1b6fef42660fe96fb97eb87364b6ab7736c59f9f6e587cabc1fab98b3599f75c54f2294764ff82215efa63c0a69f8fe98681eed63e66074e028a0dfd5c86de20c2da94ef772b58dad140e17250d00a1e036001cd37226ae59adc4db8a4c476f0d684ecf02288ccdf2125e75800179ca4111743fade94e0819f8fa9e10c2a22195122c675e5c0f57c7912f8425747f59cae4be826e53428102f63208402c0fe2543c626ebd729da7be6de9f001e0e3020dd25253b9b894d1b3a7bd4b2831f2cb39229980b13a8d45a6d73f5d7460050e440b8425cba6fb550bd9a47f29e7efaa2368a70c9141f63adf227ae1a606072ac29f0cc200323fdf74569433a24d5d45d10bb60fbe72697f491b93b7fbda060f49464e98f6b7fd4a0c23b70cc942ea1ff40e3d9a54727c817e34c3189ec81e4e6c18e0de9cc97868f0edb0cb889f136c6a0f8e4c0e72202d056514dce7386abbc7d61085590fe07083e5a24660edb5445d492be8566860c2437f6660d8c6623b690556161e7f875d5ae2f947e065673492af7f0a2f721d2e19a8d199da272b266c5569e9140d925cc36e443041253af7b8dcfea50b72114601de8d643c62882dde792ddede7e6792966b2cbeafd5c86a6039a6e70872e8e6f4a2235a88017b7c4417b243ffb074a77e35168b7812bb8968cc903fb656758c9b1e74b7eceb56bc93b4deb0850f96b94543852107753ebcb32a8b187d1c24eb310f5fb422c12b750f8337ef911a46d41c6e41e830c0239e14e9aadc0f72246732a6f47079f3d48e3d209050f834fd4a7aa5b656d37ef937d962594d641a14139abb20c3627f5f992a40182dcaf4a25945c737cc634ec3db936ab2e21672a5fc807987742725dae8aaad6db48517b6b2eea8ad4fecdbbd00e5d4ae27c172e357a419bb96ac32d182ccc0006deb2a1ee833ed43e1bf06a2016c1928d72f72355098db30b4b590e5fc191b95a91f3e0db83d7bbe9dc74665cdc85495e63515adc66ebf8784cc56892b4a6c50d9a3a642f155e425dab61f2d57498e262e647207a65ce52b4f07038ee8e7627de8ab0f224e4dab081ae8ea0682675866ef4d729471050bf173fd0244bbe8b378fa528e2883b69d09c23969ea8ca5e91267a645d497c861b30e5c642d7c4dabb778928b68490e4a3d078fadda6553c17388e70bd104d6271459a2481fa12136f64547085aba6602b3e91aa811533c6ee835b168067f0240d1b6c546974f91aa2e45820b50a7c787ae2e362a1db1ca4e6a977e11eb5f71b3c24d220482377cec86848ad027199da7e6245ef69b6c233c83b82e701e2d8d91625fcb8cd80f970bef79c981593bb440886e310557412ecbf4a6046aa154e98384629de25e8b5d4418875c6e8a370ace778d263249813abc12ec0d7203e19845d3d3425fdb2a3f97c7881b83ede703719bbf1f0b36197429bb582040892c2553c140da68002bcb599e079567bf6875ca315e972ff16c0f9c7cc8aa72b0d8977a86f228175104427f09660ba35891d4e4407c95a37ba4275756a62672425c8307cd2ce249cdd8b8a0631605666a68041a2be2db57d81f3f9ad6f15472a593daa11309c58c25a0307f0afd4f7d0c13b756cb77446cd95c42c138c3b6724a58c4835d4fb55e2f0f9d1da59687f1da73c39139b50be37c36ada7fbb9b3722321da60cfbecb79847096825e97d3232bb91bcccd17e9ef30e613e583fe3472803faf4a75f4cc8bf7b5a5001c473120c557e3aaab176fb7041badfc774624720995f7eb955e84eaecc39048e37dbc16879719842d901dbc7d6683c7f450a9695b2f9dc41d37d9b4d4b1a4a8b1186f25c22f765187e6b3f1cbc38ee05103987230882ec5a82464f7dc95208ef6ee5be392aa24352ae2cfed5457e805a243395343e46663e8524712bb348238f95bc0723ff49d9b098b6904ce672bef6ba3147240db3adbdd543229261f74cd5846a650a66c55e0ad4bfa3abe6ce2b75cdd1931d0ba4e00e8479b50838a5883a9e322f3271536a1109b0ba219df866f2e0c5172fa5b2d3ef9ddd1daf4fac29cba9514e73948144dd161838d2c30b8d0aecd2872cb306c391cea16f261624f0339eaa1aa9706c77557756c3b257da4ed9cdb6b726b550fe5a38f305d420808976404ca27dddd95ccf233a6c54e9bdb76ffe09e72587a6f136e5ef8e8b519f2ca388ab9d3c52166fa73947833d3a80e1e8bbfe072dfa40f3c45ed7339cd709596899d56cf8e01c8ad37b96e8951979b36d6a8b872d2b9dcaf843607a32fc5c16fa9167cb18901608b13265368d4264ff49153c955511be1310f93c50f3faabc7e86fb096f4f6b6e50e56cc89752368036559ad272f56d9d84017256e025e3f590aed2a150033505ea449f19730973485fec7faf725346e3594abd07b4386a5e4a5339380a71981072ff41681f8afe9bc00704de7233419caad802710a4b781bdad09a27db8825d287af9d2a526cdb207b7a52166eef938e23bc9c3d1012802b18e73bd1d61ebc7e6ce87f88ffaa67500152752472a328160f3e30f548c6f9214d63e7fc2ec19a53cb0f7c37536743d66b6e4f9c72585697b05a0ab77da9841004c098b6c10e57d8e4de66276bbc7f2f7a21042472fca0bb8a3bd0befdf153403b6629832b90d366883468fbc75d8ea72b9f892448c74ac8bd1d8ffa853a77e3182aaf7fc93cc24c4dc76a77d12b49950f79cfb16e83ba4c826e9e7f215170f9d23bd9927ace9dd38f328334f6434d59a23cced972251cae5706d437929fcbf07544a861248589d084ab7c0d62d47b201e767605729bb3734d46f1a33f5ae1afcdbca268433633e4422036aaffca8fa0086c0530085ba5b28774cc823134ce83d7d8d329470f44ec7863a24dd6ee47c50b4771eb72fcdb0809b4ece5002adf7985ab4bf45ced13bbfb05df19ee123ec74cdf6d5f72c19a1eb8fa72eec5fa035dc15f88b87a576a3d22a66b9fbb48027286bde4d872c1e4d3558bff185000f57a4a876ce9a9f04e8b15e109d311f80c3095223bb5720f58faa968deb75f3cedbbd32742bfb6f06878f36cb088cee6503014dbd70453db21173c2f79d4751cdb7d0253543adde152d20a0cdacca47e9c80c2ba8a13728ba8495339419b97177de4dfe27ddc5d220c89019df8e698e1ca56f4acb8dc721bfc3d4166dc0037885ca4bf85bb1c36111c24811750ef44045cb3d82a380472374da760da2e61ab04aecd8521915c9b0109c18277ebea4b36b561ab10cc5e301586af7bd82ae1a471fe64c28950066f86166de67238281a2f10bb87e1ca67603ee10c2f42cace79d5808c1e082bd61755fb657c5de7652adfcdebe06d38530731da6ffccbe702ec595908a3a4e3fa58637791109b456a2f392df5c68188a41f3bb80448301e98ae55e319cb76f7d255c156ee02b37ef9f471f354977f270e72295fd7714b4e7257f446c7dad2709abb40c55d6fe0c865b3eea824705fb63b52ccd2663f22648a1c8a070ff213b9e56ab438594f19bcdb2256ee2f9f9ffe295ff6f9d36873d5f36e59e66f3e3f1ecb1902fdd4620dfc4bf998a88e748c3e790e1cd60cfdbe25cda5123c13b1296f82f9a29a3313437fe9b129d9b753250d385f3b565c85b5f1e46a8cdec2de2849e50a477b228985035fe30d6411161996ae00e0d06dd7a2139dd54d5451d907707d8aedc71b8fa5d39405ac95818edde0273ebd8d8b4e7468c00e74e1458c3b7ccd0d019d9da6557b441d903d76adc85f5d72a7bfe03ef84f0febd7e6e811662d2e8aed2f7f3943c4a9b1063d19b903ab33728294feb153435613ceb083f6a561d3bc8353ee6e5948e89b7e8a632babd41772c881250984c5cdf4529592a9f84d222ab1de62c600e48e5c53f77bc4627ac4722d0aca458c4de30e8ea28e6c574846211057614f501c2dc218a57d8891cb16205a5a8dc8fa045cacfb3b3a546dee1ccef24e0eedaec237dfce6ddcb034c73b72bc55f2b5a3d2959084cc990313fc095966bb48bdfad9c65eda6240d524e9e45b62fd66427b983929d6cef3e9f8647921c34e863a1bf2f400e163e49a65fe79088620e115698b496e623e0d46dde4f45a8af9e432e36107a8925e6948baf25c5fa04bb9110f163a7ba3c6cecce2ed269bb1318554166dbcebf3b4a48d024c113eb3fc7d5ca48aea3580b8da44d188a1d7d5e2043d7d566ed4b7df6e540668ca72a7125d7bcef42c7fa73322ba9e19ffd89340841f8055aa048ebadeb9eac9e32f13341244b42b0e12d88d93313c404f6020b3b1d6b5ed2a89a1d0738e4ea9ff721a078a001dc44fedd67fd652c562dde767f9800571c937f292fe43aa8b4e87724f108c504c2cc018f51dcdbaea3300444628aab60a1847872ed2fc790ac66a72f4b6d73d73239e4029c7d256c261f6aeb1233a105ae8f8df76ba40541e9966723ee1db46c2fec6f910049c4019fc8ea58edbf5b129e4137b94c471fd8859fd729641a0f06c293001e352b94937eed68b9224a97da1ab72a13b48f0b8c90de972fab8b8f5722be35c1a461fd5e4326f3526a99c86802b3c8a63a251009525413f91183514efd541c32f3e63580fdf6b09d83d7aec0d2a1acae76230ec47a8c872244f53455de02e784c05841cc1a86df5faa767115e63292489ab07604d5ff57216431efc65536a28db1e05bdb69d813f34957fb39e909781b8bde70ebd76f872689f8778e8c70481d092702c0a99b3187893d0fec6fa8c28c059d6e9760fd372024b217eb8c533acb2546fe2d1b9b667f570ea6eee699a304386264ebde49c44340654e17ff6716f1c1a2295bb2dc1018e549bcefd8a45df5e155d6dfb740439da79011b9609a8a97add48367913ef933596e020a64bc1f67c909cb620131372b82d5748c848cc904cb6da8d0c4d698887ade4ada931a7f9267e656394f4cd72977b35aafe623da9a27f19085eece273904a45f692879d19c2310240d6afd96ad3d79997ae448588dc3fb773e740c705b2aafa5077dfbedf9d900078810c7027c2b214e97d76d3667a04c5c55cd923c1e8589933a8b95444f049dcdac8b0d54bb11f908172f902625f1fbbce99aef67b0cfea8c50286fab192ad156bf0c6915cc715a4d179fae965f94a7d04452b5f16fd8e32b61fb5edae3fbfa5fdf049b6138798fa35f88e1f9d76e9cfd39fb23a9942a978b1c7dfc5a69e4b0ad2e3ec1a172ab5796e5feb9cccdf319df3dccf9d272c3f7ab6c23337ba8294e6589f983b72e7f52848bba42d19e4315e8fa6c70ab6287d0eb19550b71dba43ce28a5110a16e3b0b165393ccc66a850d65a074d96f87aca954e7244a6700308adefe3da0d72e4b95c660d495059b345958a5b90b58d287065b055d0e2b357062abb7ca335728dc3f402c6bcd0aa5a079509ada3fcc0a9b5ff2136c31f08939e662b36fe9e2a0ebb7e7f1ca365db0ec6a416fe81a950d0557c39b6c3f72df2fe1f48dd757138b212ffc504b7801d4414d5e48376db6d2aa89c0a27ffbc570e6d3eba599c06722f0fd6477fdb342f2cb238baf7eea3b6a6029a0332ce1096e877dc013f47f8725e94dfdaf24464af20df182b74986b3d62af70ba08237b567d0fb79fae57230ec210ec1cb7e256f5908c601284e0c4ff3202fcaf6cdcf5b5d60c21f4df0da9720765373f02b8c0e8fdc0ae2688432356443816a8e9a75028f64c487393673107d1516ac73ff50f5de3bd7a8d4059583b1a03bafae46ad8b6a6fbdc9d06d43872fd4b475ba61d42e59507d8627a12ed3d9a57e2fd5b220b385ba248707c2eab3e04002048a244c9ae072765656256a56c8dab2475796bf7b784eacf123ca2c372ed5a177b600308d3790ce4762397e76a86c07842d068261d48f028e05b6b0e7233d50cf38642f8b8ebe133740ed60975d08ecc9d1e6d1c93a10af064a69e98725394aaaa8147c2b6984d32dfb683b600ce3b51b72d8adbbf3f219713ab514a5a2214612cb9a5fa05e2e13bd27f795595b88d1d144fe9ddfa3324db15bdd964728ea03124000d7b23dfb6b6ba12d5fc375c59bb8f0d86e8b0fb3d7032d2b7a072ceb55fa4d238dce00913da3b19c862dff39ecc80173347f4e97536c62d2c67040e2250002ae61a863aeef3b9624075b61cd84620b09f004a62fefd6a24ba997204a0c9dc4314578eb5eddc076a5a94f4bd9f35ea948f1b64c123abf1b1547a2648bc29e128f0b7fa9c5971a98d7ca2190d0ed6787b3d3819c7b7a999e71960729def0e8f65f36002aa0ec69e92662d008420b6f821679ac43fb49912bdfc1d72706ec09ac0919ef07c1adbf89d20e6420d21f031850fe7b6470ef3af5a95147288f364f9b48e9d5c9d79650d0fabb45576f4414271c2d51bb7aba44acf5477481c3dd5836db486ef7e9d0a4904dfc1ee98975cd1600550b744545e65634be25b6a38a3abfc74795c45eb9a802df8fef1770e18751c516cfec333d01250c18316ee7dde13960ebdadb637344eac3ab18d6619965304af6df9dcc82b7c0e92e9723b42270d197b9b287d59e03940afdff0f263deb450a2013afbf0002308e5c9720a3b35544bddbbcca95a84d3086cd07d92754ba78334878f813c7bb2ef72e3722fbbe9e5736be9066948bebc415a9ff9c38e66336ad097c2a7120cab4b638d7238a9d684775037ed2b3be221bf7b2cb8c7f76ba21860ca0e11c8a5516973c572ca7bf51b2da201257ac810bede1b013a29e82a42ebca24ab1f56f4ce3de59d55aeeda2c778a3a501f86e862e8bdc6d5fef9c60525f1a63796f8c48b0a80020724227fe9d007efb1c55c8e2cc865bdcd932ce00a236e9bba7ee591818123887721bceda94531c7663750b2d3d7319f06e0c42f8c4c9b22942587aef109cbcfa0280b4bfa83e04666bc46e7b581259140fc7618a4b8dfe3e193992395814d8a17257e9d8f04186eca2662ddc46b96a1d64a8ac4650fdd6179adf686847cd420b3f4c5e436bdfa14edb2c8e19c765f816e02445ae8096d4bdcb51f117ccbec09939255345c10665356d499a3eeb2da242099d17a8a954087cbd1c8eb263bf7b5a45fcf1f9f8fd347cc9e21ba6cdc2f8b82d8a12b5a1b83cdfae2a22f31e9cce14181ce3ee7659ae3f947d4275e7142f2aa43abbaf44c73bb02cb801c727327a0e7279811568a6394858d4a638f43eee09c09cb6ce1c5e6473ef7ba724f70a35c4437c35267c181f461e6a0765e4ab8e71cf46777d9f4b5e2c4828488863005af6725144f9ed484b3cf3ea61914634bab51517d8ad9f55e03f15703484eb68227e726a506269581da5744f1b807c5b66aaae7abfaf2de1aed935499ac06b3ea98a6549b718e5a4e64f4c66a21a0cd6a236d06ae99aa2fd6aa617b422f6bdcd85e3720bbc6c66ee0b39f11a2a350b060739fa748a4bc6568f645363c11bcf3c6b3472c59d5c37cf24745110faf08b1008176cd46be0ce5666532b87e8eb45b184407245f0bcc574ad4a528c5010564463b7334786e31a0059ad6fc518262c0c5cc87289f6d1d95f43055d3c0c8ba79e97e88c594b653a37c2bdecffd88652d891043a57f287921aa58989cddcd1b087e35a15bbb468f35802ce379c1f9deb3e63a97225021458821e27a6ef1a2beaea86d638927de1f31c8620a90f17550812cbac58116768a7d5e0a55313e39f3378ff40d03bc8d747dca39242e4ba57376940dd728430833ff212b44a3c45b404d42a57b21189806f4eca8c9c69a3918f86640330840995bc4038abb01e12ba28ba47a1f931abfaa5a4a9c7fe161fb97cfbe24c704a7719bf75a2c99fa61d3b02c7c216b01bf1b3df4d40abf6673a994e1de2716e908a7d6de6e33fec8bfd0bf61c5c4e60b9728cafd5cddb2732c4977d31ea2972568cf9499dced170a1658b150c840c840e1afb133753710de3cb8cfaef087e72fd9151eecc90e32717013ada69cb6c4b9cc74cc51024cd31cf36a03590d89e1ebd3a37bd20546af0f13f9b44beba8e7e857bdc28c1f4877ff347dddd93f81762c59eac576963e0d58c9f0fc23b4d5af6c4acd466ba9c03218bd21d94acd3de7293cc9a4e500e80004c20f577b2ea8e2d84806d2666b0625d63f5ee87f43d96728c079309af6ef32481eed560c6b9cd2138ab3af3da7de63de34d1d0c44547c72d558475270ab41b1eb25524dff965632484d413407e84758ab45ecf4a4b84e7246c5f80dc39ea00033f393e4d174806f4e9a025023b128c39ecf34373f5ba8720354f02402724d6f9d6cac9df5cc67661eccdd9e66fe80ec505e8884b76203721d8314ef0488989d435623ea6ada3a5c7ae319ba6ec48adfb74f8e767739c2725ccbd44592c7e834f2405b93cd3397ce433c7f6cba938d673679479db52cb672b77a91c4d0fc3100dce72f2216c22f3a33283a17cde0439e4633133dda5e622077551b7f175d4db166ded407a6f6e0e0e59ac62fd805185f247b8b0210ba0b72da881f13928443aa5b1dcbd9372e363e1f021fce4b1faec829b195f4842e677294020e8b8bd32f2701929064b1926ecacb476db4c1fdb0d235ec0760a3012f53e45d69ad74a4d08b2d1247d301dbabfe0e96e5ecbc97f73c955969ddcbfc8b7284ac50e5a4e23a5285770c45c8fbd1ef93346982606066e674ec57aa1617951486de0c79c2c08bb2125b2844f0dc61669dfc11c4c190b2abbca865502419f0725d4e6919a415491fae19a7d4c86aa93e0ed5899701c0a8bee7998584dfc80b72bd3d53f6b8d86011a69172dc58eb2cb57f2806fa10e09968f182477dd04b0672623a9e6aa7b998d513b1e3f80b24e0632946e5f39a063b01a63fb99ae78a14433192c05294c28387392c63f1a175bc2236a506efbaeb620d76acb13239cad81846a3267dd56177dc17b2aa2c6615ec6627e06d5144ef83d5f1c236f0763ce30a8bc9cf2c222e2dbaa67cda4ed6e27ceb1440cab6a6deec45c2f73c06ba33a772002709f699be70fc848fe0c4524df710c9e9dc7b17b6785a525474a706e61b2a15e555052daa3c2a518d7ff32aa135faf43574270481ab3d5fc615fe72dd005c3010b0b310bcc1d12f0bc1cba0f1e7805915d8815024df1265575dc0b3310b1133b009cf688fe5e14b65be42b804dfbdb0af2daec673d0cc108ea663cf6f1d724e91e7b85d9adf658bddc04dca66222230a72c127b36d96ce5dc30edff8630119b9979464d66aed0537ea4eed654d9b54de8d339ab4c8bda101badcf6d344e37bed78013f8115bd2ddd714a02aac36f70f955dc2be2c716566fed33cefe2cd72a64ca092c87dfeed2279a31406fbcccbe8bf4c7e0eb6baf675806e0d0e9a487200aaa4c36a5ea439a7ba70aebfe71a8f4d6409514135d64060ba44640dbea372d4d57b7d73ed50275b78d98d29936dbacc0ed3e7dfa594f7b8393260c086d672266ec1dc63a4a476024971b717830a3e3e8f1938563f42d5aa6909e593bd2f727ef089a87b6cd29424d5d88e4e18aa94072fa920ae5076aa79ca5ae0ab177f725e0cebb8131a91df42d9a246e5276776a303e44ed5d94d68ffd90d7892b5ed724069da5a1d93fe7eefc891dd3d2bbc5c970857faffca94427cad04924ff8e672e2e84c9d076346937264e86c4bf4490637a598d20ff21beb9a98664306b8ee729f1ecd2cc10ee42b249d99641463d8992c9b327de1a5cb22304ebe2146519172ffee0496af4993bff7f98b992ee53ba73278a0ad4ea70481fff18b6db9aa0c72a93ba0484a3a4374d42d557d5ac0e7e27b8b15f8b46d19ef03cb1710ccb348253e776d61364840a496899c8c72608258433f7978a176dcadfcb02dd9c9cfcd1b73f716e45dfb755c0dd486cc1a6a5ff478d05098b4e4084b25d484642df9a77293fa916219247d4c24f3008357a48dedad6d37072afdcd9af874d5ad79accd7250ae6311a19c795d661193f23703844e6c28314a2a2e1c0ade59c96ddd16ac721dbf80e6ac0deee2e49afda99780a90603b382c60d0649ab3979ea3d3dfb83525f99d02ac15c938552ae300d213680fa5a722ce74caff8e6bc84bedb1a9f9a7298ce233eec2ad2dc792d3ac92bc9ee6410cb04a5c33802dbf3e3d70f3e8c045c46ec43dbd7ec7ed6d2d30886d2e53c9fae98a8ef24a9f212d996d84dce47831bfd430910c08738f9912b035b6e5222e533d67a4106532c593640a6840acb6572c0db975cb53f1e75c5b1a97af9e8d53cd253e1ef743167b4d1d5ee38285d2d23c14969a21f0f617a8240bcf7c3752d843887c5e3d3f359b42124d45dce5eaa72a71c866dec24017eaa188c26a89dceb5b121796be810a56df66f55ad25b93c72ca56d400909e324aa11d57b5758cce0730a47770bd6bbc7d14de71831f54ce72f5b0818c35477dace5245fc248f4da121f0d5092b1428ee26987a8103799363e027cb4bc40339092b548d7666ccbe32a469ab2fbe2bc9e5f022d2dda0da93f72d0f627b70d6233e260aef00e9384e7253574fc1ff82c48e44e26e182094f0a720d00dc3c42be6ace6a17caa453b80b0b5ac803a92899c62060c7fb9ded1958728afa283abeb2365d0d26d583fdf9a73a55494ca4bff555cadce915ad10d447159556044fe46cb8045dfcd9fd7f52e91908093d05ebbdf8a51ba5189e83b24d72d81d5e5e48947d8de21c859310a961c348b9e98150cbf11b03f20134328e75729ccb626afa5816dcffdbf29db637a0c68ad7d0fc81eaba5e9a4fa0a802ac4a575f976c07a919cfaa1fea12354a5ae2a9cb273de4579fe468faea48c0b6494572642e5d4334d3b32a03df5730ccb771ee063117d648be2b54541332f2184fea607883eb264be75bf95e7cfea2f916761ea7ffefe9785d2fbbe37355cf568e3072b8abeee95b52d5b533a2d1a374de4aefbf464d29772e4bfd68afd21de68feb1b01684987af0fddd7695cd2ee4eb48df0c3838684289493935d5acfa159c33350752770b674e1e4912ec73a0d0020bac8a3a4a4384a0ebe969ac33be0f449e030377fe1d1bd917ae5953cbdd866236c754c2aa370bb0acc418d0d39ed0edff157e1cef7b5d55c3a5364e5e593c08796ef5add7aad88dae196b63c5c69e8bdd272d521065831483ed98bef4e98ba11b125198c4b3bf15d914a8e17fe3e659a880025d6508287abf682cdb3519e5b869337d6da285f3a0b2b1795415d3eaccbd372011cbc6a0a2e5510f43302473bbd9b2c6b52bb8c4d7e96bb9ae46fa39527421221632cc8fd159ee9e1db2590352347f4ceb811fafb13ae4b0398f0f70dbf9f34bdf9307887f4279582b7946830aff473063859ac9e963cbed84417676421010de6e77d7b5241fddd21ca87e93beaeed1e2ad6f9ba17e2b4176afdd60c8746672d967b0eaff91fabb1cc62b18dff754b40131d456c10305d545333946df2d844aed6f93e94dade00e6a0716b9864cd3e14abde3bb6d2de51d64f156d76d5eb41f6ad2830facd54cbb123ce9ed1e75ab23de7b9535f85fcdeb632d609ce5d09d72b7741e504dcf08ca4281341f548bc5f591e1e385e06a76f059cb3c19a167e472870c1775f880e58ec1211604588ab6a0330e564223af237e4942b72d9d1cc85f66fc89e6f1e7236c863ff774fc7fad13b86abd31bf6bfd815e2a1ed36388d972cc4a23dae9bb91cabdbb2ec8544ebdfa807a54bcf31f665b8a826acc08149372f6da5810c990eb0fc3bba2abe88947529812b2f2f0fb391ea54e6e4c5c293c725b74933665c208e9e9661bd8ea14e66dfe1637db310f799b8973a92f6fb213727a9bff0accffc5d2d89a22f7d30a7390caba563100a21476df5ab8cd52835a72ad83205cdca65e3a49980a713c9d6767f7196db7e2283433076d88ad22747972b70846452042d402eb859782618b6f81f31ea71da447032624fdde8e1285ee017b4edaabcd18a71eb2e12e446934272263d487449aa1f558b67bad5c71a63241c8cb64a9879fa0212e44d4de761900ed506ab67394c6d30085529c6f3ec1a1724fd54ec0a9a40340b6c426dc828f923de216f6e680dd8e518cf2e11ce406e4720e2a56a0d1bac6cc2a93300f29ccfb756811f0e7339372112b04e46fccb2787204b7fbec7c0504fdc6488b8b7b55924f05ed6e63bf8ca92327ecbdfd3efe8e7261089ddd684063d777034ba3de7b82826f9cb42823efd17b48d5f32005295a728e4d21598ed504ef083ed305d31f60cea0caeb93135c6108bd4384bbf3afd042313bc212b3bdd193fdde193c4b57ff00a3e52418f5931282112f8bdc97659272eff1377492f3e2fd5e4eda7357b83aa81b908afdcd5fd9e7b69e53da900da8085649838ccc5d480435202d350a15a2240fb82d79700afdb74da1c41a93782b666fa36302c5d1beac16d243bf939758abc9a528bbd01badd9d90dcfa48ab57939c88b71b0e1a737f09aaa6d36ba7399914b6ef8d25a56dbb4b63d56d12de18472c315f978ed9b5612b965e4ee1c88e141868efa86fb673d1f442e4b99e7e20e210b5c5215b40b2546bfb0f6640594865303a3a544c1350a0c86a9753a34db2b1f1e932c00ac587b2e3005001ea53df95ac90d14e2852244f461dfbfee2c49f972e89df9c573dfd855d956a48ccab27e8eb3f2a916018966df534ec2412df9491b73aca0889cabc1ce4b8ea25c28949c0b3b59f77f3fb0014e56fccb6e9cda355296f7935a2b4e9454c471470cfe5adec083402e74121627ff32fbafba898f6672315cd55825cb7d508faf5c8cf2d9f6db650c2d702afd1d2ea9c0f92db7719b70cf26b61b6c0a56d653daf9d0a2ee7a59c0291959ed8f6851ed98b04730964029d2277f95ad79be694f76a7c2d4692929ad1079cad139e3dedd4128060efd44578c513473cc11aaae9f643e34c61ae1f310a9f13d6493715725e37041e43afe7263ea2e96c41db50a41a4db9a164e1f860a18cf155a7f77fa51ae17174da7ad11b2317bd3ea9b2723b009f82bb306363852a4c3475fe4cc3f2885a1a890a0953a26b03e2655b5c1fdd2226efecf4bead99f6c506de550ad6fc627151909e4096cc58b303530eac0197488a4ca5a174fb46cb250cc7f8d667672d0bbd2cd31ad5e3d07d46ba3ffc2ec697ca75f2d978d4cdb382db537424e51e4a60d4ee4da2a601fad62090e5e25a8698b60e4c4ade37d4edc9b714dfc2d7d77d59fbb60da065a679dacbbd9c0ac9590e27f51a836e0c090bab7f69c418e251eabb7c3da2be314229e28329eac8c952d88839f00ca59de05b17cf210a8d20528abce4c0554c8725e6374bd0b1e6d3b6713f89a41aa20e496d027cb259055534289ad7c44055e220f275e3735bd50f091bd49b565be7abe7cfde3fc34d6c2923e73a1c3a15c4a72f4044ecaa6206cbae0d647c5897f5e4fa1f1c6b918f5c198ea3421e54fefa0722c5b492f33f4acabf825bb84da1161d431fa4ccef7ec02c86db9f31a0f1d4b6669b086bd1eb16aea3ab301b34df45700da94f493df6a5ac1f12ddaf9cb9275718ccc9cbb7ddde8bb0ab49ff6f289b5fa0c638b8fb54adad36dc47f58e6b34c72473f911e7958aed99492ebe2c5f3f521df29618c05b941426b155ee1179ff072eac9147a532f95925d15de76a04742a11026d230ff3cdee15b2d34d622b5312ca73b65ae7452bea6152ecb6a5ba3d33e6a40c1583021e67250ac94e93b8d2872ff52c74a4d6b5a117e362e6dda746c6b12a8562c4a9a9fb373ad8f7e0803d5456922986b5fea33df79475344998aa5ce10b7c765b30b7b4c2e19b25cf196985aeaf8b217f7efb87dee1fc6ea51e146c52ef03e65c25b7aac5ceffffcd26b357206e2b52f8e14bf611a3d0a7de9da302f9d6e5b159a49dff4c1e700ede4527c7206b2ae59ae8416437d5496464259e56edd0a6a3427d0df5fd83b363d166cb33294e16ec2237b0a450a959389c44d990c5fde6a92b4083ab0bb8ff999ca7cd172c86a47ad4bb1ff586148729fa35e028179bf961973c2de9120aefec76e1073505c4af839d2d742807b6da67b4eeca129cccce1612dfc9bc45047de04a82568715fcbd1519f368296c2ddeb3f4bacb7d58519b4e80be853f00bca6ae0c3a49b52209e96ee4c02aa15a64583a255a8413f5dfd27e762d2a54189b5645585bff47226ef09a48ebf7c77d454e1b4b20a5044714c50a0028c96e8e839e5531c3a4d1073161ceecc02f176a19666f2ff46f2388472d36db9421dc924fdcae7ae88801154843616f8e63e0b5538c6d190bacf50f2f60d6ee67d74ceadc72c524257ca724813fea3457cb0a8c9fa44eb4a1cf4e0e9ac8f4a45c390e961590a6922ccfd7206fcb77f82a3ee494df42a2dc5cd05369d2a95fe9f05bc5a89444bb31790c12d679010937199b67398a998c5adc6cc37dc4cdd2958b0328a9e73cc1b79937c729c211c45ccfc970c433b0ca8f8b225533cbc8ee67b6af8b5c8d92e4684b5e77238937e2d03679e6b7b4a73d19b49f801cc097fc15e5b3ee1cb7d9b2520057a72e8e6d52ec19e063002f55641262a564cf8b609190ed590c48c954765b83baa724380a861955fb28de26f6e14ffb6fc507de32610397dc5de3952ba10e31f6f31aa9f8909b24aa0fcca49b0795f999402d38b1ffd50ceeddccd6383a52f3cf172fa0b8e4603042e77cb9c6a3bd8e30d387fcfd05e46e06d31abca18f2acaf8b6869d893664a2ce47589fe19bd413900d9131bedb364ee07ab42cfc8a4dc23f8151b4d66d80a7c6ee9b3ac5e449758e315e87ac6aa2bcd48d7a7ea61c0a5f6907298ea34cd83741f2820873d4614074c473a5163b7db4f84bde5a9d81a4b000472e332ea49f50a450d84a18120a1a76b430f1f50bc2714b4838d02e8182106a372ca5d5a387c45e737c5aa3c4005ac9e0911d8add51e77814862324e322d700d46eeefa4ed99b3cff2be369503a61b4be038a0259d97921fadd40afbf798139e079dd880f9e120f26c327b5c8e0ea91fb9e96fc7ad86c50587060864c3b53a386f2f537c44a2fe9731d113afb112d25502da12c244f4a5a537fc39e9e56c1cff20bd4c8c895acc42e843c855c83c47a9b45a9335db961e0a4dc5173ab442561f72675e060667bd9904d63a79e78332086e195707b1333c82cfbeaf4a6867970f72ee39235e503986940267d50436c46a738b485da0e6f5777f974e1271c9b6cb339d94f51123c43fbc1fad24ea4bbe4b5cb852c3580ef32a9c797a3f16d5f11312db501addc68ccc65c6f84fb6662bd89f2828ab145c2e1f6699e32886121dfc537edcf717c7d696568f0f22093680a49f54536cf7c87bbc959e2c8cac4fd60272bce65a4692685e0404118eb24470f4742163ebcbbb9d586c3de2b421546574151cfd25d7e424be81e43b1383bb02ca2a39d2dba341161c9978051d5186135b72096d7e6657303d4033e01bde8bc0db26fbb2fccf6896ce7862a33ac94f6e19119c3178b85927aaef0fab238e7dace76526c8377a2757bf03f05dcfc6eb74a643f208e27e756bb005fc88f3cb2b695d5ff5fdc30999a8357cd09c434b4e210d722efe435a4c908f7c3bde0c5c6a80d5fdaaf9623b9a3e024352770a1995ea867222b2570be2b651a434ddc14019932e16454a27616e06a23392c10506c70188044e237555447de78f0fc5a78ac7755dd540b9b05acea0cdb42ebbb3a7d7209a7257aabb0d82f796cb21b37e34596ea9a0fbc47314c132bf0611fb69bde7c00308c2a1033106749d2b1115a52efc63412da3f261159a58bfc373a856222afcc26fce3d156d5848a455e9da3fd8c740089e3295a46fa77529a3262bdea6fa558c729c09e7c81d4dd480d9f7038eab2bff7a9e0adcd4e9505d8793c665923e0c2157ce32fbb89b1364a602b37d95a35f0e9f7f942f8fe233a18a0f3456f42f5af92354dfc8aa4f7d16cc4e1a3e7e677c85b63d1008cf638f90968060f8dbf8a21a72ecc240edd5c00d8d6ad08d38925fcc38a181c6792c20ddbc809a2dc0b554f172d9d40fe15a75808e2452210475f0bcfb762f6145e3823bf8b505915e39935304261b030bb995662e3586333df1867df17d0be33996d31dcf47ca2c67fac2b65cdba632169469a261ae18c27a9a81d0452e821b9262bbc0376a3458b782066e727cd5bc4fd07db8b169dc19c52b74aaa7f37f5482f679666baedc7cc7fb07a172f805c63bc7f025473fbf63d1c8b5555855bfc0fda6442adf2cc0b4a7eb719872bd9e417a959fecad51d324a3047f995d22de1f0cf2c9c0f212b4dd2b7bbd6e72c0b82fa81660b20c92d5e8392b8e7f7d71e2237a09d9f97c0248bf3c28b9e072c996eda6bcdc8a7f4ae8643934d1c6141868df1cd287e80aa1e585e8a014367236ab8c4d7162fd894458f96e858248000a98ea9fe42e3ccf699aba721aa35553b812230dcf7e404b78671cd26a0940749048b7d906039855279f7a32cc3bc77231ce6c6793f89d71d3d6646d5f30eab475382aa75ef65f8f0f0f73023917b71160fae3564e1c6a261f28b4c31268021925e9313f7a2be2024d7c32a41bfd5e72b8237390d5a24c4dd91bbaf15509c40dd648184a4c85e3a128599f37ae845f72fe18fdf14d5cefbe8c5b2f77db658eb1373624ab9aa3673e19bdc2289926bd5c8e13c30c11318e9fb3c004053ce17ac3fd7f3405ed8b10c6031076c67cd59172a8f3c24cf0867bde69bd26e31ae15d1fe05681322ddc7d96d14161e31a718472264356fa73bad554c9d6dfff6f1887109b427c7707b16be6a35fd03a06370572001a4e6fe75b88d6fa63e15d7fc10895aab97e3b2a236da36fa76144e72da572c6bf331e2390eac9a64d1576131b61f6dc1fec3d4afe96aaacd0fd89ac4bd91649e3e2cc4caf1eceb264f54b2d14652836c0b0c2a3f28958a7c9563912abce72cee44477de40f007505975bcabc870cc94b1961c49ecd84725f8be155eaa0b526258a34997396f11a8564c8e62f4b4036409c6632cd8869f827f993d10085b7227c3f9226a4e10f12c4be2644607ed542c27e610bacb7117afa397301c0c07428ad93cbc78dd34da15382a7e6943ad6b60ccd1d763a901183028d341a50f096d299f5d4b840e084a59d6b2be17865e773fcc2033c2e4272998e0601409940a72daa7aa4b78c4e4f98c561074e6c1bc929a8499201fd5827f3cec34d04df56e72f6df9980743e4fe07758399898e8365f1c453f6dd8aa7c831b7c0cad52c23f6b11b1419c61adf49cc1836088c535dbdd4101b25d4ba1b8397dff2c038cee8f1122486c58304d7dc79343cad266d8a0fcd5b6989ff2a679f58ade4aad4cf75c721f35e6509af5e622cc0a86abf0883b3d23baa5e6e7e798e7cc857c5a54e57d724e36bf8f711219e36fc94cdc8f454e6e292096d9661696edc7bc889e67e32872246656b771d3750e2726781cb4c1d99b1acc2edf40a39dc679ee076f98c1c54b8a67f0783aac2127da5b3dcc30bc359c946b998c8a7ff933719b2a418846ed3fa1e8fb60e6987f855209a3c1b247fd2c936fb2d9ba14c0c060bdee580c765572e1ccdc224f940e7087f4d462f8e1a103f028c80a7789d3ceee78063c43a1747249494e38de8a54bda3c178df663844bb9093c3a4d2e58211df6409ecc76ae4722d8edf1d97d07530d9697d0c2f4790bbbc719bd334a2c616040773a33d8cf24e09e4c138a678bf67df11c2f0ba8a545b410d4ffc509117755d35f73a30135272547813ed4fab7d8ae2269dda92f46024c790f45bde60d1217b8f6cc1744cc27234d5da8b0fcefc3488b229f8445d62a0e09c6ad85485aeafa4f679d48cd5a85ddb90002979b41cfc49f03fa2611fd9031bbafa4ee06121983383cd5784ee0f68db537e5511c6874aa5c80b768b2952af57d4f985cf702068efdebbe442730772ee76dbe8639e331fa7507027b2109876521a2db2fca42e5f742f67b96649d0319e6fcf3f7589498fae13550152cfdb62d18326d93445145416f8ca03f7b3ab6d4047f5432091f1cbdd915b9d3591bd180d01e4fb259e5e1161b21df77287d1234a223c531cdea485dacdda58ad07bea24bf04e607ebafe03fb721ee5efca0e5e183d57ddd5cdcebff4e652cb00a2687e492795d39ae5edb84f3a0189ba1c1972e858416fa32c51a3ee0461bb6a6e8fc45daa12b5d51de981ce93a2ecf081e9728674b385e274e77ced08a6632eff5a9faa3032b186494e2e759a038c1eaf391178199a12f445ffa1bfda077eac310ab73b3413a792432e0c6fe28b45ea60f77271aee00dad6662601f4a77630a893a0b02acc15b042cdc0a4e962bfcfc08dc337ddb126856bf62f1a09feb5b679707e277b1f8a4b37b92f6818f619c6864c60999d935d4820e0ca0f73002b758a30c8fd2498b81b85902c6e7d3ec9b4c28ff1d54cb0f9fe2c7d25cbbfc8c46f715b99aebc41ecdcc66b960da7af2960ab0475b2296b973135376ce8c69486bb39e21513da3163c18079cb87a07607f26021372f035a701cd3fa1279099bb9a5f1a39f539fa82d4fd581919b7d062f3bdfb3072140218644b5e29c67efe5949c945f4fdfaa3451f1f5829d8b1b74ae03d448272754f3fa1a9305fad90d5b2f679e9360c6a36f92f6912c00ef9a759feb9ca037260354cc93a7ece42f9138912197ef93049beadd346d460310c18f9e22cb5c85f1f0ba1d5b0f398f5deb79654cdecca6711573fe54de543d3af00eec731d6b3722a4a325de0eb12176b8b973ad80ff2726983d7b914313bc0cd3457dc0501f87229ccf8a41bab38859558a50734a175aecb074be0d6d0b9f6c6bf9f2479c97001a1063415b3c6bc04b53d2125f419e5b15bc612732b94def50fe8f485467f7a7201c1ba50188569332434c5783445fa7b7e4f52631ede01a55c2bada0eb9a760a5bd15267817bb1c75be12391c9146a77821c1eaebca706f0b9c9cc39718e8132ad5feb600e722616e0bc4fea3393c6ff9dc4ce668c569cb4c3447916c076b5726a80902c45c876bb35f6c5ee2a5907be3694e3f282df0f5e96ebeca1146fbc22c348fd2bb2f847d7a4f3661eeb5003b4d2ee41173ce416bdfe90366356734f5c1a5d23d4b5948f2b20339efe1846813d45dda122b99031a9b6efdf2aef759d681f012c93ca079fae9410a3100dff2a3b51913b99c17bf5d8cd1d27367af9ff120e7ea8a8f1f3bd051bb50a0c01662c26343f1d6e6657d0b56fadf35755bed872449b413b05ac509e05bde80bd8d03e41c6ccc140bb4bb6b700721a682351b57213adb3eb43b1f3724d4b8cee4e1799d60b4de5bc000e50edd8cc2a54ef26090be5346d79ec6b616277c56ab7fa96042366e59de51985cc8a59ae8cabdc352772955dcba5cd5c9b2c5887091726a2ed801f1659c3d2ed06e0ceefec7ee403602ce2a41b5be1808aab5a215baf720efc49136651cdf324ebb8776cf7cb0f0a9f68fbb349b613e8c0325dc4bfb106ca4d7e8e9378d94ee34e0372a21bbdd3dc816f0c3693921d35ae2d722bd79339c25e58233a3e4327d63dce7830e14e490ea7727dc4c0a04372654fa1c08419ceb0130578d86f32d933bb62cd79071222a11d72a7f7fe0b24a76f996f9f744055850275569c3407c539276c6867a4b7d4a76972dab49873e41aab52e2614442fb822b2ccdbc7931fb3f386baa77f057ae7a3972ba81183bda16f7e450675b4f5cfdb8f74c53165d01e345ea086045ff6f7a9b72118233da963d0beb3ef92532291ccb57152e3131b1332cd8e6b222d3c1315e4babc2cd9445665faaf6d4a579ff6c29b0b5c577b9c814e37d4124433e8c42e3723d63cab0658d5f22d5921163ff796777b548f6e39354a058a26b9fbd40fc8c033d9c85acea68de2e16c5257f463c2de2655bfd89229dc428e4880a606921aa72ab362545fc535cb015e8f5fef6aa2e64327bfc606c19e7dbffd3256be7791c72fa7d4e4952818cb34c6c2fd8d1d631adbec4762568718d1970c7d5dd17029072083b0da089e24f10af94c35a761b90600a1bce434725f925ae17322e7914c072ad1a1b886f64e8cb0896dc0b1a71ec03b9f31875958c2bd2e3e041e733e20e059a0e7e356693509a778c472f508ca875ca664d52e0482958f857e0937268e5501e94319416fc311876dff57809dfaa3981013a04c983d940723a88c5d5b6180ef7936d1c1ac41e5f098453658c5d3670e7abcedf039d67946d9162e74b1fff2d0235c208e131c8103f03f5a1840b4e56255e4f257e4b7de4818858eb3983870f4a9b4ed7aa9042ca99388e7f778d986ab0330066dde1f319e8ca82d8c9c47972c774632d4c721251bbc4867202a935636011eac6caf3cc461692c0b1de5be2724ebbf7bc7ab81795910429a08ffd84a09f69ae74a46427ca0b86193d87a47e5e68dc995468ff6066bca5dd2e6043f5644b0d5f8d7cfe362f7f0609a29acf3472ca36e56bcd5e43aac1fbe3c253caeb6bd1556701840f84873efa6f84b2fab250c52ec87251838504b64d4f2d5b8da4749d5687b593f346f6f7cd5063a8e01972affe4668264823a95aaff98827d5469cb0f825c03a4b198520cefdc8a88ca37283044ded6d889e73df148b360fb99ffb77d0f00e9a51138042e44435e508da727924882babf7d596344c82f61cc46968f042d504f10be78bf284ababcf557655ffb7484e0eefbc13e7d02bd0a0c0bdefb596110ad531db4536938a81b9fbfe72544520e4e6c715c2b1591d66e2734ac8ca1431b5049b93ef035db267121f426dbaf8d33728b3bc019af2741a7fe3a3f2f120aca785a70b930690f22acbf0b5436b7316ea6cb42cfd4a4f2811bdd7ce1dfb006c3772948ae5b2c01478edff841f58cdb985f8d385e5f3e278e089d192d227e426808e6d8e7c24e60e3442c43972ee50bd2f35db795d5efb335d9d4ad5a75ca60cef0771b5ea379a9a2196d1ce6b09ee66e766fdb1d1bf2425747e7835ad770b7dc15937a4a2d7165b4d8a93ca0ba6e970c3184b37b59f42b50d2e2dcb67ecd71c2e0efa470801bddf651af47772c159bb97a3f481766a12fa29208bd900945f238dda4ee68815aa7eda4c9a00720a2ca8c11c77426ee45b0ff6fd870153e94292f18a8b445cd6f97530ff6d6372dfcee6597547e5702512bae063f6386f2ebb1799acfbdde8f988d91ffdf2c872a6bac4bb00aa380b1e88bc4cfe485f2874388900d201f6b0cf3f99d02d0cdb27401c5e01bfa89e19516512c321a03f6c88c06db503999557052b09f223aa6537b58b44b8a25688c21efae89f7c49bf6173b77016f8237a3ce235369064771a4da10d92bda331ce5314c8b32ca70e20089035e184a8f44c368ceb56d94d18b039a51edf1b789671b7f24cd08ecc63243b3e8c73a21a450d1a499d644c9d7a056d2e69544c3bccf01ebb8e31df22d325d9497a4c33b4bb34c9b21cae0fc97e8a2eb96e6d1ae35276ecb484eadbf44b4202c633ec67570f29f79a37488795015772560553e9c5058cb50fd4070a4ccfede415022c910409e9247357bc34b4a82e728162d9e18f062b9abc8e631b9075b7f3276e6c21f10eb504cbeba3e8e45e4d728614f26239d5fd6aa10b29a9f52cd8e022f6201d5db46988fdff16219940ba51dd08e571efae5dc5ee2056122696d28c16c85ea67147bd196ef1e0117402b44b9cad6c922a6a9469f0439dc1f613e3f554f966d810ff89f3343a7113c3967a0a4fe5d50d81e2042cbf754d434f2a49b968ef0656cac188a0b1165f0f2d62af72a90d8522e105591e47e67ad82c3ab1f5442ba06cac92d9c08796334cd0ad9203cd7c1a38f781d8cd8a810604b005312ab8ce66a620dae1bb9c25b162e21de655edb78ebd2ce4c165bdde6e110befac6b7fa69c9123e01933031e3a5ef5faf2726b6e59c8937f81cfef44a7ed09388f99f492495e8d24d938025ac3f614215472b50ba102ea1172288c35a76dcc68c8faf0df374c4f268fab2f2e054e19f0734fa48cab870585515ee52a138c68c8df4e0f98e2851dabed0ed9254041318ef764ca33ee7ba51cda63854d450ba0b6745f8f5e66523cc1ecbd84b47a621a590e72c4fe7e9a683acb8b0f884b18f78fe264f4b60935baa97a4859386f6269122772c013817cf6e4bfd2c3c39b4bfb9f4cc04e7a2dbbb8e6bb518fe754e30e9bce7228a2dfdef01822448016c8aec0f01b4fd3a7b78e72bd6166ec2e1d43b95e935a9eeec1cfaca08b8e6b18f8e227b3e5e5eacf315e67fd39ba52f899f482935f72589d757142a1de11f8ca394743e66c15421f93b13e3d061b8e209d85fd5e5267271acaedd8d9ae9b17ce58eaed9664606e8c0bb49ffacfd19a5e208d6278ac72cce8a36c39d3936b008a501152e733b2e81cce4af638b83f0bb97b93b369335f66da5cb3bf6d4c81946ef554a6bcc529a9ec34a8634f6e76a162365e61b214720c0e77d9ec3d2a0c4e8973765a5a65825017ec286728df2b81a9a56fd34e53728b548e554d4397ec4711630a09d53511b573081cbb3cf5584075dc70175ba80e45ed8a70df2ec101c569b136ebbdbe2bcf73accd2cc098b30e4f0d0929466472b3957ad19e09fff940c4811e2ec18b3e2c677141a7be5fc06dbb6c99ffae8e3098089f969431ed043ce4a6bc638fbe71d176e4c6c46a22bb2bac6168f852d172d861668caf08fb806da53b58c33f02291a45f083b01c8e5817b55b48d6c36072869046386ddf28bb31f4b59a2423357e2507e310dcaafccd2b7495dae05ba77297624c4750eaf5effefef72fc10ce389bba6961073520f1e226f3b4404a01372c2f08a9869175200a89954f06923ab576f40100a09e141d1b434bc77aab5e072eb7a19fe52423755259eaa44e0d1a091495da323d0cef89176af24cff3e90f72854365d4f6f2dea34bcf384a287544ca952f546f59ef6dee38a5812b3bbe264b33d54154cc5c7e101e418f5892189ed307b92da6b1b42d365857620105585828757b0d67120a519b7b31ee83ffa71ce1351561a36e76cb4ab729fea6e5e3e07287b03c198e446693eb73c6cb30deb831739a6699a0c78f114f3c7c743d45287252192815e28075e2eab91a07249d5a5b7da689bf2ffc67f6ccbe5733993c683981ae9649c5acea0666b3fff124583b6a93594b07bee8474ae38d92ff5c49b1727ad3ff79ab0795f520eff09920976019b1dc46d471ecafe77b9001dc86dd1672c62e7fb553d72f359a095c5aa08be9985d84089fd083834c467ab4c3820b5e64ac73247f0b20f68db30442ebc578f4145f06049f7e864e77449b909c9c6fa3721869382cb0756d97edd03dbdb503b1a705613b693d8826f20e76b37683085d72fe87aefca9bc1f7e2bd3757d999022d73dd6791222ef2e1885a8d8dd11a9c63e27fb1be4601385ba67429fdfccd3c0e0c85be9e98157aa32088735ecac6abc72ace2be312803f19ebeabece23e0ba014c57101a4eb03774ba2769e05017a7d64ccc1b61da4025cb3afeecca62b1a7ad4ec70c96364a444b8cd65f0b5befd3d72d748c44067ce6535dad690d2a5020400ffe6b6357a3409f532a1089750408070742bdbc92c2a9c936196829bbef1cd8adff014fc2b8fe99bccea4e40c394a0423f5e81f7cc7adebe56a8e8f45a24e3478b00f1fc53e5cc212e309be69ae3e12bafabbc9f52eaf5573efe2261735655e15600b3e8471b46345226d0dd013a6c5ecabc12c5e3c860e7b6f0433e59f92aaa44cf7eb7be224f645bfba27e61efdd72189f2b5277c16b5ad154c447a6a729f80495c11d288381bc347a4d7cfcdb336eb79af457338319763338b8adbd54659c17787ee67e4e44a3f89371909252b672afd86ca1f9a8fafde131617913799d3276e5769bad492983712e83fb5003da72a4f88694b3d540b79b7661e960745e456b6fd5c5ad75031042759a3b94f6d8729a84dda254388e48f8ff9ce570de8c02510b58aff588969f8f53e1e8cabfd7724c1f1787e71dff4323dbebcf8189ceb4d8c966f68f81f8a630d5b3f144dd13112feb3799dac404a5ba5a0dc4e36f420167b9726ab511180001b514952ad544423c606bfa49a176165e5c6958754a4e65793504ce4c29bdc5e6d684b213fa9e72d212e9524a0929261e7f5cf58aa3a3afa4737441534d119a8fcb1dd85c66bf72f5e59b863bc1436df6944eadb25e56bf0ac18ab25e98399e04a4e7b79d9c8172c590f46b829cafffa971a85c75a25f8f366e8d6a83654c587d2e18653e7f852f06cbfed0240a81bdc27d207c4ed2b1649b7040221f8c1fc83c8b0fcfad3e490ba896b4fbea874da3ad19eb992a8dcf6d9f32b620f4ef9699c8b7b7930ef07072a2d28bde5ad41d52fa807b94554d3bca35486b644a3b1aa66bcf5001e3c74209261a14a5367907be7f9d4ea8a59d3a31551d7072d482e9391d3618fa08395b6e72c29b7c746efdaf59f7f1a31455e54e4140c7b525a9662feac994ef4b43a3154503f7d5640027801b64d83741405f30fa3ff4657c48fa9252814fe11ec5035d81992899c8b409c7123b986f5d64f6daa6f5598fb185af544a0e2c25e35ef60be5e020f1d2f8728a8549a2600c8704f5a82e3dafb9f62af564b47a998ffb6e72ebd10acfe22363287f2ecd8fc97a8b89033bcb875d82e3945fc6b5f58eaf9f72546aae6d5b2a20d2169b5dbb999c12bbf88f283fe1108e0d8297cf80de49db0db002e9046e6f7bd73d8a76fd24db97f69b5284d2f3db7573a5b893424aa30272ca3ee6444f88c40f9b49551defb6c91e5a98b0d2aadcf97273cb6a2fac82567254e4b49a93b8e76410d434107021fe097c82b9ff0e0de888abb16d70d420ec14dee92994df6bed915641805ada4a52579e0f30c532d1109f7a12f257779bb1720ab2b169c7db0ee42b6b4735210431e8d6218515501c2c560cf36300fba5e1727235e23e51b9b032be61bb382e0a559d7195393c5b2e79e87fd6fe696944a809cda7f323540aff44138807a8fddb2c62927c7866bcdfa2c190ab20bd9f39de72e692457ce127f10d5246db2a0d3fb6766c04bbf4b4963d009d66a2aa73ff9822392c932852466ff284f1907b25ebdf34bbc77ac0867fd7c3f02db54a9730360c0ef6ff6a7792463e0d47d81d7fb20cffbfc833b9481e8fc68e056b860e0a517291f9b2261677484d4e3307f325d1bd797e010448f54fc9a4046f6f8e8083e459a03ba464cd868ef6d97d66b8045492db42b6d1488c5f87111ee242c66c65e6721f3657a082e697180222026bb9236279b0f5f50d5a881a1d692fa199d4e714726fbc2c10a998e3d8bd580d77049eb46d23c2dd232e8f2d4c8394146632b0a62a6fa0621b2d0104273fdc9d3a8024d8eaf2bc6cfc93f5c0a940434432da17d07247ebff11115c8ea4429397d5ffc50b9fb59d66e15370ad745721e98a0821f872b91d729220258a4970012647e04fc3c47de2a560864104b770bd5e2bfd639340bb03374722e78e03d202ba3e7631b5191e67748f7a09bc212811e674a8c11b1d72692510af70347ebf0552e2fdf964e7d0762d54339874ba8e08474efe2ba972f03339611378a3ba1933bf2a72f51368870e3adcd84ab81dd79cd7072da77c72fb1b76a6f20bb6fc57e4963fab47043ab8badba8cebd6ef330fbaec1c6fc8e72f988cc3f9194157036cdaecd812dbe6ca1481375dbcb9dab0031a00b45855772d211a3c4ac70978f0ca80eee2189d84ce29caf533c1071b042169c148dcccb726bf8727183e48d87b6b1a0aefc3cfe4bbac379d5e9e901a5a862cdae55cffd725d94cbec4bf82f7ab3c58b739d3ea8b5248a221c5298fca9c0f8019dbe5470727daa8fe38297621c49137d47d41f00154c787661f1c981fa958bcc8685437a72cbd3d76841d8bdb2f4d0b412fc181435dca4657c3abfa4e049176debc5826c72b5522c33300376a8f9ad1b353c37ef5215a9feec452f40d1ea26b21fda44e37294d497b3ab48b24ff3fb8210139b0984125411021c3826a7a1ed9550af6b4572f4bf62a4df2d5edd0a68a2782e7ecd9932b91eb8c4024ea762e33aa143cb71727225abd4ab37b01d483673708fcad4e7b8216701a02e6e1db2f81859a87fd372bf4400ef67758a073092fd9c0b27fbd97e7ed84e94e5abf3ded896c634589538cea0722e18009dd3e587bd6d3610d9ebca518848a04bf9631f38f385efafd0177ce49b0aa763ae25133310589be976f7479dee6fae06bf2b6038d956cf422323ea138ba5f6104cf61853f35e35068cbed751487ea12eb96341057c39525fee2b5c196b651d6b269a89cb88ea1004dac86fe90bd796feab18cecf194eea7ea1722a8fa63dcf411e343c93335d7846714342226f41c6b92d3391a4be91522ac92b40a1582164bb2819ac0aeb237a3fffaffed2bea4491efde8d360f8e4d2ada672d83c2fb0e72aeaaf11bc74fc4d7c6de32b8bb1aefc7ede9549d4ff8938b5d8059430cb3c4569decb95922c2da8ce96316ab4a60e7e3b18174834566d6eb2ce72d59b85eb44e2c77c73f9043141ef1766fe031bbcf6e7b6586f87a08272c4021618ca6b81d7eb21a7d0b98a20db0984a302da8d700cb73889dbe75e7261775b0151871b0692c57e4756b65ffda2cc96cb76d6c0502bc243b84b692355f2bbd211472b7274a2e16866b0d83c565ff2040dd41ad4965624f3e6f54e2d92118e1703a0024e614a463eacc0bd7e6a87fa2de993cb4fcdb78917c1d41543b816dd7317bc5b4d6f77c53a84acc35fba2488d152e12e14b1789ff9eb0d1e54642e6d8a6ababaa1660d32aa8ab8fcde8da657de943dfdbdc763b02ea0be19e340c94ef021b321b3594a30ff87b7663e589d30075f1ea874737cefcd643669d92693e51672cd7f783ff1b88271b7ed1a80ea64fa8284d7fd9512247138e8d44faba0a0f620671cb0fc8d43a18e46bfbd0f23ae4a4132891565b2ade0c782b3996db68415729987408a0402dbeecd71342530e54bd2de7cf4b0e7246197030a20c43cc31831966ea69d31bdaffed4c68cb115726565925c6fdd0a939354da5c263ce8d61c727c8750c9da800c66b4b468c918018e1c355ecf8d6732e3b1b212e3b2d4125a2113a8e5634a61ad02da52c690c83c95fc07b2f11e61868c047486ed8b14b9cc725b8499caf9bb13cfbdb47189fbef5af45dbd6a80ce77b138224e1a25d40c70680cf308c5b44f4f3ba965d6f9eb70611846b65554768a861de36c435917dee47226ea2f88ed409fbcc9e44420773404539c1999feef69c13470fca6996666834ee4c82fc23a133e73737d0c47284d80eb69f648730103aa385ef1ca2c72519d7263faabdb137826b9324d4479b38cee6b392a5695614defbf6de1c21a4d8cd94dcc55798893aeaa6ba3a0de952a931a2cffcae1dab287e1444b139476114c4d69a1f8a6b33de7780cc2d204804faf671f23edde9a55a0ff5a245eac92560805121735f6c3c5121c8f19bbf786876e205565736390ef442437ca0869bddae09372bd51731e97d271712b0c74ced671fa08a89313971c543ce674afe586dcbda6723915dea4186c3b36087bcdf835b254fdc3a06553077e42c9276d894aae61eb7269d8cb0d63d769ebd2771a94613aba3aed9c55a2399c7f0c8eebefe24953b3116d48491b4afedadec3b2d4915f84e553a2c8bd5e0e871c96cf8d172b145f70728275cf2deab6d54a55cc4202676414b8d802924b2ee7acee25b95eacf5eeba72c46d6c9026bf7f41b8c0baf5fa3dcda085bf816105c90c5ce683ed56cb07b672a365494b8e307f3338152f5a62c37cb75df7646d2a5b10c70014a1f034a768724cb09fa7857b34de9c61ee953828b51014b9d8b5a4a5654ff6cae6f13cc82f3cbd53003cafe534533ba276161571f09dac45385e1dee36740e7b52185df92772c10481bab47bd7df8359a68f0c37ecea4166c2f9dc0a2fdea8f5138837c157237a2f57817f818942adebd63a294b3d3921d538a61a2445349ab48219373150728d7bc1fb9da6fad10e3108e98b6e727a20ff0e656fbbea7b4cec2f9987f5fc72ba53f1f28596fd408c240c33752aee6697238bd64aaf141577d7eaffeebe607214dd85fc02f587b7e8feba4c0e4b8fa72e4e5f91fa43630322c7983d6572fa5cc9e80738bb79bd2a2d5033bc5426c80ea46ce5dc052456df6ac7403eac580572deb60331c2ca9c9afbcd7a40fc3c1c5f79c9a153aa1a4cfa89e767c57ae4da724482715fa25df7fa43078ebb1a32b263b1881af48b77616ed3e0d0cf83afc3728b9186eeeb55fa023a82031e03a5f329bdd2520e49fba7ef1f7870121bed827288c453ded215a96280f8c869d55588248a9d09c6890d3b22bb7ee0e46499e67224e927ba4c2af65843b75a70b65132603a457039d427a85b0a82408db22a2d722e28d1cc9a1b6929316eadbdfc060244aba7402520287dda21f5ed777fe8fa726504df10e9a2c48a3edc9de31a8c343a24039bea9f0fe0be31cf3a3d153c2e72a260eba454c0076e3f1f7d40259278e0d2d3f3cf54c38aaf848b5ff1b15ee525fd6b43f8bf525741d5b3f86c80d99def949ccae834b7aa9f7c06ab06c0e8c505466ad717d67430d1183957344d52f713f43989d03c7bee9e437239c269664d14a6ae3cb1082759c383f4a9f839af61912ed129917f689494acd67a5ed944cc3c7c13f66368864840f99fca626f48636a046cf1eab1dde8efb6cfca3316c68e72d3965b254c20c643e2aa2e0064cd1d3abe44638d2b4cf6a5374b61cbd8479a7253994ddd8d42855ae1ab19a7607f521596a0bbe98370a74b81ad501dde7d5f721f7ea0641b1ee21a8b27764f7ff6c9854e46996d3edb5883ef7ec4bf2c289137ccfc10a5c1d950f186e8077a68c4b0701aee39a2489fa4840cc3aacf2556c372f6c717220e002f7e3909e96c710a2f43643fd681bb201a6d38fe64a4df069d7297750d78d75e4cb35bac575ae1028d47425a3a3907c5cc3532d07bca997fc072ac5a2201aa3d5df53d43d3ed2daad5d14d84fe978d919f74ae99823d0b791435df29a4d9875014c971d89ec6d3eba13d4efdb5c11b0eb4a637db3d1668fa2472cb45d378ab2ea6971f6189129e888d63cea7f25a4e7c9f410beb426ccb191372cd39a8060fffddec0fd770589d96a35c7615a2318b0bd9e5024d83e50029b00ee6ad152989672d0f20d337c43dedfdf0dd1c70cc123f2dce908ab5a5aad81f32750dd0bf7f306729cdda89a80d09dc588addc73e98240bb28cb53c675dfee7729445b1925f42f23026dcdfb91597b47a6a0729f9e150d5ceb0974c2e1ea71d0756323138253b23052b3707e9f10cdae994783334050841dd6044d4d6c4a018728568adb537c659c56c00517a7af4e24637acc000d176dfa3a59b328fee313572dd2d70e700536ecfb437654b35fe18c3f909ee6608144c8de0e99f8d5a58dc7213385453234f3843d969e7fccc12562baccd1a0165504820e5fd2e4ad47f233941e3af645461db7c92deaf3ea4fc6e00086bb53f7f84f9fa1fca8e2ba359a2724d11c527224db5246a3ef899d0aaf19bbdcf4dc11cfc7f017761f4ed6521bf729146d572b268539b36a8481c0832044126fd595e18e1c8343cf434e5c7a0ed726a2e3ca99907b0242e46403bab48cd1528ea3377484f4b326e3ca1fd3c0b2a72c2769562f9a803fd5aa902441057969c2eb136cad87adc3d5bc3e3f8f5ba4741c607d0cf99d20ac318dfa7e9ef317f71a08ead3aedc8a6ac11656818f248925dfcceabd6818d822526dc477a1b61d2fbaedb282358b7ed42a95b538aa1d99c697f5c71777e0a8b36ac9566ab61f97782c812a24203eb54275694c2a382acf27250f4fcf4aa7d0c203d0dc525c401b210355c6910fb754d67e758b4db8c30bd581d4e97f2fae1fccda1c6c70b3348c73a91f23e38015308692a775499a89acc72f0268be3c97d697d3c63aec5d716569bd7498a47e8ad322d0323ebb3a5ac1949f88718179c63aa75738bc51c0cf93034b6f08f087ad18a5ec635768143e273727d08a6c220fbc5e48e441ae80baa245927c6538a8558f88d04e6ebba615fcc72e0dd6e86b531c3cc7ca6dc974fbf1b6842a449ed1d0236080579d4ee35a48e2ce8e2791b7ebdc20eb32d1ce3ab211dded99da847c3885e33335cb631a5acc2722778d0364331751352d7e6a9f4f3ab4ade75a3abd37cd98fc25e581eb103e77236c51f2665c8a33290f9442602307ccd8d4a9e577b676ccf03fb84991e25e172f8759924d52ce7c9c81ff19d2062e90ac6456a237d0c6215a16a1cceef4fb4283d8786967475a2b76bff166e8ac41ca00f09bebd0f6ec7b90bac0bdd5fcb885979e6aae6b2f6f61c6b9eb8bf9689682660c65ef82e8ef945210b5c9a9a9b8c16a9994b53d054591c4ce6b8dbd81f2f6ff59dc86f46282666a0c7226de1813872d3d28823cd05c9657fe9f9f458daed3f4b1d4ae276916ac289e588132f752572cda91f56f6bd3db2865e4ea82d470f20330303f43d9cbd3ea1e6952b7a706e72eb931879cffcf3d541035b988aca6d2378381387e9539b9b9cf0392d6bef98728bf33f80d6fb2cf01f29a970a3abd7d6ae2166150f215e6d661da7c69004630fd26d95b911f1c35d1abb39005ca9f446af0b9112e6858e5b6c7dd643caa27550c20f6e9bf6c20ff6c7811fc1477491669c884c578dc89f77ed8733a56f01f672917b98fc7cc930fbdd592d39360054977a2a43be2d7d38a06b1a3d2afbfd20723e42f7c7318f2717c4021df6ee58ebb5ca3addd11501925391307d6371734a7228c28b948877b77c02b76877c81b23518463a6c00925e576575a7abc829b8772b6e4736169c4b78700f0e4423021d06d59bc9f0baaa5aaf77f3291673e36e972e16b1f5843e748066454534dd49fd1e4132adffb54c8f7b44cc7704ba470be72a6bedc8fc76702282c051503423373524f1dc541d51e41bc068bdafdd7f02b2e3eaea0b04b80e9503af5f4989988a02e77f2efe62f7e13d2bcec474cf68e12721532ad41907cd8674730d9fb19c6abbd79f1707dbd2af23b742267f1c1f33872bb4dd5ca4fdcd3644a55e33ceccd74a1bc48ddb2f2aac75b004f990c4aea816e13f29be23af4d42f67fc7ed26f3bde431f0d34e8ae552975a0cc81cc90c57772f2ac224db2394f99a2e9ac5dda77988e4ae08cf56bb5d174cbcef142388e107291eeabac93a61e649651bdb7d5d38b5d11219fa32bd6c2b12398134f3bcdc1729784e1030f6f118ba5a31947e69a490ae9da4eb5017651e487b4f95913c374720d7a41de2ea0827ec9684ca4d6dca0a62eda73c2fc8da7d75fa2256a6c889b72657857027142c02004a34f70f23ce8a21597eb62e4dbe9f7ff8ff9d06ab84f4944da820223c392522dffe9a1b70c3f0b26e9f838c4a3f54668bfdd8c470c277258a430cf48e539de862375348934d066506a7f5e4f772fc3d33bc886de984f7272b3edf79c9960b300e05fa3fd70d758c249a376872fd84e37b9a3975988277280f66a21b556e3fae5b66c57bb2d9f78d514d7ba957ca450692e9d8abc094372864fe330a32e7183040b69943fd1c08c2be8aed7854a7924788855236a0f8a4e1b71a2243a0dee1eac82bdafaab1b5272ec5ca9ae392924b4bdb62230457df72ab64650f001da444a6315d07c47c5e4334edba3f7117bef228242dd8813dff2cf8cdbafc177fcc5460cc4f1f8471a4519cf434205b50f472f609f667166536729706f91e88c5aab0ee9114cf8b1b506620bc6f12f6689a7a168f2219fa6fd27271683bbb6edf75367437050f3d4e07b6d908b03f171c1d1982840fca34b68e29b4eac6d116755735ebc0eccd8eccfd2599a97c8e04d50e93206af3d65e2d7b10d284c0642f25e21ec1cb1fd259cfea99488dea0a2fc2ad7356abc33d71933172ddcacc4e6f2f91d2b9dc27be0324bafb902693929a0ec541614af4f703e6e5431eac6c2de28ba32c2da09e64d209932cc3c4a1ac0e53b8a760c9c1c4588eff72cc780805aa8c89e125796d0396a80098db48bfdc66678244f628161f09028272069c930cdf7f3ce1cb4cf1fed0baba6b988bf45159e25e8497a8af674aae6772819c60503c0fdf26986dcabcb9e301d985d5fd217307b7288cab45fb9ed2c86eb11695f095f71584aee02a8a9bdb89b208da450e80cff876a445ae0c6e3fc17282fe2fbd969d23dc94f2124ccec5f0b3e7aac3816ec3ffffe448a3bffd404b6aa18491cceb34d41a1e26c5989c0b6598a10446437d12de44b75ab89eaddd1a72f707a9d8f0df733e2b2ff4bc22df0ee021180fe030e7d3df3dad99cbf58bfe01914a1671e39b245c9bde05f106b26a023d2bf29d962db00d9f62c20fbe0efa7286ef03e7658c6eca21e930d01816f7dc9ee7996399823df2309f892a4ebb5e13531c5476c2fa5acc6e1eabf20081b6cc1d1adb74901883e82d9e6b636e80c672c360db123b2376cdff36f851a492ff5639c6d6be5265a6dca6cf2c461691917249c316f0b6cb8283a82bd309b844046f5b636b7f8dc936e32ff112564a169f72f0d13766a18fea726d1167b23822e5895ec5d5256f2bbbf4a1eed5f5a92ff2723389e906964ccc753d19b01a806c76267c6bca3b3514d1c191205d3158c33e727fafe2adfede0453680d252a359adf7afbf1366cca877d44a14b6e2578334972709d97d5a9f30014fd1fdd52919a91f3c995a3bce504aa9e795c63e8d1793c51ab9f03be32eda1aa0ff622b7be68eb87049f52e5738c593cf5a8f5ed7a91fb4fec0cb033c3326ab394a11e8fd748932d7219312987ee2c33a9a414461fc2be549d826e8ed39ea325c288e06a1ecc9de09c59d0f2f4d884fd8e69fe1ae2fb90055dbd334f21c47af51d0284b008707653a3ce78a1631ff00ecfc271f1a50a0e726803b7b5fb6c810ee0575ac1903760cbf9d35944522c9d0ba74c5ef7566327712eb0dc063de17b6b4da753c45f2edba3c30ad54e7b0cae1cc86a3797ca747d53ead4a5832a57ae7c1e9bc3f53f18f92932a546a141736de66d93eb537631de31c330c6fed92fbe5d446c4317fe41514857695df0c006dd40ef9023bfdd750172e22ea5483a31747bf97cf05bfdeb463a97dd25c29098d92acb60705383405972bebc8f2b82b8f46ced4dcd2f6bb1756e2193f5045397e78a8107e0e79524c525f47f5a952a9297efaa25953a0d1e04b425c6ff39492f832af4e242daacf24638eefa8bd09da2737120521297376767b0991e9883018537d7fa8117a9dd2bed72a3787c7fbbc5c2457d7744f2403ce779b67e831c62d8d3a40bc3e7531dae3f72101eb4f6241961d85c1d1035d8fdf174cfb9e70cbc8a0d1815048561c1cce7729f91e0987314eb0c2e59b3d6b453317989578e50cd78585d3601e559afee1744ac2efebaab0252a3e9f58191233177741da58042bdfc195fb00201170a191a723fbcba534287671f6a413663f19e16042b961687cd9d3f7a76bfead3425fd4723611dc876981f11c82017ab25b77d2ee9977a74c0f531e000d1f2a8595ffc33e6b99cae75c9f62c77f81c9ab63a1baab54588978595c9fa20f149d2b8a583f7225893caaa94b9bcbe77e45487cbf41c8717a05ca9688c3b0116e9596c412ff48176cf0c84c29a19fdae334e07a17bcfe96c39ed7693979e44d25e0c2f690462610ac7b5be9d19c74a1e2b1c32de8c45bd6e1f79f04d120a575f88b7077f5a614ab578e761d23c145b17ee601ad56367afbf47a258338d05ca89d6ff4e6c69a729b7370567fa7ad7e5ecd3cbd250cca07d6c92d957a31e3299b778b9909aa0918e1eef66cd01b7b2756be5dd1deedd939c3277497b63d2937d034e5232760927213d97defc00d5fcd7763028ca169e5068c33c4c7671ce0cb0216b70162b6da21059343bc5bda2aae11e6c48655a942ca5d506a955eda5d06eb28d637914a761d25fb044a63e79f4f9d76f8b049197e319be28b04614172d7f59cc1cde1a76e72a6fca80ec8c65a510130070b9aa910f5b638243578e62185f0f2d7495dfd432f5bc3cd748ff143178a6f0d2bfe9f82d2db7a3c26618cf85de6e385a12276394892bb6ff97e924add35a24378746fd1d970c077ee567c4e2291f3e389dd028272aeed3ae8efc1cb4d04b14533b96136c6d2bedc6770ee279b4d2c004f001c67723ebc5a734d390d1cbed0fb9c6ffd8fbadfc8268f91f0910a6fa871eadd78567291a166a0a0fce14115a652f2fae1b5cb59cd6bb8b42399dc62b9c8233b8d2272d164bdb8cf6672bb6373083195485f6c87584c85094fdbfa08cf761188ba3372490d6e2bd823454c9d2157e8b1103f9d40a2651c7096bf07d55c05c9e4379572499c9b1fa330c2d9a7e115fcb37b067e3aae051e55f4649fefa48028b74c0a72c4aa30a0fe63cc91642861656b841019249e718dfbed0155cfa6f20a33727f7284f81aaba2aec26cfc39040ef1b944619e2cc69ef903bdfb307253beb0080772d1e3921997aab19a5d62f82db245842cdfa5ebc1cb8ec178a2317c909cfac672d42f8d085c309a857e325871e3a8935e907ee6bcafbf6acafa0eaec82b8b5d05d45c7afe9c53931428325de100e45b36bb7a37c2a11e34fce7e6e185d03a6172f6491d15f9c122aa4c30ed284d9f2a09fc92ce82bbafa7f6109849461f688450c0043bbadc1e8e057d6b93cf3ad0a14271c2a4a5c4100c64c85f3d4b21a0ca6ef512af8e41140e24483f48d50c9b615f8b42ad90f0fcfb39ea67cebbc19dec72df98721965bd054cd81eac6172bf60d93f20c2ab66c5170b5bfa06cd0bd76a714449c2a08a9aadc50abf182ec708dfc70b2a66c998bccae682d44cc16e9685624df9631aa0eee3c115ab41c56862c3c07e1d3349ab652c96183682386c9efc219db4d567558563fdf43d1d0df6669cfee3fede270d59525dcdeb9d9644a0e12dbfab9b08c5a73a481ce31f8bbd90a2172a583821756a7aa94ad67ffd5c8dcd72b8adaaaaf9754411ad35aeb4c72217d527f4f07b56dedeaba9de8c02270f017245c0daa474c4d4bd433ffc3931298f0fe1902c227105d4335a7ecabbe088c672643071854354e050a38472f677a5a431ea805140523f980b673b0c8529c23472749ff182e18fd59744f1d3de0802816915780dc7eb8d83ffc59434eff011dd720632b228804f9c63175b6a7cbc50c86bf2f2ba3943e8bd7969f48d8f46556e7296195c0acdff3349bcc4f46e9c7b5a37b1d3697186d96e8cc6cabcca215e2c72590cd90efec3cc08085bffb4fa28e30292abdc0868bdd54310207ad12d6b2f607651898067f0954c3e524ad97419546be9eb59db69cac189fb2394729f66f93b9db1ce7e83829771fdfd6b3ed1e34e920c3b9f5ed889c1ea2e326fb3ae7f6b7252301f80165cb8623ca430e62125b4e1ea49a72465850ad8ef060485f65c775f713c002bde073a88876cbec9e448c60bac962ca644b3feea25122dfad71e61729613a92b80b933a09d55cdc0d89649ebb1fe9c9f9ae95b8838806d0b005a332d26092f56167c824c5f21c4046077d86d523a11fb3e7fcbc10a8a319612237f727e4a3087aea46f805017192eeed86af3c327a36b56e9fbbb72719b8cb020003552aa855c3a8c68f41516d9fc0e3171a970a61babc2f0022fdf396b90e84ec00804d3e9781f01edf24fe02d5f5addcf30bf7ab54c624326349f1201400adb5a72f0429baa32394b1b134591d934827020e591fe066e9b3e42313594099f5868725496e94fa6966e52f0110cff9b88254c11a2f484c56fb6c37b4232ae1582810622750b063770162299f0ab7703b17bd2dfd00e1f1d25e2cbd74557828b8b1272c019727aaeb4b000a5ba0a12a778f0b7157fc32d971dc7da4de7efc59ea5c4729bdfcb2d96a6b5565570225e6c70e572983a1e61f85d1f7c34158b13aff9c85fa4e70023bd99c516068e319004504e8f2ccce5d8b86ecdd692f062cac5bdcb72924804668b24a8ab49cdcbcc8ac7d9820b3d589ec13d881688c3c92d0e04b3492adb6b5ef627a33614898e23885d7162ac6afa01f83a82a1be496cd9bd4fe6657f4fe5903c09ace12dc52d28ebaf365fc469fff69cdd4c395821a0df2ef87c7259d87a27378c3465bded40269cb39dbb099332bd4268057f36b884cb0a9a8a72b5ba73da416120fa1962a95f651a0094f1baca2c7a3324bc0f01620704c1224c6f2c57fae3889802407c023781c710d7a507ea540b01614bc16a36ef092b856171d74cacc2ace517f77001e293b27e1635d7995b44c617baf794cfc3ee96cf526b10b239599fa16018c9e4c4ae6c1ff869a78e078118addf30995d9d16e648727539854e2ae2b5ed14558ffa93c274a6ae8c3e7a07bfe11a04ff6a881ee796727c697edb4feab665943948fff0526eada2b591aeb3783616bd92b18ddea86f72634d1c6a0b5e18c4129b8ab21d5ca07bba96a9eeafec855525b3a8ad1f475a724f368c5c35ed2b3f20fd124a1252a08350141a085da2880e32b97265a6ab4b4cd06054889c401ea0be16fcb9b645a4a2e39805cda20912e6c61ae567438695725f101f33043cea06dbe8336b11ad465cc1617314086212b7dc4d51ac19b23109cb62606c3e0f2d23d493169cd5fd23d40686d02362efc46fba77610892f47d72b3a796355a5496717c9242187f656d8108e33ae205d6d5faad16586e71a7d2722bff02e591e171cdc0c05e0e584faffcc025a198d42c61d0b7a82f3398833d729200eecd56da1e1572ff5d86be275992500cc7a7b5fdd65c689bf789630ab37296242d3d3027607bfc677de63769ea4022f217e29716aedce17bf32648e4fb382684d500fb5f53ef446cfd7e53c9e5026ef1369d08d9f050a3a3e8bdb1405f72494b847cbde3e92ed6ac5b002f46589d0a919d4209118d8b0656d7d8248f0172bad43d92b2d650ba352f8beb8264f8da3b8a3cf9b6b98bcc49ed9c96d429b272340f5558188597a329d97493a24798345903bc0799a8270fd10206ea021ef51e7a2eebf996720ff4e170340ac9e831600e28259dbc5432e6a392be8751cc7272ba0f0436e0faad86acffac7817c6f950bf7808164b5897a8115634fbdae7aa727ee2ecbef81409b3bf528b35c81e5fb8ff21a29f1c3a3357d698a7b3359c2d0bd819708d9c9be4b3fe3cf68c70abbce2ec257e0a8222b5bb8b47e3ed5df2dc62d80c099207de022c161b0e780d67dc24201d5c0d87ecb0e5b5f24befe22c0572b93b9cdfe752a16e36019556f338f76fac137ae12e0c30e39902cc88913b652f94f90e7a85601712a792eed1c4a26e8a996d723d9c0e518c1e5e2a8fb2171c4e6f6109ebcb0f0246e1f8e02aaae72e4f32eb9f9919d98425abf37eaa34b9163f87b17d6ec6de7073a9a05fe9ad497a85ea845a013192c34c1d523f62f7243a723d740aa5d618ffdc00c816a3a4f1938c816c0fcc440bf4ba8ae4b26355db4f7225e728325d11636e16fd46c0ccc26d16cff2ad5a57aab14a25d836d15223cc728fabe40f1ecf6f5676054a8e96d0cfd6da481e91ff90b61348350507c3f1357208126750d19ff227ef445047652c9d32d99ac089dec7f69a9a48be41a8137b368e39dee49013ead8ba192753423e83d0868c01dfa66f5c871ca8a3f0c68fa7725335a4495cbcfd602cf71aface6b0de876902d894b84f4b3ef2f2df49ad9045b308aa373ba8a78c6c41882b78480ad82768df7d5c64c05c8b801ef653766d572c190c1d231df30444796ebba3edf39c24f709e2f77aa5e52cdcd22944d63c64304c87e2a9144b03f1d57a40d0f3a852f8ee39a85c13b01e9a2700f7fa5361317abdd13a6174b6979935eba7082d9e57f24ddd02d5936b6c82b60008d95aa5d724f4e5a5bd4d938345ccbfb8c070b455bfd22349a068634e34856c2fa97effb6da884ed56a1c335d533d7ef14658ade1e7a9b2e823ef33b3ac526f48cdf25465da962c879cd1f0e7a51df3121228700ca6a043a7edefdc378f0d0822fda22cb3df47062dee7216f6eee92a373767085bebae2a69f3eb48ed431c48e11edf2c00b6cb96dd967357e51c51c24e043d0669689765e24e673855b1d4abbc267d3aa72191d91cb3ac3ef7f0dc3b120a746786c10d3f8f7072888f5f9c99fc484d82572cc85c110e4cbbef9d0f1d369550004be03741ddba89b08704ae987d407e4e572bbdc274afeaf29e38cd999c35fe32f28857d0bb920c6399326a295ad1273c5728cfdafb908634f6fc2ef9979a3556c71797bc3718fdce66a2f3f903d99831572d09bbf879ca0c2601f8826f356416ffe088b0c90b3d7dc2bee8f1b3ef87f6320c56af987f22b88d9322af52d10f7934b2cd70638b3e94a8122be1a125000d26a01189903235ec574527c23ac4b2ead798e97c80278d8fae4acebe9c0821cd372c434b306a36492f9db131f674cb033384ef1d781700e81e691f75048e1ead64a6e315e4e445ff0815a5bb17dc1806fc230ea47f15fb545eb816734d1820ea97287cb3dfe223de126987757d6f3b3b0ab64c899bd0a28317a59dd09b97a562672e3cbdec5a44dcd19834c5634535c42cec5a2a66faf18e73b2a999702d71ed5725693259c2b5534678923bb54e971c16362110f4494c95ea975d5ee8a486d6d07211added758c6bd1f34f0f27a621f15472956d7a07f28cc65d408a103a373372565e3c0eea273ad3e0adb60272ffbb4482c55859f556a5cfec4b96a0ccdcfa725fdc32b382d9c05ac9ad9ef65914298d47ebd9e8e4134a83d27011232ae2da72cda9ae84f94cc48d129b24a7274ef29e9e8bf336958969a5b153256dcfc45c72967d88a123a9a1a212712919802b390b3a44ac4c226d41310a0fee933785967204933713ed9f086b6788b70761432be92ece44fdaaa131763709d780402e5f72848813e93a1e24affc4f22f6e3f56ec9fdbc1e5a2cc4669b3949ebbbde18ad723c7b249a834895e4ceb6ecc6858ceb873f4f290b328c13b74120a29d9639a97214100665f7c58c601e16d68ae5ead76a4d3321d142ec074fdd5e074f997d724cb81fbfd45f3f33fc18438c33f01afad42e1f30084c1ef6ca747156a3569bc8559d12bab804442d496864a62fd7c09838515a71033a02572946fc4eb81b43616978a24fec01547dd612bf61e91de55fdc20c7f363819d453251e7972022b3a958bd87c79ed8bfaa8b455686a7258acbf0356c19722fb784b4ee4220bb42c4aa726e1cce5746e168564eb4edff47382e59f27f16ef9bf316d506cdbbbab57f387265d7fae124629c7e4e38fede7427b46053bf079b8a4ae89152d99bc3c43b9737b2b83586a48eb6c0e54e6b0c961f6d3e0193a86aaffe36dbf80e4fd0b27a176f2300797d4cc0dd3ff882d79f4769a195f2e6f7768f6a1ce45ba7f3d2e6217544209d3a67a09cd48a170e6231bcc4cba581b0b18986342c333f8e73155decec72140f80d45c7755b744f4d2962918c6320222b42c3ba9eb316fb5818dc525ae2f4f1308455cb2dc5e509244cf0b9ce963cc2a67703fa437b6b553fe2c5377536c4040aeb831e824b82d92d52b3563cb761d731c6b7ed2069f1a0f33a9ba97612a8709070e6144af26bb035123a6d2c2e1934bff1b0a2603f3d4244f582187724b3ef7d6e2fb188dd7c5b537784d9359f4c1d5ab651d0d26bc6f0b9915e914f5629476833beb4e3f49be059d0cdbee021aaf8f638903e81e12d9dea0d6ad8da82cb507e46c86384ff1f42c1f249c69dce4fbe697d6c07d9f18e240d5b8cfec5c12302de16079f0dd582867886fe1b220f1ce4ee2c3f6f87b1be1b710c243dfff72028681886e2b6de3b7efe173780f996c5642996c3401c563a43186f5437330721eb03e6842ba72e69beeb61836b7802d45c528eb3be22bc75528029a467b9e72c39773132c54f6b7b7b79fde1e98d88129d5107842dc82ce0d96b235d9fdf96d510811927175d21dc3a8c7b1670b509e15098ae50da5a05be150c60242d3647265f64ae6793411cde3fd6ff9dc3f8ee60cd83ab35445074a6ce87628fbac74725b401254700cac0c3cc6a3d09158c3e922359db0067a2ea9531daa9d242d1672160690b68eba17d471ad37bab5f23bff11bf529a62870b2f2b4c89632e042116ba862621f7b7c1a5fd2f2d6c33815f19d7876cfe0db6f8ac394302f6a9e88a72b6afbf862d6d86e2beb602eaabb5424a6d81fee6d3ae4d9708fd00a437fa7f352adb95f5ccc241bca42f18c6002224eab40cfd8950b045015184c2243bc1d33eb1351863ab42ce371b177c030827b8294fc71d5713154d9a0d2848ab2ee487728f4fccd1f520af16dd0907d355757e856190affbbbf70b455f3d682c0cc47509f30560c546517e84905ebffd6b170f3c10d67ae5e0b5be339fc90287971305727d2b2b2ef5ca8189dae4c7eae5567b826eb010ba48ac5cae4709860dcfcbb672828525c1a71168d3a0bbd7b113f2cfdf6e7323507bcc8944989c2e42639f1372b6f36510df08f9694623846d3c95a40b0544e26d11ecda78356b9766255ec858f0c6a6a144282430bfde455b857a29befcb4a801a443a5eebedfc97950491d37d4724ff50891cd3bbb4a073e67507b6f4e0ff29ad0110d803a933c74beb1a570de51bb94a37277f04f62f4d10910583addb7698e021d32d00de304f853b83800ad231b14894eb5a22718c8086aeb103059efcc6db116014c612b67abb4d80f0b0111e37ce47f22a2086d7f3b4db293ac2ec88fa2e533c8f4ffcb99b554b08f72d7ae9d7f52c47627406089536ea21f4ebccac03a0f662c9dacab5a587aa9b17299e06d68a355797bc518fc3584bd80dc484b6c3d0febe9abc24020ec13999472440fd99005cf683c6e129184960379bb437326881cd35984c9b88c1700e3b67269ecb9a1e43737d6bcfb5f06c3e78ad1926e6ae09ec827600381e87e5dd90f7262005ee8e71b7c8f1cf69b9b6eacc8b2343aa427ba5ca7939143c77e005b98577e7304f217368db1c4e9af1b39743b5b6013290dc164d6a093a39f033bbc26729589e705a4f2bde7ac48a268d923edba69dcf9858403857826ed3e4931ebf96ce6c1e6b1129807a998beabc98fc24025a95fe5dbe45d77345e6bb7d13a847972c461675c4969e526742832170e8baf48366949ba911c020902f6c0ebefe4ee5960d93334905de9fa2b20f647edfb372942fe17a67f4443c6e1afc563fa53153f3592fe218eb95a745c61404ccd899ba2cfe8425edf528ea9994af443ddc5ca076e4f381a7515a0391390051bf7b1145f22ee38937837d8d03107029b5559b02de5395fcd1146ccfff8f1291f6956381bb8643ea2931c6804e4a81ad109650a7201a827902f46babff4f5c20a5e6eee4c071a40172d6a5ee36703663164a55548517a15d0f4cb4f8a901d1d6b074a38588771634a8fb1b3a6119a6d25ca129069d8f1338de4ef664ac938da6a3e94d86fabf939aaa3a2b952dc65a23b4b8b9c65d6614fcca44689b9efb1152bc46682f4b2f02a99d5aa8d0131cfd56e368de61d03bcb7272211cdefd12cc4e973e74085ad3b60d9f89f9b9283bbefa9ad35d972a5a518585a293861823b878d673e2f8eb27276a8c50e222a3c9df39d37f255306aaa8f06922b75a0da614db8dcff10bc0a6816902d3c6c7910cbd52e1569a04112d22b19f857e15191e53ccc1f6b0e7412d863daee96e5996333442709cf8c72e30dd30849333ed62859d133f886699eb99c588e47dee2a6fd968fa14eb35a7284b4f97d4ee9e34d38f8df0147a616ba6b13708b3e64da0dd218b75ef9887472399044303e414e46f9338abf84db3e51b0962bce5c8818920815701766e8fa72792f9f7a21f67167749e9bffa1eb8e698bc28a848016712da5049c03fc095c4a813ee14f1248067a3647df1064abb72a59e92b83c72bf31532174cffcb926935e56f8f11af446b85256a72d7fac55a2cb6f958a8a00d7f41aef5024cd5980372686bccf3edeea1ec21c3768ca718424a15b743314f10a8679584d20d464f6c34f89324e3e27d8958d8cf7c6f91f95708a33d2c96ad167d5a1512c51c159cca7202490ad89321e9390ada3c9ebad8df0e71ddd21510de02bdd2943bfe571e75727f2ef5e489fdb8b57a8aa95a29c1d607143134a0218c0ab07fd3649de0523b7274297ea78b44297551c33da48d91df14733022f2a5e1ddddbc229573d2e0a172324350d776c93ea3c7b4511c42b5bf7ff431571e4d04df73b3560639031b84723af43dfcec32a93d8e8ccea38533af17693435abbfcbd137486ad325203e0c72b3062ce686767bb537aec3f44068d461518b793e853f3355b432cfcf2cdbd472e9ca67c0c62e7973fe7545d66aa57e34512a2aa387f6df0525bc242a73854a00eb57a1f010992f4ad24bba627aeb1b427390ffa11305610abca17b80f4903d6d61ac89eca8489847fee4d10beacd278d3a17e453a15cef6210f40c3ac36080729f63650569e3b83160ec7f61949bd53043a1b7d87a6b4412966c0b7c45737535b5214bbf5af84c934090fed4e7e6615dd0ac025bc15621ef7cb79f7e07c37f53a43a624465f14c7b09b7b46a36db1fc93eb070b36c11c2f764333c8f47359c728b26567c9b78b588a1c5b8582b9508679e7cb66e7afbab81cdef2bbae192c84c07baba11c3c814b40f3e45e90e407a783859ac7612b38a46ea406872e99e5b62ca2e28a2d6e42d7e022a8d4086879701e6b387a092d926f0e94ef0406c8d8b05b5a8ce8ebdb9c3040f9bd9b0ab6cace1eb7b3cacfcbf8b3203106894b346617288df732f90c572f78e890a83c1438aa9e83607bf665dfb9d5dc9e5e79921e172b31823dda26c6cac8808327672cfd97347867ab2875a48c0521d7380e7e3c810667453f4f466300c80e93d11190dfd1d3905428cccdad852b87b4eca09856a7225b90d025b62c372b695d786870764b0b35da02cecb88523a1fe4f71ebbe9c2e7e6c5de7aae55c953d6c65317962cf88f05f70fe6b8aca7101d214a979fb667204d50b6e93841d3b23b4d3fdf61cb58ee7ca8bfacc53cd3ed915e93ba33bd070c23b56bb484400f0afe1a19932879290870dad6925cf5b325e3100deeff6bd729f3dae9a8d36d49c04a3d32c412f69a391acfc748c749430efe74f4d3e410f72018a8ceca7ae6f644fa17a8e1f1bbe8979fe3501d2905cd71ce4f6aedb66f12d71b70846761a9be0dee773ee6365337e2f52f89e60dea99a5f8249130089b9728268ee4081eaa647905c3610f9e458357abc236da7d7e4ceeecef683f39a0472649d06e8d1b2b23bf91bff67172c4be833aca7eff43e20026aa6078eaa5e742ee99c37dfef24cb50aa80b7c35d81e83ce5c3c4c9f84c0c21d7c99da03960e61b87ecc1ed16270fdf8fd03516d06d8650ad26ec50fa8fb5977f5ab89a4453ef56b5286215f8de14f849d73892577ff3a9e89b9c4e3f663d5ab791a9bc8232697253ca178e962608b117633730619be3cb062c662e01758c15d05212284cb015728b7f456fd1d2f83d2f83df1e64bbb43699610f9961096c0cc9b3e5baa52a7472a336d43b2fcdb461d2ed867565a9e4c797fb73790cc1081226f64c2cf18012723e552373f0101ba1b4887887701e5c1ba24328fa276a7b9229ee99537a73be3c70a14b0f06c2ac3e2ea2b5a3ec1141a47eb7b12fbc65209f06726351fc037047e7ebc0c5ed85396eb14fee626d217f1eb9bf3edb2874df467401e07a7db52424169886c756e157a2cf68d0f1c6a2f4ecf35b596a0c5cab660d95c9b236d59572066e22f607946bb6cb8361e9c077570c8ae76051e7237b9849758922e6beab72ccd0626cc99ac9bf2b82df938b7427c072f9fa254aaa423b38527d17aadb0c6c4687850a9761e84053dafd28371c45e3ce32aa5f9555b5c1db688cadc7da4872756bfb8616eac6e90a01df3303186bae77418b2f4ac20ea8a86b10f85d73975ed7bd2b0696071b153aaed4d11f1ab42ed63c7e5ffaee47fd09d19c40294bd855baa334f10021f46fa66fb9783ecb5616b282bc167fc33e9b1b5321b7711a9b72fc1d0bfb5c8ea5f239734810394094526ae5af54aa17a44ef7f44a581d8afa7240287d7144b35c846dbfba57c7c785a2dcc8b6194e574d7528d65adbb490b77222ca91b93f5a725723e071736ac33974f60b5dd1bd1d4158ce6a7a705513b272d9bcf67800069d3c067dfa8a91018fe4ad871f884a54ac0ace27974a22d9e7586776e8aed2b0ab08ad1afd4c14dbbc65b3cb2bea86a120ed29c82ef60ff1eb6e502c675199f246ae80b422ad5be787ea5d35d83dad000ae8b7451b12e59fb368ccc6c34ed7d017d785a88c24595418eda1d66cf38fab61030bca60b2d4185372f2a0accfdd3a7b29500c0be907a80ee79dfc766c94b417b377c6c65cce19f4721d4f8197ac82696015ba04fab5d84c3737ba41b3568642315d4636c6d714fe72c04f2b010a367cacf319bb9f5670074b71620f5ac0c57ad26144ab89a0e5e572bb20bc717bd0c05a0c6bc2b343300cdc8c26c427349193c4b0e713126e68f54feb9827c5124f93fe9d923c76ed7b927997619d54ec65dc05b496093776278572adc57b6b543dd754131108d1465b5bd9bf3362a587d2e15bb1bf5e301b75be72a670df22adc71c24bbf158103f7c063166b7d869031cf9431cd231d15e58657246279706398d1c19a90ffb00f6f40c6fbca1252802c94206b7f8f22ee401610692b709100fc0fe13403339518f0ee1eb75cf8ba1c3318e54efd2ab8774f14a65fbf8d95aecef50816a1a62975e544c79355a8d09e1d4951c412fbc88b2cd6072ea2220e14566e73dec22a7aaf51b2753c2b5a812d2cf28c39e78279a13c7b27268b51cb678987ca3151310301b01d477d0d85f31beb177c67e2c3a42e5488d72fe946091db9a47176fdaed5183d93188df6d90fd2b186d9c8369a40faea62172eca61f2d8063f3348ea3909dbc5e29f41c4854130e790fbe87747d0f1fec7a72ba98ac257773e69ace8ce649562fb75eeaaa696e5387225d15c54c9adbdac807a90adf8bcbfa688c8042974c86dfcee606125c38a782becc976e2e15f1c59b725e8d1243008ef575d57c838511e34b38c5b573a9d24c8f228fd26715aedb0f4eb3ab5040cc7ec59e23e6d8a3e27ccd8416d067dde0d1d8ad0fa0ff43f24a177227aa8fc11ad98b85f2f1935ef15a8202954238ae0939452d543bdbfae970b727e1131e5c6293d54ee12f6082540ef8610c6502714e47bb759e3dce0337e44c7288dd0737ac2e1905e9cd349c79d21c3998d3c2dc9a214c63454dee69e1764772c1880c0b6caa495941a8de0e33189475dd0007f1785e3224b1621f434420e572a964d3142ee72e1d7c79b70b78508d18623601eca284b945696e8abb22eb5526b18014ae31de321ef3aaf5b559dd6b6324339911bddfd64d488978bf51880439f971e8684b7c6fc60a24279055087a300c748dec57cceeeae897b6adc3f45e72eb15e2714ce5437c7cb5a9b66416e70ebfed9aec828227dfeb6335bba8eddb4aa374180385851b9dd1dd6e3c64b5c174c973142be1c79d0abaef75afaf275172657f69f886c6c85bc171eb8901213c865de05bfcc403b8ab48b184540346006aad51c06d6e9ac06995fb11304c35a59c34ace7a1b70d5146dded899309696772d21b05dc0faeb86bb293c8a9fec5a1120a54f6ac9c7cebc371d526cae2e157722886744c191a3782ebfdc396eda6338266f3b36c0132901298f0ccba5e8d0f6d0a71e01b8a573a71712e8db5666897b04cc7ceb502b03e673533f26649bc7272c9fb825da1af6a0f66c43c73cd3ad89dfa0fda0fb732d74812954279ec06b4729fee0155a840de9f029655b8ff339ca1f78135c8be1847e2d9e98c0e2661277243eb292f525809a7b93fc1f6bdfe8db02688fe99507703475bf8a10df9654431b96466dedae4532c6511152f257e43f04feb0b5ede3a1a758ee1ba8fa86a9b727505bf42fac6dc4c4ea9c17fc809f4c3456fd276c7da6b32532fc249e66d927293ae89acffd99e5a465be7d12832b25591f0629007509244ded626a0f31e553915d499871c37907d074790d1f84a2638afbbe7bf8f4a3aad5c11caa2603aaa72e3432f7029ccabc9c177a721086b9a2e1f44b8fc25bbb68af1d1d85d2980d8723bf2a7cd88fc39c9d3a782b6776878ad88b39e6a711b456a9c9dcedf6cb9521d1cf92e652b4701248b4ebd6e7cb5afeaeba8da6832769ed5d4428e2853cff27290ee493c1de3d7d44ef08e3f66fd023fc1e5769a45992264773302618c12c73374634b807b526b73683031960610b5ecfd6bba816f25943efd9745ebb18e9f7248bd73e065f65dd2766b37410736f072c5325dd5784c764ce4af9190e3e9bc48d70da73537e694ead101522e3ea7c1872ffa5ff1b9829e9129758b46b677251844fc301fb93898cf70018a71affc1375fcd92d7c81ca99c2282d801c15b8381443af6b2f5633616da4222ff707b789a8a2d6f5ea5b5cc934afb3d143c2c1c115eb23989ddefc575c03138194edd049460eff765bfcd2e8055663fcdb73c1b45d9cbe6897847c964c91ec8047cbd206c560e419eaee625b82dee8cf3db8b2c272cd1cc1dfe9264eaf344114bfbba15c7d808f143e75f738334702495280dd5f725148561174696ffc8e6861d4f6ac6a9d59c43596abe6b884680803d2df6344721f7bdd0dd0b05d9135312272eee5dacf55e634f2d68409e956da751c980b58139fbbc56d6caec51848c2ba3a06bfe27d478ab9294f871261756086b029e8871dee34d746f30dd27255d842564af68e86bab7597a8090ec09adbcc29052fce07241a7166ea2021adfce872b1ba4f139d73fe9b63fcf81cadc72b32f3af024b5729d28359b7954456f95320bbc8b70d103669e49d33d512a841a3b0151087a37727d37c1ec8db096659b3b974b4c06f3dccd3f7ae1a61541e46d6c6b5d8854ec72c998e81ac7b5e6561c22ca9b1df0bfaa32070457481f19590084cc209c635c72b49cc21b7fd05dd78fc4578a051c19ee2532be14f26693b059db41f0d6d5f16083cf70f71a24bae55394d3aa07b0697e86d88d52e2201c6a2bda53376196160d34af08c36c3e09bfe5a820a2b008f3b463c0d14719754c91c0e1f0f0db1e99724c706a6870422599bdb3be69cf5dbaaff74ab1934618eb9b7cfc2d4e13a2432018a6ebe10c863c73ccc7e1283dad681d711d947e9e61a77dfe7ccb27708b4672d50c9d2a29287e880eca4538cbf2e046500e1fc5b29e7d98e60685e3ceeacc362c249338df0cd46b440c8623ca51f6ceccd0d65a368f675539e4994eea9e68728d35bf665337bc36762986b73e4d1d989c918dade8937f9707fa799c2f4e58724d2a059cebf5095f9888f61ab8b86bb0961bce36299e81bcf40cf15fd30a10726ef67825398dfe6cf702cdbfe997c6e017e1973d0f2e80051ec45c9a982c1c729df803935d2ced7ff60f220b5cb26e7bde68e4fc3b21b76a099e4e217b3f1872aa374eb5f0209b9a38437df664618a7db900b57d997626fa0f55f884f9dd1172c30f7d352f459eb7ee96194bf326df1e2de13e35f0a398fc07596fe522ecb072693d9992f30c66346ad7d74937be333040ced95475be35381462f34d97064b724dd8a11d2651e9fc5745aeeafb7e0d827eebc3bb68d199e3a445e6e66e2c5772c4042d46705d0a4c090bdf5e164d4a6b63d71e92d33b86455209b6309c1b4d1380f17f31b555144eef34e61b72d11c101d27ab0bcd04a7f47b22f039faa921725c876a60f3d1404f6d7715835f6133a9e03d0e7f0e49a0a49f9325bcda3cea17eeb3d12c5d3849ae45f71518ea8ab14066b926b8767f92ff507a53d58013891cfb969282f689bd54ed54d06ce29f7b0025f551ae777c95200cb22768dfef39721179d52e6d92dd86f218cd80df7dbe6d711def5a0b64f74a523742aa6dab91726e63c1d7c8be8835149b98419b5b7984189bc4776a9c6fd3307277bc8cefd0726ab95d86e5cb7905dd5b5b1abe0e10975cc8f0bd0258b86c05b7be400289c972b7e71c3e56342b1a222f6e68497268c8352ac33c589b9fa0bf34f58d10f708729224cfe0b5a0d39901681df122d5071554f8e91f714f92ab642552adcf937872aad0d5824c990f76e3117ac8a5ee6f88cf6c3956185c22da328eac8e39c37172ab81952e023bae173f2977073c01ac0e520f999141abe0d9c52b59be39f29b72b82599019855533d6ad8ce81e38d942210229fe27f2ae4393f4d67053416095715c18b93f99660c8a5efd28d8e6ff2098e3a9889b3217a556f626bb11682cc059f190a56d66a7f938b4a003592ce6560438e3a17d051251a523491a06a15ee722eb0ed6a22bfc34505b3a32458c4093e99b2fceafe1937c89fba340eed15572b9a5e1802346b2d9463bc81092f0ca194eb4bb1ca32760347b6102758fce7d655808b520b097d0bfb6ba20074e3c53b9febf7268c707724cb889993c81bd3035fb88aa5584f4cd08b51d38af9568d1e7b7a14683b5c27199098c0dc903668c41621a6dd8c1b27d5e0ad41e88c16e3777043436f6af889eca73970c82ec17a5072839be0231effa326d0a8dcf1664396e9acbe4fa9e76cf51f3c35758f38f27937a84020062270cd1e7518a40e2eb2032172d816fb55fde98ea1cda63172f54706d629f6f6a8b299ea9b127abe224a7f6599c93d6e745fa6149fb2d83156c90864794b1cb8f891d1a4b70df8128ef52c7dee4f9d1993578f88a8b673a507aaa77286264c3dba35eb531a40d2c49507fa65706bdef23a5aba23cb91e3aea5faf372a486cce307ea4148d5b4c010d58e0184b3c5463b1ccb71067e278ab5429b80563140eb59f86701f07d6ce2d6fb3efdc392eed5d5440aaa5d975aae526618290d6af8ef2e10ba11b0d65686f2f0866c1473481e84bb8a06c396cfd02b3d2ff37229aab21d2c3a5591b16c4a0350838ac3f1b98f586e993fdba799428b92a2f24f527f6958d922752f23b62704bae5190add8ad91dc43412a63a841d987bbd9a72cc1f7f41104405469ef2c95e5a9bfa0ff54085efea82d84b3e12ea03f20236118a97785f2a6ce23fb2261bae96683c6a82c291d5947d3c951cd72d75a2b5767281412494440c5a6b16876ad06292f06ab8e2be7100610dcfd6e82eee653ae76980863e3a64ebd8cf134b05f1cb0b5fd2177b516e1162e736ddafde91cf461b72bf26d0ae12928f5b379dba2feb622445083fa7114054422d6ac00bf1bb4f27726e1bc83f45fa16e5b191ca448677a1e7fce023d073fd53dd1b311b9c17729c7228ff896785819b3ce5d4248d9cc16cbbe232419bdea0d81b46181fdbfeefcb36b33f9f11ff5bbf926fa4195aafb0e7d09b1665686311427e98b0c65a4b10c4727801da694dde5d7f9b3d20f83f1e5fd2e732dfff3ec088590e2e6c6c84659c72c5319f1ad23f5c3efc7d0fb56bf0be1302b0a1cd7a172f3eb93ef39f75ea835335a6d2787d73c52e2924181445508418e27cfed782636ec3fcbfd436cc0b1372bf2b9ac919a24cf9ad4e5ec6e994d8dd12aace1a179856a79cc6612632d8f27227c35097d9076994d6135c2c0b96977c911195f35640eb08aed2f271eb9bfb2d9db7147e9cd6bdff3213791fccb91692d36f3755643677a25d15a5cfbf1ee9238cc6d4b046832b6de1ec68fe1a5932a71030bb07e91137e93f36d994b0a98c72ab7b843f8aa6fc0d29a0ed7fcb4e97f8393cd7d05537b05f684672be26f992720c45a87e69cf57fb56f0b8a10d1c1cc562a766e126dc6f2bec59dc8094e4e4151641f866594b161f450a5524e1e89d8fbfac54091d768de6bfce383025efc372b2d3ccbd80934a359a1202d918c66b2cf81be3216a0da569d518cea8c45af7725922c1922a5935a1d77f0e654fc0d24e75337a03bdbd25958dd45ba146cf4d118bcb11bdd4506810d37d28b8cdca26a05859412b1daf7933277ea6f8beb2ea7294fb1119988459c30e2a8f99cdd94ca238194ab8121e5ecc0196c2336774ad191505d9b3726ffacb01a0a6a47ba5be2c6aefcad38b9cf3e4b9322b08efbf73728bb09c19c62c8f69bae31d3c4af3302972b518e74678516d6d0b4ba65ebfb317c5d9a27409573d821e954db86390bcc512055734b739565a4fefcf02a8b149723dd6f52af7267520ee4f5991d98811a7d1e420d3ceb5135a7c4c3865b1b626726211a6ab97efd8926ed9281d6179bd2a6b245eb5e0e57723c9f87834fe4efa72eb3189d8cdbf09f6169068b86b6ef7917c5969d6a6beda7276660fd0156a4d272653055345f2557fa4b44957414abdab8dd56acca2f87cfe6614028de104741dd90219625e4b58f3b91759f80381855c6ccc6e8be9a8da214dfa76389bf7bf7212424bc8ef74853c62eec6600be191a059375b8fd038e82fad260a725f8e4d725394e00d35cee3e12bb6b83c4f0f8520419e6276aff300d56985b8f6bf77ad7200f45c389413aa36e1b42909edc3caeaa29c70ea6c57c8c4c5239ceff1799862862cc56f7d9aa5724c54278f49a9cc6fb0a7e7ebeebac8e72219718bb0617e08b12d8b8bb7b0690377f72798a95a32d0208374e205d2f430eb17417d57403b70eeb1cbfcf806110c5c157ddff86d46b0391e3c2868ee470e1e47549d02dad772df1534bfb83d48a30e859bd78cc436b12b9f479fcf6368bc85a30b4a0dd310727d6313e733de84998bdd2a20e8b344f7cca1ccf8eb5953bd45c7957e202c18725ccd14a4eed4275d443fc56b0cb2c1f58f66865b462c7294c8b76f2c6a3ce77245d5b9f218635843fff9047364bc4365dc7fa162ab46a63035128a1d043af1537b20404d12d8772851c84aa330e9f8a3b7b83de50c12dc776d564a3d9cc0ce72496edad59f4560d26ead98db159d974e174ea334a64901eeca3933b25ca179728feec09b53d4e1819f3b5017eb832fc3009eb52c9dba2277d925c27281636b7272041e11285560ca16b535a06d49b301351c1b4aabbf2f7420d4f86fe0e6c27281633f7a12ea043d0883464bc9ea6c65e674bed77a54f3d21539b7b0a3121a175215931ebc1d5831797ac80dc12f473566572526309744e5746d06def608e872733c5c0e902cdd4947d4611cb6e59a3fc64ba1502155f047f66ae246f61283727fc18f50aa8ec4a00a230423f2ff31afa72fcca7d4f483ba5257eb33b5ea36720919f8128d9cb82a20cdb0b1cf18abf076519ec643b38a6b615d652fd67efe64158778a3e3322ec7df17ddf76a9eeca0312d945c77b3164fc713c209c2bb1b723790cc0ca87ceae3012ee4c76c75c03d6520fda04d69d79b220f39d9f4e6a8724c962e5d48c416e661a9876cac31ab17e4bdb291960828f63e0d4c0f9d7762236ab43859ec9b4892819521a8b9fae040df2ecbc0c53e97afc6b730aaa2c2d17218a1db88353860f09fc12265b94d5dff6ac21efc205bb9cf06c6066a578f99724e75eb867319a3a44869e508a923916f9a6d5597452ca222d3e8c518d6a6e172056ca654a6014be366b36c91c464b513997a20a13d5f9a92c53b6f82f6de85728aacd0a8a60112b1f3feb094cdf3bfeaed6a83bb1af2eb8ac8c43cffa6afbe043ddabbe927b2f33d04bc07e3d80f91a5cf98c40985b267553d2d7ca3f52b9272d1794548072633b49f2243eef5044e1b00fd7f3943a161ae1aa55e3e080ff144eb57c4f8d6afa2917ff4afaa839304c0bb3d34d7ff57d47fc74410f3897e371eaf7e4de78d33e25ed7b15e7e8b0c991393cd271836d214c6b652b79effc47430fd598738231e2ed3729df4277d4f558bff49ba61fe4c107581c5cf41a3ad274de43af3dedf75ad76cdea4ca0b20bdf38860d918ae6c5d197026987b58365f672f004485f2ccbc59e6965ec11fd05d619fdb3e5e93ac1ec1194d45a614fcb63729019b4a0868ae2d30ac91209ffd8b9e8e2750842fe06ec9e036148140e903b72e8bcaaa1975d7ac494a5ddf1e2580602aa2bc12db55f212aa59ccce130069f72044c2869dfdb0e529bf01086807036e59adf7d5ca0bfabe9036f6da8c2214d2fee4887e2b6b01562d70e03dca24b3679f23047f1d2e6530239acf6bd686bc33f63524f7724f9b54680eb7a27de9938273a80d3ed87741f4207780ace6fee7d72c0f05ce098ceb497ecd4488af2b3f538c4dbe8e249331c06e244048625f05d47a0c2eb9ce76307495b32eed777adf398cce206a2e20062b0092c15c8c0ede672489fedbefa7049765d07c376f3ab1cb3a26b9840a3c250a0d47ae71a5273c972501d44cbf47a47ae657ff01095a9de2b04ae88b942629b40df849a5ad336780b08275bc210a0f2536d77dc7bde03acaab69dd5f4c70fde234311f45bf1fd7472a0150db03ce65a95243716757b5c510dd1005c1846fc615119bfc9636ba99543828bf0335f646f82ec60d8f53a21b827f4bb574a99875ecb05c5f00959980c0b2e627b82cfbada8b833e4345702d190e4eedbec4d211f7a28a9f637b17e36f39c4e1857b00180d14c068d31b619b6afb7305ea2f0af90692b120d166eeb9465e9fe1af21eb21a3ed7f3b9018e6ff6c4a991ca493cd7fd466672a1abd36b1da725cfa2ebf6335eb08febe09c17ea812e1468117457771233a7f30c629545992728a2d4a3ab51bbf6b2f5243b7a25bbbc92dc2d1970d95648854a5938511505172ba3a1b9ced94c703421b0766a0b6e4d1605ce406a39631aeba3b09f12e29a07222279dd6431ecb5852a6eb67ba01259210155b6696d027f15d728870aa02d927fcf64e8b7b7fe681fc5e286818b54ea216c9b85846c9548ac77b13e063d20c722481f351318216058d361d405f0ad3c40f7911a19199df44c88383ab8e009b72638cc4f4c078b9a1eedf74892fda303afcedd0353e01d19c8c7b442e5d985f19da673a62191290b408467e8f53329a8aaea4c83e3ef71ae9e45ed08c460374723cb4f63095609fd6db47a15343d8096f4eabbc31ffefff25988d007aa0666244b159e35042dd2b5b1aedc54b90172a02d337beaaa99890135f71bb26827685722b60d4e9b9c6885d3c10cc682e4858c7dd89968b4cf6a6ff7d8c719df4bd897297201272cb7fd87a2f13d69c826e831a625e2b9f4369ef1e34928adb46d11f724d05a76baf235b4cfb4d41ed7943d19ee60f6aaf549e0cb73b6ae03e1205880c584ebd1406a71f6e39f876babee95d3697a6e7704326bfcd0a4dd3a85cb2df335d66a9d6ae44925c72b0f49ca2ffd96fd3d9334d907b69b4d7970a2aead8a03ac11897d9f7ccdea94fc5a9c961351bf45a1c5f4076e97248bd3320b9997a7a3202754fc52df31ae2ba6bd2d5456939fc14c0c08ed2f8d77b0475d20a95be9c72d0afb2a5bd998e43339c09fc3bbb4b4b5318d09dac81adf8f48e47aef8b85f617676a08ee56ee4a27527131355a1c590a8841ed49ba60363cfddab9466770e2160f781c6788ceafad43bc988613508850486e76741f2367545af399205eece7261955e5353fd539abe155a9d111e3642d0b0ee076aaa7daa7a94bb4bb26ec14e4329b6fd03ec53e08a775f4d776abcd9253b100cf584d337ffc802fac12d1e72c387e507015eae206947e431ad536fca363df410904d2311a7333c6fadd1ee72aa47f46211ff32378fecd205199546f99b49e048cd9931c4cd6114f37771c80983783884407bdc8bdc91c6340f2c28f2729249525b649ec3cc1d49e42a3102102d30a7d5b9be0599b0d66bdbdc6b546eb5d7fa9ed56fe187952664647d04863568cabcc796d8e9642652298dd0b22ea7fa0264f96bec4a68de28c86b76a7e472ceef0ab3ff2949672377820f0412e08d98f8f45db3176fd3f19cd00d78fb6542a21ae6427bf51f3b2b656e719a0c31d39c0d4553581f2632c5d40336e3e37672e7a76c39aff2c6f879651dd419562ebbaf0a84e9bf7cbb95bb9ec4d45ca4f66644bd4a11965c3d674ffd1706a9a14b9c4e27ba4f9266edf39aef81fda759f9725da404b76fe6e3d51ea09623acb48cfef00e7c0ccf3117073aaee3aa2edf2272c4f75c606f4ebaa002c2ca7ada1450af7707416d2f30279b1f0672f3b1fa324068df1dd434cbe9c5d29665ae790a0824ae0b385d15741e6587aced07d2c37b72af8d8270e214791aa2c866223d1be62507fbda7e3a78f3878fbce378c68e5a72980571fbf4be6a2a895819e6256981a97fff243399afa73d1190886e72f08910d622e8b231feacc9eee12a7e30fa0117cbcf3e5922520371a9f348d67018d372b12eafde0b8a9e43cb41cfe6b92a70b56264b144ae3685cda90851409365ba4493355cc9d709e4a60978c8fdafe31e67d65bba9228c9e1a9598c995ec04cdf722e00d2c6af0f550134fb843d7086cf759f39b0957d3573807c55addaf9f77262eab185323c2299cb5a645511717caa1323e8058a53756ed38b443c4e1d02067228efc1f54210fc7d1e5f5c3b46ac224acc3ea3a3a9c9eae395e2a5ef7b275172c232ed33ce395745b89b5732e8e2412912276af51e7a1bdb14f60d2d20e1167292cbd51236d8455e2d3a3af09a06108b01d951916c8c2ab3f3cbec5995cfb272fa1ab13597fe475d9c63eb851c43a57bf3a00c17dccdb7775cb45224bf83ce1902335c4db424cf091944d77e432a8979f727bddb80b043ce34e2149b9d88c4317f78a630496ea438d3c9c202d86ec09a4325d19beca14dc47d663a707ff0b531518be9d78b3ca672b9eb877dd230c72d7f682135ee27bb2f1d4dd40343c1f06e6a16962abec6ec056fcd382a59a0ae63ba70c5d24b4c0ea80287df0f3d6005728e64dc49fcbb0d1f2f5d72e73367b80940654088f742d355a4ab8296f2afb43e40f473f851098e7159f2dd8bc84ddb01019a3e7d5e0c06020aad2266b0808f4c4d113a3e2601474635f10b620166ffbce8dae98639871f05cb0ce167b256e27225fee4b4648e08b80652d2551574b4b31fee70be3a28d2107593a3d976694a22d45e3a2700c14f791ae02926ca38487326742948651d78a1b6833d10b75faf72f083c6b6a4c73a222d36819e3bc7f3a3b87c11c1a4d257f343a2f7dae923be0bfd960d790e4fc06cce63839948ebf3392b20ea8e9619581a89fc190b4baf8d46137eed677d675826d5efa5d42a831bffa8707d16c1ecb24a984d4d96b729c572059c4237b2253586ba04888ef0d159530335e6b57b279c01cb9135741ce59a53ff3bdd9f1a93924df7f471293d28ec0d8f53c1c2c5fbbd2dd991961b4bdaf172bb2086e19c0cf3fb206e57e7aab1d4f5f01b21549019ea90796f2be2aef6d442bc407a72090df2797eb540799c018991596541c39179a9b0161e21b73363761854951097f1e1ca1c26ec9c6c3c0832fd0d2fce1dd9ac1b447ed8b1eda972a3117d358ff0d18abc76b1a54e27dc7c48258f620b1bb9394525a48e5376dfd9ce72490c8068abf79afa5df89afa66049b9643318337d967484f1389f2f683d0d6723e143e7a12b9aa08fa59cabb2b84ec29905f63bdd6ef97309a81b775f8ac2a720877dec6febbbcfece3ee5c2e6fbda53a3af96015c9f13dd3ae3cd46418157720b73828850514de17e4d99631a96cd6a6a0b273cef07c565b4554d17dd298972e207c90e92aed1a33e5fd44c19def847ffd2ef57165a6f457e8730c0b0720511fc83323e7e075e13eec250d901ebb06c059c383db365811c09f3fd0f48cee30240369db5a5948833a0ee0b14f303b74518e08431e2c5612a198644e4126f4d72b47e30d9ebfd7f284a46da6a3cd0b1e851a66d7ac56a4cd6d9244ea788a891724bd5e8f8ede0b9e9abd58af2e140cb6a200febd4b8aed7f84f17c3ad0eeaf6723eb47dbe98efcfbce01f06bc76983367cd83c9e4294e114ce5074514ddc45972e7cc7768d8f57a1b54ed3fa7f227d64af50204ad75fc637d74344c7bdbf3417206612762c3489216dabd4ca2174333b636b5fc4ed28f9bd4f190656cffb27272b3c1ee5c86698bd5d14f2aba746e52b926ee86791cfefcae1c794b5113c624648d66c5c3eec1850cce3314d46a0a79be500db437d86dbe2e8937f38c23c35c721b5b409c1588dbc738364d8d1ed417119468d5a1bb194ee6eda2caf5517a6d7206528c0d79268b921678b4b2cbef30f615871c1e381c52e476afbac930180b72dfcfc3db5b2765a0044d47da3c914237ec2d97d3b0bbc24e032788896e09763e029a21f65e5a0d9b15f60864137066fbb7e3370e0bb06c181cb62b1b37350a7207f5a898f0fcec0115d9b83cff6468e615e84e076360673051d690d6918baf72683e2c1882f76715426ac65c052f746c41d14acfc0eb31a1e01052a6e076d372fc8ed290bc3e44525fdac372bab12abef8f5dd7d2a542499cc23585a9902e572af2117dbd1235fdb1715c27f664b57d7b2c41f7850d6fdcb72d91e87e9dfd1724361e32d4edfd8502d1f1711c5e36a8b55364028a1ce797cb532614380596a7237b9a6cf01e31be158a9c6972185236903891fa515c21a88275c3cb5e05ec63c2d30c8fb9d0e9a6604440f5554024a0ad37325cc55ef782856983101fe3cca19b11f8639e4ef1193ffe8ab20fae8167da61c47040a116f081471dc63124e2e7221c95dcfdb9d8ddcc52d96033bc6075d1b6e8f3ebb7353d3b0ed59140b611d721739391715cb6bd0aa0813ea70d2deb9b7330ca77c47c5f115dc8c561761d9724c17af3308c1533d2f6400646b6488cde0330c4248a97229d6a9a202f445c83ea90b2f1858d9a1d3fd7d9e12cd53ecb685b5423474d46870acfd772b0a4fcd725b711c64b2ca2c4b6deb7c78808a79c22676749b214c068291cc4904f3a61c72c540c361d7d732332bb53ede719f07ba3b47aa6b9e79a629d8503d01a3a88372029643cc212752be7cb90fbab2eaa422e1ddafd93c1c4d85b7be17614d167e72aa00ffc254bb6238d712126114e8cbd5c83507c8d9b7b5f1cf924301b7beab7251c8ce8870c476c0b7a2f270308eb87c4472795be529da61edf9a2e07365a8729721f05046e841727465b717bfd51cd036222b97cff8a7d7e3dba6523fd50e53f04ce7ced37668e12eb3b21f4f38f373c1d1fecc2e6df36f1b53e6c0dceeab723b993c2bfd6e0355836f215703556edf9aa9314a87d397d893ade18d33738e72e2fdbd48b6055d310edfc51ba47a4e55c0e8acec04163a73522902de373daa72c8ee03200ec2afef92d45ee16a8ce44108481f4a0ad91349df4b7ba71350ee72ed92c505f493962e9999751df24bd1fcbf4768d1f35e075061dfce91e2bcd072be45f8a97e53adfb19d15f595be2acafc28424fb8e2121cde6a1bf145809607239b507a69ef295c2d55124e992bc23dc4f0f19cee1c69e19b43ed4f83e6575728dbb535c7521369cc3a3f6a53224907d36a2ed553c1912c44ed9c34a727fee72c23f977208008409f9fa158b21ca870a341e9c5dfcedb0c432a51e79c55df072ff6acc0da7e580bfb4d715479348e52016386203e54f891b2e71abeb160c505589a93bf6df21b847475c89ee8bbe38f290666e032eae2baad646b706b580c20896f7c31e24f3fb0f0b81086a872aaccf1f26925af9dc212c7a10dc99f6478572c4c304ab99f4461c6b119cc42746351ad6c19c21ebe719446073d33613ad0d72d8a5ace4644d9d3b071f1986d3ab84c917fbbbdc809aff3c0c577ba09b6c88728842198168cb7a2c2d275f61693e249230dde2d13199132995bb45db2fd3021b7e2cb6bff817681b4a474e02528f74c5e8fe850a91df113c140e8957cf42c3512e2dc16023e2f3e9b9f8295cb8ebd86e75bbbcd1332b65a5d85cb7aa4f1f70604e32fae669f6c1e182acbdbec9c636b9d8e1fcdbc69e56ad14fb680483227f72ac2c065c01ecadf1dffd2209c9f2f4ca657b595d0f6c51678efe7469a6b35a72303d85cc8510417a97395cfb453edc965b13d21f18724fa220d18f33f7549172e4ef2d3ef6618ef0c0c7f9cb9cde877606870ce0daa1bde9c66cb2f26154bb17d230bde7b19c8a89b7cb2e7b1c9b5f9a86d66c2035c8d6f6294ab13e1c22d76b602a69bcdc8d268cb40ffd57d2d888ea427d75cee97dfb867e32b1ed47989c0068bf82cf116204f1ac9f8c73bffe36208100bb65aa1f89050d4abcecfb6c3c7283ab178f2c25513b5e008c3ba67ccab6802f8d13dfb2a04733ce9e2980b8983a9ef99165563af696fd37fea1fe6a30af5da82b8c34cbb9673c4fa3287fc55f5e0140e7d46c428fef3664a9e83667281c249d849f4640685558c827a1881a3f13d3fbae79fbc1d7960ee67aa3d66fc00eb8bb6375db2668c9248c1397c7603b72206414c0a3cb47040d002ed52592cafd5f581b21322a379d224c67e9b4a0b43e0542b652e637aaeed59b2688d3e18a0c5dc10a3099ae11b5cd33099a17c055365fd3dfc1b59563a93ba588b67e46f48bdfb9a789c320dff51ef9514b5a6d404252848ed881e65e609a9a962517eb7a1c4549f3984b002dbadb27bf2164dab1401e7630d4fed45ed5a0a7e0ed24214fb1d00dc8350cb0c771c6c3bf5e92924372a9cb956a0db2e82c226f1ec1eb56433222fdc7860ca6c12c9666d9b2abb4837222c36132ab6c6a8927b8b1e8caf3696ad84d327f00b61cb2ce8d9f535d06061e10fefee216b7cfd9504eddc157c4b4a1c310ec8fd850aff457aab2fe9bddca72dd565fcc7561cd37492c14a0010910f4a2ddeacdd2c5e3843f9ccc28e668c372a45e5c9c835bbb8f790fa713fb2849601499848da69a3a9a49126b15ef509f7276f7bde4d1b272853369ae0306518e79e1358bc3b59a3d239d81024ce6efc72fc1b542a89a5e8e7e262b83825b560c0fcf743e0d97cc3d829fbcf0b860f84e6c48122f8c00a8d9d027d4c12e6d145939287b7b7a52e9245428b1011dab91d27205748c99c9cd254179904e7fc17278e8e7c52ed959281870153df23501c05742ad5ebd952ede4525867ddfc7e4dec008c68a6818a7a8a5a7acb9a3ff7e28d10d75cebdcccb7a6d9842920fc4640c0ac1b8edebc61ce11ca2b6d830056b870608bbb4eb8516be1f55f51ed7a49e50f2ec62810c47b68c9a1a1146b83542244e72abc2ce52cad25b87081856572caeb1f3618b1460d097096ff34d5837d7050172c790ebb4a5346bea0358b1bb2bac7a8c4bb30c4906e3cc380cd4e2997cdbdb72a200f1535766cf483dc26956ecd6bb7f24aaaea8ef62c1dd604fa3be500ce5531e1aa397436034aebf760a9a2b920b47c16e937184f6dc31b7c481257457ce72af9efbbf6767759e83ac7fa4bc59772a3032bf604844f6fa8b08ef800d41d1721ae747ce4e09bfc5b3753f845a20a1a4c2fbcd57a253195ff1c16a405a64f54a3ec97e2e2ccf8d37e14c6d64f2d38dd0626844667fef28ad0a67271217b7855a341df8cc24bad852445e65fd85c82c986c8185661b140e5d15125dd18963794ff36092f525e1016d7a38e76aabb1afeeb754d7001c0b92a1ec94a1d8adc35c728a83784118090b5a0aeae15304e38ef8c1ee7d022583def2bd288480eb0e0a0ce89b55bb272f3bbccb68aa3edc9779171fec6401c7eacd9972639ad6358034726277bc719488b3dc7a1d240a74d85dec5baa5f0f9a503a2cd992f23e85880b699b8c36c43a1df76a3952f7fbd48c8687eb956fe06ec271ba095f55d1e0d49472b83ce5baaac55eabbfcbc4d8a7204a598c5100ee2a9079dae7c3f221b6f1c66fec26bd48ce2c63cbbbf6e541dfaaa70ffeecc0aea475e5f75d33e6564502ba722a34a3ceafb2836e8fee7182e431573f533ab027740363c4282073957084af51309caaae9fdea6f622131849b945898314d5cb23f8da5c5b19a06743ce018239f0fa55c9aeb9303e3e502bf6545e6b39811d943fd150c99d8574103657e9fb6e579430723084ff4df8acd03c019985c69f36a83e6dd63457a80de4f3b7e30772610d8b429d549ea0c4af0888408426c3d7be883f282502a002d563a8cc8f3f6e0f378f5481c176c1fe8b44c4e0224b8377388b981b1cc5459e9df392be68aa725ed56c9f414f0980be198ae73bd84243558304499fd1702eaafca56b352ca52daa9c6541c01bfeee2b2f5b75bbc40255315e5bef73f1e268c1a65d29d3f5a43f5471e7f83284ad699823609f82d9b3ae538e5522653391105ca415fa90c92c584e4680111b64da283a064a2ca8c1a5f889163132d4beb19680d22d66cb1f2e727377a4059a9b66de2776b69ecaecd8dbeaa9c4f2e7c94511ddde1f9ce399015fb7a3cfdf4cbf6ef2aaddaa79851e810069c6647be2dc71b39cb19f5bcaccc55c65c020adb35366c199985a594f7a9b4dacce8cf248971ae862fc4ef00807682e14ab564d9e0fae043e8f9550ef1cad7d80f966744fda02cb352556a83806060af57c610f5afd84ee0be05e7c7df920c2c7b0c4f7520627107d502c601922bd3b21188c72d0313aa540ea83610265fabdf9616fc20b3a9eea0bc738c6d5aaf427273c92a2c553490f12fe7051951d0b84dee99b49183bcbe68cf9f60b04dc79728500457816eb70ac18c8fe7d8deaa2a66a9f42650a8ce22c39e82ea62f524535990dba8c53df8efb59ff1f17d36e9ee868f014e2eb325ade6a03a721791990724c1c333de48f69a5eac9b439d7a197c070fcbcf729e3412430477f77d38d1b720802c45dcc24b879e3c970ced3e7001f748e3d41f257137050245737f025be5c7d991220ffe045ba29cc1fd800657774f3dec7a64a5456c9b3116a7e4a97e272e1ce3ce520098d1a27aa87fad9890b64f10beb9753ae8ea0bbb885526e0d4672cda8b2b63b48d4a7bc710236f217e3294c27ff65bfc50fbcb23452930fc7026a0aa34f19ac4151c1fb381bcd5187be8952543a6cf4b90fa111c28ed8007e627223b16b8943948d3332bbfc9c5ad1e6d7430d0185338197cbd0f8a492ae1778726eb7ae7034af7f1f99a45746f3a5033f4ae1f852e057098a721224304c4c5922730fb2ff834814aef46bceabf72e359dba402b6252095f488dbb8c879cc7f972e087c6be2cfb21c9b46c290a8e1542d3af6517302bedb322ffdcd44c6d79f2727d9f98a191ed386aab8e1376a36b80a8e12841b746bdc98c1e1fe0b0e63b091715212154308590ef6f3250cc384657d229de1788b633279e2458800d511fea7269b330b15d69dea4eb17512b25218ec149068f7bb97e409c19fa1cc7cc8c4c72c68f1342700aa0b273cedea7028002277ec9a5e6987667cd2ea4abffa1c1ba6a82f31fb1eeefa66e3d5c995e1be46d276ac1a79aa7d7695b0f0a6d6079264872803dcbf2f210a7f1d8af90f7c4da0b1d40608d80b2eb2a2cf816fe48a9af1f72f09b5031386b9460a9d8c47372f039585cf7f0cb1729b06ab8b136d1d62b081e3b11cec4bc1efe924617eb4471ada1334e6b64c554a589a05d3ad6116cffcc34e329856153759ddb7f51365e34123f93e34672c57873fa5890079e05f8964250a10908a44eaa71cf189b519e0a2b66b820e414a5220e4105e99880e0de4dfe72e0f66e0957db4815423dda6e373259587ab6eb4577c8f2f5b331cbad783b8868dff1d6d691dcf7b198c7e0d9655d7370b0cbc242e7c7cbe199bf903d4979082d3320305a11effca90a05638e40e2e841a12140b38b38d091ac2b2663581b0b3a97d9cf5a4a8ca022314f171da5c6bc894a5f0781a3f1e11a9f8daeb43d47d572ce47795abdc37aee3d4c7933ed953f55c7ca5f642f29e6ccf3f728cf5796e47206f12a9feef033e9c35282d03349398c776f07b6f2f04f47de795a8ccb3f0b24e5a3885e4352487d70a18e8bdb35db935b8974e826735ed16463888baf1d506659d37e3a260738311259af6851efc2dc09c1c4eedb8e67a57b5281ca2a7c1072290b34b330b68f22bd2bdd1ae800405d8ee16a663a7ca26ef1f8749c01517672d5ca8883f9a849b452e00b37a33f94aeb5f861c6dc50f36c1bbb8cb26c2f967262cf421397f4aa8cc96fc1e8a1d0543dd112e1a8cec6f84645ba0b8ea6d9bc72317e41dc273fc82124597ba8f976a5241097a060c8085e5041bbfa04a00c6b646a0c3b3fc5dd956eb4be2a307432b204d7730cfc2fa54c8eb52f90b28805d71b359e06517676ef4222db69a82c84c20d72845e45635d276fd8c7db5d50ec00726b8eaa44c75516b175d39c4ae72f5a43b9ba28434348c59ffbccc9b4486096062e1305d468169636ec8911ab000d0efdc2a48b87323d9756cf9bb3290e6cd91be679be6e662481b33e7dd25a4acc99787efce63d3b80cfc0432d37c0a302f037c8b18a5bffc2ec9fa08c966e619dc3a91aef0a6b26d7c13adbcb6d230def70727934d6051c471ab03a2cc085939ffe0cbcd8f839dd619bd904700ab9f9391f729c2aeb32f5793cd4151bed26a726bed6188f32cceb3197df08e3b8c26c6b26722863b04c58bea52f33bb87ae057267b0da76549af7af1630226053dee65b784294c11931943187f14125888c4d52359b33256088893a4c78f2aa541a927dfb72f5cc77302ec0ef8bd76a6933bb0745f72150e61fb8c7cea27836419a1afa8b7220f6870b16cb0b2dbfbd2bc5a94d544039d4b173a8b8f8b728a26fd76f9c53729ac1a9422a4c6224d9de1189a7841c5c65f981b47a6fe458695b61f785ef0b728a9a6e3bec83db690a64b23415781e33b14aac945a54e0f88a48f2b49fc8ba721a8f73f217085f165d5d41637381ae80a6bb21f3c82a3f6c96697fe03da34f599408960c83c69938f1a1cff91d67c06dbfd63616983586b8ea734339d4dfa8720ed81d1a71902c50c10abfb64afadf0473bfb07e02b864d7012d9cbabde621464835bbe11328957fcd144b2c783cc2585dec7fe06ed0db88b2a0ef7645b1db5a33b218c897e157a68270f1439a14a47ff49dd4d421852e3197a654f6604fac72ab2c94862149a94976d99973daaa7533f70fdb1edd0812d7fd2dd96812336172ee1b2225517a1bbdbd60947e586d932e1a17a626b2e96af6bbf9cd742b66b3150234804f7674060369ebba46415de5582d00b2ac9dfebae67d9b363c3f8ff672f970a65d59213c8f4be9ef794d2318d9b721f8b7887f82918db3dd1f339aa55400672effa3a747dfa4f11ebbe23c709f0d5b9a8a67eb4908c30f766e5f032272ab5adb0afe4647927db8d0dbe319b91ecfc5f171207c2e0cbd95a46eec03b40bd6df31abc3d831c39c7785d8ec35c5ae09b3beef1ab13175feb86945e7830e72d0be10b0a0bbf983e5194c60c513d0fcbbc653760db6e6cee3a21eec3bc45250a997607ed2c0bc9ef20c915c5896a0c9e6aaca73bba96d80532119176decc9722ab557a11c6fb54ac32e933e8f268897d5e56af286a62e17e8cb04db6e1a7c3ebb3af0606a636f2a59d2d04579940961ced871d8dfa3b41247997b56878c201b3dac5492d5e505bc4350cca136542bc5a1474fed227e109207513706dabf5d5b3ac7bfb3cafb94f18755487e968f36c6cdd0590238088313859e1f535530762fa8b9906b5fa7bb4be71f24165faf0af863924281139a4b8d798bb558d8d8823b2db25190ad18d7e507449f1ad25a056f23065891f2af885c5b16802287048b270b3070d73583975d5db11c93fa2dca93f5507e1f8c07a083f02558d8430373724706a92e1fb648cb3960d337dda77337d382cd4f338df535f22479fbb4838672d6caa81ee921fdad59ef75eb48b4d03e278ecc2639a0dbbc44e886f5ac93ed72dc2e5a0446d7de370c19f37f5c7070d3ae49a408adc1df2b9f09d4a0a41a9472edd8ae938f6ffbc5f3eb30d69d565848be523201a7ee43b4ee4356ef35f74f72646f195e22e7875b20045e80925b02c7318f340b0d0cc137816052961fb65c547c4721935644ee13477b8dde987f0fc9c5129d5d5b1e9103eeb01da89cb66572d3d9b7d12f0b3e9a77d3bb5eaf01d64dc20ac5ca7859715e714a7bcb9ccd31723c6fadf4d358146244d52e3bcda665dccccf6df0773dbca1a96e8690472a38727a7b37a8bc7244e5658de076b442cdb29b5377ce591b1020eef95523206fe6048d6841ec968d0b42dede18bcf4fcecead470822297ad808c676ce2fab91e5e72bc819468c1c7131440235727a2ed421f9d3b20275c1c8928a2b1b3a0df77c41fc197cb88d307c1da4eb1e6c62065172b0d7da0eadaca13306dfb23d584a70272864a7f4a6e431defc2ea0b30c1d4216b58fd33427d2a0b296c26c6648cd7cd1162e644e03ebef0cf362ec98b1e88e191632c87f33cdb2eba1e66184243386a38685cc992bfe88a9af6a554c73e289c0a8178c7572c67f2633d511ae58baca117d8ffc00f90ad37981f97c654bd9e021c6b3a910ecec1e6ce5106a7b3b33d0a7276f20edbee8ec92804ee80120e622176d4581f887dc36de2fd110c29f7cca926c2dd016f22c8cbdc2cec026ca8a5942638f171fef1d44e5bb34293e0648dc63b3ac621bf10972118ac38388c14e2abf2fa479e6df6010f4e2df4795e79795c53295cffcb638804b352b33df132ac3645f930fa61a7a9757ae7d93b9222d26772e1709a94a578789fd99ffa8379d38d0b747bef0f8eee252628b8adaff0869b33464123ab758ab3a3f61a39aedcc3ea0307d18fc80c17a36cbe0eba80671629720274a83c675a105227b644ea340401431ea911342e90d878137ff03414bf3072822d9dfb5558cc76ca8d676d444679205ea12aabb89922bb983acd8001ed7272669fe7a6980759087de80730bdf001c156c4428eaaa51e009b8cfa30778e5112e349cbfdadccc360e2a65b2121c30a16ca5cec2500adcb98f8a2fc74ebf7461720f5dd5532f2fe64243cf751fc0ebd84207cb69ac300d788b04998bce5c4d1720399a73b2452a244a476be97a55718136735f484ef1895177b4546c67965687227c30b3c45253a4ae6e1fb3186d442859541a0e2db8a836b088e14fca0b6d47227630ac21f24dedc37d62a9e4848e4a2d8275e6b58726f8d2a50da07d0e280725cba412471e407a60d77c622043416a2a8fa2701a687d7b319ef249f1ed035729a34a12f461c4ae1c68345547def7fb0db65406e74d01b3f5ff43291ce88717297cbbee9e20e17332956ad19ee8d55ab7efa7827b1134bafcb58079ac9d23d36dd3cb8bfccde680f2676eba916d437aba323c939a58a6116a39f10b5105dd86048ec006bca0e5f157d5ab38f189510dd6cd5fa0227690132ef4aa240db014c625b6ef4ca31c24393e452a84fd3975c36b07671597f227aeed271563e90c45c7266fff8e5ea60a2a878c9a53f9ede8b0858ec4af0880931bb3f553a518f38b17219628eedc5aca3ca2211ddcbe1272c80a030837d64770b4463596a5dd40874721fb8f0af8f77556a43ed973c58e5cc6a66a347132b554c0cf710d7cee862f8728111c9080a2fedf003b6fdaa610e6550ac141e74f549dda188a3877f2b834513bafde168d59149d0adea36538db35b27cad23a747b0023c7b159d9fc2265b136aeb9c2f12a82b2f7e1f7e826b1845b8d38727b6cf544e2df9939a2045ebc55725237f7d32226211782d328081283c898893f4ab519e128e5a51247a2562b191de4054b8915b87c488b03d9ba28d526beaa153241e859bb013bf1153dcdb6326c98291d128e2c8cc454ee42462650770c4fed8e960d5ef5c1f329a54609e1266ff4d8b342491169f75cab353f99adc3475a90b1d57ac4926beee5bde3096dc0723b893d64935529444ce13b96a41b1c727ea0069a7171c51b2c99d72395629372d61041f4c25bcbfc99657e16897ef3dee585275cb1972e43e761cb1107b3fb30483b77551211b39b9f9a5f9c7d5c1167c4601a56e49177f322df8a8b731b75729ec326e8c6be8f220e8395b0bc06a1c89c50d821f939707f8d0b1831fc046b723db19abd935e1c46587c8aa8ec5a25a65bc46a34be9dc9f6eee68fc875930952bc14e5619aa9ce9ccaa7cb134af0861c22fd6df5be81bdcb3f9776eac1a33672b087643bc6f1766b00e066ff4665e33613159571d07b5d8c9595afdc9bdf30728201c66ad25514fc14f32d3edda5330da3e5cda0cb9170e0521eab2afbb91372db56302034678372bf296a9235debab9d55d81bd3681829faeebb5c4344d0e72116b7964731174423b6ff3cd62cc8c4df7a5904b7628291b9e2ff24ea044447216178530acc6fda234474303a970f6b0a9093af308d22692a7c89e6dfc7f1f0d01afe5748c38a79863a4a4815d3f0ced3852fe8e8d15bce374f5ee4aded8b60382f7d5ef7447439c26cac1dbd5799c5da7a2099908ed63f8795721be37bbe2720363d9a3bfd9923d62b8816cbaa0a576ddc850e9eee00371b6d167097bbbaf7244f0b0bdc42b7de08de8f4f72abeda4ab6c5d82f0b3cd9b834b603003efead45096f0bac0546988e3a3c3a44e8499027c697a38814ceffea6c9bef82fa07d372f4521eaa8ae9e28cbdc2b92af5195dc449fadfb9e1864d07f9b001b0cf2b1172f92cf6693692f048a14a276ca9b2783327f426ed86dc7d9dfc3318d60b5fc14daceebba7938e60c1b09f3b578acf318736c79d5ce6ba8d4291e8fb7fc5ffb472052441219bd351049c685a664fb305f80bf77e2a29ef96180ed63e6877b46372cf0dfd6641b786ddb5423315f98823b5df815d2fe670890cbbd0aa2b77dc1272a22cc39ab9c2cf557b9b983f13c9e9466688361b88aa9362d59779d4d0630f727c4be07c879c0f4c3fa127de0fd5c028095563f0db748c5f0f3a5c02f8cf4a22e5b643015f3a5b250f1de8f80eb3a9fb80983d5665ee4c84b5f384d31e0f1a1294fe8e4886d1cee8219c89661877c1a95b3b06226cebbd50c66beb8939e0ed723780283e317e93696aeec52e89cd2053666ea3334bcda0b2791228995bb75b725cb5da4c9bacdb836293a491a114cb6b4e1df2816dbe2682d17728a6254f3d253d5836a95417fc82b6ca00d99c08ccdb75d0c516d9eb0b5dbded166eb407fe727ff0ade8ba0bbc3f1d1b72680b9213c3a16351968241d43820574e12f8b14972f32e54f0b7a36335972c6e82df67727ad40aa8fa7b9b61a596ba036584741e721cb0008f5b1646fccb7b10c0c767fc5f63a6142ac0ccdc0af75adaae04cec97252899a05bab8bfa6228e839cfdeafbe1e92f8a16afc6b9e8b9f772abe472363434fbc5a3dcf1a55d12a55dd2f9e51f44e93fbc1dac993bb1f327001e13c4e405149115df83d9534afa448fbebfff0e6b823eb0ce4d27bc167db0b447768f8118be19bf2d0ebeb0bcd110499b73558a1dd4eb026ccf9bdfc8f72bdb2ec6df4b727e5caa7382cb55ea839fa38323177c3abf6bc1432e19c52a8bb1e554ee180e3ab0bbfb1617850906f48dc3e112c4f3702cef57875eee9b4d92962eeb0934f87288cb511e2d60f7fb5b260e9a9f8d74d8034ec58385dd85eaca1dee4f97ecdc4f16a05ed1dc1aaf0a2b9a31fda032fbf93d406b7e7f3805a09cce8f3847c9f7726345cff5118c6ff5380697ef033426ad15eabc87ea6fd5937f9ff9a7626fdc6add5199fe01412e8753612c9ced2417090ae27d0c948c9433fdddfda8808591647ea48cd5bb647dd861939407f383425072a1e84eb7505d6627e599a60d440803342e009a4c277b3da6749cf09767c0dde220c75c4d0a2a8b5df44786e8c6526c0243c34ce6cbde4b4cba3073c37585f7b34b11a6a03aa46165ea3961e889fc72be756148f2f5085cb307b17c7a45f5c447126d8bca006848a55de0f82d2f3372c8ee901b5087026042c94a0ca964f3390dd31e6e9a5df3a8e09cb64c1c2917721cdf8b1bb3a4c063d395b083983a501ff995b8d4c437dbc2a22d1656206be5726aacb91bc730c0f6d2b5655bc8e33cc733de3dc987c8a3594cec347bc1e36a517b3eb22e800fa849951fc9d577407a58ef4ecc3945c622f30cab9a279e0fa12205fa375b52b15ae8115b6c2d63c0815329e1c7631b3696bf68eec9c5a1feb0729d27bb386b38bf7eeb6bf8301fae44a1af0d7f31987ba97618b4c320061b43722f35978c4d8c0f7d13afcaf31a39e2a3b72031770644fa7e67be611ae9e3411a5b146b887b33030b29993ce82340c094a76562c7409bb6e737f6f0cc3c4bd672d4f9a384a0419701e390985bc0f4a924363341f290fedfb2d4a7e384c84f447258fe81d3d13d04480ca149a7d01ce5e8b10cc32834dfeacad0c3273d25a6f0721567b5ebb3b12f30619c4e80285473314a3f22605adc1e4eb0da0f3a6da56d5f42e9c4a47a886f636fc74ff09a049b4e1d273244a9ec3e5723b190ad9f43d82a6164ed612d28875db88e7ea1687cc64176f24a8302d438e2864d3e8d66589e0133bcfedf2fd1ef411516a06b8be7a724af7007f38641d68b852ec20ce2366e0b85a409ada581a962784bc8e205c8140d867a72a71bcf024b9b71f3ea76162b7221f8b9442a1466aac5a216af75fabda936b1f4be0cdcc14e2fe258adc379eb72e2960848c1ff9d457388cd9033d7c5819966c5fdc27a5fb61c6c01c4fbf57d72ec8f32d0128d97f3dc2ceb2ae744f7bb774943f73153014ae9d4ee2217885d7207e9150a6f22536437c52279b564b6ea9b13dd192cfb68a3839620fbf8677a531981b2a8869ea24607f74100242f09d3113712f5a713be85c96373a9be18843116a1dfd7945350568c74a5acbe129a42dc1aed468d708c356c5ffbb7a7f8525378560533e0ba71863841feff5d9787621bf193de2343571047fa6e3315cb5f071dd301b46dd59eb1856f92e20639ea85d7dab5235497beef3cbaa008f6f35e7226594fb4960bbb787319abcf57f3fe0999d9c475763ee977476584a2f9773872244122343e85ead9a862662c9dc16280094b5c65ae7bcfa4c96d8518e6990f22fdafe932e069ad8641c7a13393efe0a9cce1dd8757d9feb0e81ce9496504e5726327e731797158de994e6eabe6d9f78f849db720373b1c6f2472c2ce7af015444cc77fdc4330ab486ff16c319b1faf62419f80a547f4edb2a4ade27e2be8ce6d2bb8fce7d3f36043486c9d43ac52ad87f69d0d821d550494292accfbe252e572232d975aca75d9d4dcdda01660404ce83c734c507c36fe7c0b302563bc838b4a2ba2be0cae4ad5919cc9bc7e0d21ae4093abf3ed102010237d80cf7a9ef1715d160b10ac3e8a72a627ab690904596b3ddd98545f845f5737ee78764135f1431c45cc10c889a6fad3ac0dafab5988648a2c7bf900e0bc90c6a0dd77af4c3fc60d00e4338e3fa815789e4c42df87f7f092d9f22994af225c97a84ad7e6f1620f72e850b8a84501d0816e4b7ea0b24d6f659a49db3aa0dfeccc9c9c5b8e5c116e72790b5b7ff94bb974e8a8f074352e796828ed7dd49c8367a6040e759204e9d672237592be6f6089a65c9cb11ebca632747f72870b1f6fad532b5730a95de81e2f4fa105a5d95798720ec31263b8f4b2b297197bfbcb3864069f05e7a1639f691af3a5c94bfd998f8263f24266b9d86c91466e99a2e19f9ff61c5e1179837ba6728b37c78387617f2f0d5fb1611aa4bad650cbc7415afd25bc9b08fbb676188b72fb36d54bf2df02e4aa389d2bc242dae2fc8c585352971b37a7f6f6987c9aef3717224572f16562bee8ee6c8757d8da8a819c44fc49217a0ce6fe1e5d936061726aa64bb50241b7ac9729d8a05185d6c7541db17973bca681a0c917df6ce01572692366fe875673b03ae54f96d972441dc6bf40206179b9c598973d853ea5f30b4f9b5663e154a6173c83b1125eede4c96da8c3c171d75681ad801ebab2101b72cc6dde5d5cbd66a90a59348e8b1a57c9331e9e93195ca7258f4696bf84b3176b240be92fc8816009f5b3e61c81c0d59191d1416294c054e48185676559aa5272188a2171bd1531b64f1513accc866a5cd770b04e583d04ea96b4bb618651a959396a4f9e48a8023c73fa951c448b76e1100ada3a98d63ce71f9d56d100dfaf7251d789a58abb765dffc629d8f8c252886fba535d813915c726063517d3e87c4979fcba6f2e2a82ec174af2910cba44188bdbf3886c6ccdf87121b376194d8e1ed0ce19397e16efc9772b10dc177a2a6e05bcca2d98eca9842f8f344c218b7428244e8b5dc05d403d58beb937cb71bb0a73edc700391ba91821d59cbf481d09723b3041995b4d3b672ca2b04982fe420c9473c527a08d281436e6b781224642634c1298b6af99a790aada830ed3d2db80cfe318754cc31f1ceda4509e353d6772bcd73ca0083cb90c19052da77a98ee9a0ef980aa38ee33907971e476f6b2d14c624393d6aaab4044f4e0241d5c5aa9428eb7e7ca026db20b399a917eb525541083f9225eb50786433835b668f35a045498f98ba40c48fa8621997a5e07ffbc72f731a70478dd68f72f98b612e2a2942a2f7e27a42a84bd1d680c45b48e4e007283c1909473de6d33b62f861831382c1d59ccbe79e25012165abac273146ed426cba2b879030bbddaec73070d8c0ffed9780564d0ac6cddd5e99af4605517690cd9851eef912c477b8a85509784bd028d73f50612716dc3be5c1c0b03aaaf79726d962107b4e0967c8a5eded4426fa3441bb8ff81276a7d042a99543eb383330fcbccc26adc76ecff8820b70f5ed4c979f1413101e88b53b00269902c89358720fdbd173e4ca088a31f2a51b955e59fc5ceb9fc401260b62261e4bdcb19df3072d5e4ff90e12eddc4e3631d2b57cf5a774c17f5e346ed30b34d258e69642a1b0f3b61693e89dffc2b8584eb3c537ec6e10e376b2c5a8a53ff7ca55717d93d7072707c94b7736f506c69ce99a81f5699596d29aa1b48efc21732fca02b2c1a1f530cac04df11c6f0c25c73d3cb0bd12dc01693bb102ae94ba4ecc87efcdc40a55a0267eee5f00f777f018156b8ebafe499f513f0228d5762529fe3fa17bfb84c0a75de4f9ea352f4d04e3108f0306a193fb9d035f41cffa8acab1a51063bcf457206934e3e038c33c9abef1b3427ad09b09f8b62c7534f61bde789036325071138ac7ae91344e9b7e240946d964a05b7ed88a91e75c25145e868bfd0de72ec8572da5ad15bdac92a45c9a175bbd8e82fccc9be7b3f7ba5d8238ec0fea7493aef7292329cc365b07242e439d63421d4bbde486065a74ea6d3d19471fe61ffb13001468c6a4f0ee74f3eb90ecd18185a0988e059fd6e335c974348ef04a6472a3f4fb4f11d48396d89a275941df0f9ddb2ec9238ba80fea5805ad39cd1e3869a144aeffdb8b7f30791c568f106a997f8b7286419f5097b6deaf0880a1ff5194b6a71687c35a0f07744c321fb8cef6be00c54ad38a71ec447e6dc14c02d671b69f21c2d4382ed85a23fdaeff835a46d5d4e5f67300b1adf33753683546ae7e860655d677326ea89a184e4f2429ec38890ac6d2696406261d6d3268e0f61134a03476d5a183cad0b8b73d8575225b7237ce0d039e288fbc75edbc91f2716dd3d04f072e14cfe4cb7915622a3ac624aff1ddc6fac0446865bb3e27cab38de0ac359bf72d28daf66b62e53fc5be0f01911f46469ac1907d5a45894057c0ae5d95f8813722a3203595f0c2c350dcbdc3986b24df55939f7758a9edec0d785d6edbe896e22d451139d0e0e3156e1c2f6ba925bbb8dca98c344dbf93f6de93c5f085a1c2672a87925e16c3076647303ffa1b1b585684a3320f49587c148fbc75d6e0095a47226ce306b6f52f8b3f490cc2cf79d07bba7eaadea4850a1341035e48e14dc74694817f424cc1c67dc862299bdddf01433d5f6b1ad80998f13c46adb93405f3b72fa1c3a8b80147450b108b1be2d94ca25686bbea7bb5997cde091af117ed2e8124b60fd4bf5ce0064ed6db7cb1211a185e0efa7ca4b2029279d68a1fd77884a434a8f21e1078c25d0cda535bf77c3ed7fe8ee84a7a452c9f3b3f22582b46d59720935ba7188be8180304b8ef6459184989f1ac5774b6c4ab29c4da2bb038582275f91c5aada26a3171141a11b3ae5fa71a08c26fd031bb48dfc1c359f72aee765949301d1fa1160731663a77d8c28b081149cf57f9bd1c12db98a8619351966728bb7223f4febb272829e9ce8f87df15b844f4706dc15915322d39ddc2fd8a572b6edee5765cc9a67c3c0bc056a3e29715409187266f4ecb3429baa7fd5330f729c194b447ae45397790ad5d5f6575b2da1132572d1dee9bfecc8d7fc413277721ca63b5784bfe7344dccd4a837fd44c85463d0b3a877570ad27ece6641d21f72bb9df7e2c6eb072fcf7724d00c3821f0e3cc7ac03bf7e043f18a64380fe1a972001b3ef171abd80f6342f328e62018601eb17f8a067b1ea7736fc7548e15b6722a02a3d2cda8912defa108cb9c89b6763397a2ba082d0b99d0e69ca9c3e3de0c3dfc4262b7c1e3de79e10f643b1b17cd3c5f055ab39107bb84b3f296a842306965b1d1c099f2ea0a2993cc9669638034612746cfa861db684dd81f294cf8865124c6d6a1d7f86d874d5ba1060daa0270ed0fa7e3f56a4de6ee6852437d570372060fd149184b829187904950874d531a731d9c40e36c56b3b86ed90b4e578614b919be3bc943a6b8fa819ce74530327197e9e322cd6d57cf500582b63d4ec4494fb521e15bc9f721f78ef471e30f408118b771e8fa72b357f7c3c915ba5d17729d994b981645e8e432c1c7fe918f7bdc54156a77d82ea8ae35b9f764cc823b72b239d7664b4221525ac29ca4adf2029c99f405482c39028aea4afa9353be28722b61e519fcd5ac8f4ac8aea57f9af3747aac7ba344938bbc3cc24a29e0619d7224aa6fd65c62329036f266650207df325ba49f54981b8bfdb7a39d124cc2d972686f3e70bf2b380c84367638107ee69f9b5021f99c3dc0d85272066ef816ea72c26fdf4cf711af4c2f7262acc955090f191f8a14eeaa8f8ae0bddec4c85cfd725cceeb59092dc3410c2e4be39a7d61f5a90d2caf8bebd39bc69469f83766a06982ab6ba899ebd3369881dba6160aa438eb58f2f82aec8ddaecc386b44fea0e728ed59be4754e083a40bbc8d9cfce7c6a8788409c31c81e10d3de5accc7fa0272bd96e1f93850ed113bd1603d23fc67c95d5925d2e7a1b9517502f792c6609672aa6389fbf3abbca1b1919667f36f4491ab06251c343e4d993910dca086f67e72b45e922b48b84163b5445742b2770a4e5afe77a1b1deec8dfc02f27684af4b1b10d69c0fe2090983adf57a4302dee47818b6d5f0532e12f0fee95d1e802cc572b72205260a578d546362a853c8e088c60528d998b2d0f1559039353f4c6976725b0179f1784b9f13edf0cfdfab1365ef466449ae080b8998a10c22b157ddf772c7689100d21839c2745279f1bdf4545f8c6525a4c0a6925cbf6030885d877472bb605180cfae8669b9d636cd981a95dc8e50cb24df63bdcf36c7bbdcadd2c072511c65a117517f634629bb7c3d1d4e9dc8a74a5e54b2800dffc40e3ea3cf957267e24c0f2a539959e734b4fc3f5e70da57ad03d74b26202c05aba55b69c2960553e2431b4be568382eaefb2142340806352206eb200adeca512bba05273c1772406db48f135f419f01fe901a3c54be0fbcffaf46ff9fce1b88bc95da9aec487208b3cc1dc334328ba47caed31eec448b7563cf4caffd36cd27694818b87f32369c299541f6fa212140497ff62f44a4f0e686804061a8147c53b8d170330e2a7243c30aeb1de3848e310e19f4bde5890ea59de47fbffd0fa8cb917eb6bb0a59080a40229c16d176a159b1a38f5ffc97be9917a074489f7fe60a674821fbbff14b0f573dba5ad8b38f92789fcb4d31ae973a050fca0a491e48b44f6978b7066e0f178b395f78fcd622b38ea48968b1552350e5276ea7e97d2036ffe2c4d349672202582e05ec96d90a1bb253132424c51bb4eaa2219ac40bb82763193b50fa4b72e1a3f6a8aabe005d71eb4ea0655590ca5d54e5f3f9844fd8bb30c1a8f9ef41720f0ef4724181d4553cdbd48c564dacaf126266dec785fb1ca744bf7976636b72c35e46f71bb1ba909a7da44efafa2ce934c6b972ef1242b0a8cbe2f6c7cc8b075abc22848660b24da874a2e85c60793dd30ddf0da2b1d78fc9ecfd962c8b1c72632e49d49b0a78348ac0f8c5d5f6ffa8c1ec70d8b13a9ad0b3ee7abc522482612a321b9ed9027e71787795280604079919a4727bfb4d78778d14c3f0d4fbfd72d4e72552b89e97aedeab468a63bf91c9f38dfd025d921e627e00d64ea600c21ea32b0eeff6f55128afbc772bee8be9ebb6527e547548d76ebf818b7bac81a3556c546175c4fda21ab752ee0a14c3a8900eeee1d959657eaee213d0ca379594726c6b0ade3e050f8286e5a42f7e8cf869c2993ceac1ff920dfc2abba5a279e57245835c185b3da0f12c8840ebe5ea6cb00205c2d3d29783ac17fd85e3a5be9c6aa0e9cadeda04f5128a991e1bbc79beaf266912b31fa7328abae69e0cf4349c3e61b6c8ef66c18419f7cbf488f07ab8c6339eb77bc689b0566fabfb1d9db3fc72b27ed22cc2b20698fece3f60e9e9bb8ba646f2d8e635136d008a313efec23c724d66045044d15740a114ab8f532ae4f39330e1e188130c6d03e12cbbad24ef7220522ebc803be15983c71276d718e905c63b1f7dd8cda3ed3b46ed8bf18edd723ae90b9ceff10f56c68b202460ba413fa4037729780e86d1cc8981c98f9cbf720d60317dda05c4631db196020a7737cec524bd3b776f384e810524edf471e97245ffa7274d6be783fab20e757fc1cc5b0a78cdff1eac8017ce048b0e82c09644e85037d58dcc0893794a4cf18e8b6b3bc3ff619b5469f747af1d9385a7e74b7276f480140e9294dc5e97bb2dbec71a37b409f80cc0664fb4117e12d3e0f68a726e94a49b3fc13aad70f835daaddac7a566abfe3d8a26d47b5e8b616aab6bc172067fa1858787d216e6684b856e65638a0c24e65216315c7f6327922be3f0454954f0a6b552cf4e91ffa7f57e6fc495b607f72dd2ad86c1d1475a087c9e96d172db712e903875fc5cda67f7dcf68f95284283157f34faab07ad938c9f256bf472c14dd32e4f01bc579aabd2f08120655569e36cab0883f52d13065685a2b19672308c6e8b488b1c9ebebabcc24da00c779912aeb43e966113501b730c9e8dc75c8d915d75c98b5ce573b27995caa5bfc4a718ce72565816fa0e561288fb06e972fad859d2ec7bc2bcad12783f74000f5ee470a2f5414ac7dd9fad1b2a767bee72d7a485c200abe5f83067e034ab246b0976fe4dbc239850e2118df3a209fc086f94fa6d166a29a16ee324e1e25dd61f88341c5e43f3068c101f2c15e3e95988724e91f88d35ab03ffaa3732b745c9c3d52f6421ce0b3abe2e03b34171f08205726130f6d0a795d3ff2432a20f32b10a8e72fc20d43ca17c67151e1e3b68814c72086f80733275ee8e8fa99dc38d564fe651cfee4c420c4d1fe45fe99f3d17e01980ec2661b8a7f238f37593a6860c35c84a47020fa698d279e11a5e94f51b0d721b40b935dcda92acbd8c546570c0bde0ab2928d6266144c3a40b071b73ad9918e7dfada62e95c8663602e16831448886cb6409f481988287112a0c8ea765c72ddb71cc73be64109744fd06cea82391e436133b32d04558d73727d14143e95a726264537d6a1b4be54f4a94ea514182da515ca14f4bdc3bc0e832b625f61f78725a12ebc820db2ecbc38dda414b63927b9af0371dfa96c7791e264176f18c3f30d1bf566f46cb6095c8526f4a9b63d2442c4f2cf1b223d0aa7fe1b9d078057372c47e11942cf0a1281d8bedebb2ad74bcb72b695273618e00ef5b15ef7075c932e86451d0eeb820531ed58e53142582d36615ebaf8aa109bd1f73779e9fae71723a4ce44cdb1a739ab35c43939e8fee04faa77ab48afcd5d04d289886fd9a7a7274bac043df801a3389ee614c4014bf87bc2b3e5ddb6cd6e21bf9804bbae15431046cd92ad0907277814b0f17c29dcaba2534e3fa5a08c09a38a046d8e4ff4472398a99536175c58c5ef6aa8abb92a641054679ab5904f1e74b04e5c539349c72293d512a23622b027f823d06dd22a797bda4144c741827069f093dcb2d5ef272b84f9a12a6763899a30c2abe23daeed5680513bf350833d211cf74a86658293e27ab5bd078695e7ae2834fc64eed95007473c1e324cdcd533e655d61dc474e4bfa821875a98944806a009672bcee1dc4a9bb998f3eedb25aa32ccc8fb1523f729676b13de12139356b50d6f12e151306498cf3afbbf506638b397849ccdd15723eccd291b3f803aec29c06f121caf6c4b69f531ef8c5330298b92f6d70eeff0b65929233939b8e0550947d4baec8d508285f50e884418527c6712451e343d6663e4b09bf540002dbe02f1fca3f89480f44108e5b073098da8f4ae83510d0c61d5f5499ecc78f063358c63a2e9fb2daa4921538c254b687b14e81a03e64dc79580cb5ce239fcd7a0ad5bea49bc8a2d98aef94fb3f400c1c37ba9d0ba66b641672fbe1a26255e714756ea71b16c80c82b9fd2965795e83fd56273c2e1887670519b3af0ccd15e3116545c422f0940cc1e1283fb34416693eac9d1ec46b10f11472037dddcf23f89c3cec080fe14b435e3226b04a0d7d707bd2540237dd3abae37243755ea8cbbcd5b9ca4f1bc6c3b87711e0f7c80b4f7ef37900e51db9f9bf94277c30c28064d1e1bad05dfd120cbe4a016302a1286776e85994f9bb75c5532246d704c00b41cf701e320d45fa0fd2f6276d3e0f91b4269fd4598b4c20928d8672347aa4e7df38467cf2723765e94d6b2a9b3808e5e535b5635f4f2f58cee2ed722d90bea89001200329cde2e4bc1ae20edc659e0dd1acb3fc5eb30bbb346418726d76fb06a7599242737daa730aa5b853cafcdacdb51ad8eef18acdc26e0cae724663e52572690ae7535b9a3171f5002d7ff4e2373a413526b222ad993b33a66939a7d27de4ea434674de0b2dc9c036f57bc9774d4da6f55df7feb3126ed88d1efdc8098854746425043e0532c225ee3580cd75c0d0bfb9215d3dea13de447f415f69b57c6273c1e956fcc642482c7a6a9554cd6050cc6c70a2fe0493d9fd4e7270816e40af8eea3d2164a908e697e44aab71d4444fcba5495b891bbcd63f684042b7d955bb8c678d41ff3dce96c70f73ff93f998eb3ceaac9e67f01593da8b724a2a1cc5e87e1cfe31b0c5949558b422313485946ee505ed4a00ef19fa7c5872126b67a44a77d5d68cb755e27d4ae99a4495f23794f9502ece8a7b07d3e8277268b58e7587e1dbf0a9a098eb22b8d8c3f968056aa5d08bf64e74d59d90b59b72e30ef0628e376be51777473e720c8479de8c7a883ae650ffc3878cec293dba72a39535d8e7012e34117e2cfd2bc61db120166b52e9cc4bd4b9816c121e2aec03929093cf2fa204deb60c42ba5627d6a5d5ab8c7631d3816b0f9c4c108c3b9e728c3e9e40671b500d3c2c2e108a781f16b87ef50359bae4736bf3be40ef1579725587d7f61a6e1b3ed3aa06bfa94e61d96932f43a5b9177956995368cc8f9cc72dc80e33e9f0cbc676194d2d86ae83098aef92386fb5a9270195eeb33720a7a0f5c6963ae1efc8d39d7bb9a132dd7de1a49c9722859573f10cace351e81d379628b1647cb195c067208b0586d96777330000170112d043559ecbddd2056456641303a66c383afbfd044524a4dc94a827814c72e406a00f5b8d7fec1c7deb64272d9ac0a2a921db770076616a50e633d6f8ea54ee26fb15ea114dd37607d252c72b7edeeb32ecc899f84a66b94bc5f95b25b4390a237f1abd6da1c08ab1f08d038a20aaa627ee4de44103760100d7da3361de87869f721a4f64a32d753d07c8c724da4e9cf7c476f550b12b9deb2e545aa1394afcd6a3d5aa6d4d0ff2cc950972c35ec0ec55b5b9be1a3ecb1f1100392426d89123036283205de0c94120f048d68b9c537fe4b7ce6d9f7d56b89f94582fce6a3e219666e94b48663965f95140f14bd72011d2c4851a3ba7778f44f4cb8f50c80b4544b877629bd0f0f9cedd49a720069814a718fca658fccf2665578cd47bbadd498bb47282eb928f86b48adef3d640696317f992e3c42fe1944d7258585c4947296db662409f1c904c82e930032f6bbf41fb79c1fd8871a7d4d69c541f6969cd329e57a446d22ba238121791f72ab42dfcd8e90dd2116a4cd47de7208d8a0ec35dce9a2b59bf2da0ef46b4f370df1d66bc46404c8fd125e3b3203a2620623cf707eda1956f4f8130823e6041172597e2287743c73e969662cdd1caa06e9a94ec591ea7aebe95182cbada4c32a1a15229eb6cd768e63460052b23bc8d1c85412d2c19d1a9d3479b1653884578464256871f5406ad3110936177e5b5a2827010a37ea6bafe37d5e65a78c67f74e427474a7d244180160505593bc3230d22d4a24538b7ca4611e35f26a3ef1a39e72dd2d432cbc385ffff709aaece082ba3d466d90b2b330a3c80e07aeffba889f119b962a201fdc170c5ee87772c62882aea344f45937f4409ede82df5e6c953a31b7adc94a86870f0756886d684ce3ce888dcdac746dd3a02efa436243fe00a8728bf1c30cc62774659cace7f90ec3c5035a0f8ea9d61ae3f24ca5f18d04897d45dd367e3945771eae5891eb5c3407a7b86e0b27db66b7af1a9e88dbc8503d57728d97ae2f59f265f4ff208e16a711d9c3cbf4a787d5c4e5daa1cefdb93014aa727f8793538ff6ffb6de6bf8771132e8bac80438bfe0b5acc1920a8d5d5fdbd1720e9870081642795d9c6d64b5cdb2ce40182f037e41b438b3108091603a1a46725119cac46317d264c7c29a834622bc72ad28a753db49cc80d82ab5b8f29124720e7a01cd60c9f497571c707dadda4cbabb54f4725de6002d00340950346a845af055430a292417ffaa8ec48462bc61175f555d581130b7d61c1acc7ec9079f57c029b94c7aacb17c99ca7c96f6831202deb897ac1bd844f19f347d1871482d0ea573a4770313d0fbf68de5d936d5ae2d870f44a2aae945238fb2b70da0d04b70c2930b2478f8ce6905188212a2f205ccf2ca3c14209ea80ac055d7e452c838728bb76a9d8f622e296b88dc9cfe7bede2450e4b1e99ccf5dee7cb517382eae67230345488fe0e48efb4ff642ec2785adaacb8aca43b9d86b74e217ac5e01cd70121591a1056291d2a3ca426f502aff0171a9da5f458e600754680fd717b7302071abf87c89051afa171b4d54f05320d111304d3229aeae67e9348cfb5c73a34489df4151c0e432615b367086c438614d1148d4a895280e3c791d524e39efec25afd51e56a9cf2aa92c8cec9c36c11f3aa2b675e38b19f3f9a0969c0fd09a5fb477aee2befe2d1dc5055eb9d20efbfdfafd0e462c5cc99135125a1757aa877c872e2ce9146537e0648e234bf1965787d5fea336589e150fe79aa590a87cab6b52d6dccb101016fbe87249802a05fd30fbc6b7e36a64833610d49666710b8b79927620925a31e702777bad1a9dde0aaa593f0ea81cc568ff0932eb99ae67d0de572ab18bd953507f3d82fe7ce57d1c667e5252a46a0256270d6a2995e80103d02721d12d266f23bd6e75179ccc681c0abbf73bf4e989d98f7ddf2216ef695016549800acfd0d5085118113e231fd302ec34029479c15994078d052d1532de7fc070d97cc4b7540a06ea318bae93f3f0b8a0ce3f7ca52939a484ac3379ddbbafbe051757be13a62d63e85c755a2c73927c695fa6b18bc4b30f799b2b81dc2e9ae872495849f863fa51147692c2e612d154e801015853249dd71eb7f3b2205143e6629f9e8535b4432e6113970cdcc38b17180ba52bc3e22051e5d549fd4ff3429d7215448281e6ddc7743bad9649eb5380872c571f7f442f3e46c8bb8c400498a072313d57b685e8e395f163d23608ff8df711d24516b3bbcc01840de1838d9cac729db4806f610f99f76a8ad10702f5fd0d38a8be34fbfd60fc4e22516b7a6a91716d60c5c1393acac31564cb30ddfc0a75d1a17719dd19986c87104315cef37c60ba5fe21eff1d4fbfb3ebac48357786ad65727cb1eb4e95efebc84d90a7b3d71bb4746f4064a92f67ad666c50ac220dc48f72c32bfbcc2a626caf30853bf2bd26d9b5d08584b22bfcf15123acb6fa34e51601006a9d7ceed544527db05eb9b972fc3558652bd18ff910798b14ee26d614360d39a54d7cdca868b793bb0f27427271db77ffc800432b0b16aefec3176ec869ff8f4253e4ced7f59d1108d5a408726018c0ca61dd6e183e26a402ce80150b9a0b386a043bc305aa0aee590ca95d72f451b97a39344baa8ef6a22080c2b1cb374daeb063496814a5b9e2ac9b4a975ef4f775fef8941526dcd39ccb58802cd1fd12a73def3f9c4ce5152aa0f0a6997231e8a21fbfbecaaa5cf9654e0366d32269125afce1cc50abc32ff52479b3027257ad3abc4a3856abf6a79208db5ce6500bc1a7781e0319dbd6e9341b54f2d6413230018bfacbd1ce7d8b5552afa5d44a1553d953a351b835dfeb5a7147cdbe72b6b65088890970285f0469e294018241eb549f078bc0ea594941460c807d0072cb9cd2dec8df1f27ed9f83c463e85c5111ca7740c60838212e2ccb8dd57bc47242b0af70f9e0234aec5d0563f839f0d5b15a1d5bfbca70f4ba988049a6712e7272aad3ddd5d981271c53faf04e7b0e7470ab82876f3ee0b3a74c2d706ca4885814ab64abb4bcf8105a00dd303aae0abdc8ccb335b7a2bb4fdf9237a2d6fc9c7205c2ed652493e8e5e60751baa60f3279988932caf7d99859267fa6ae7e18a52360a7a9e1a97fb534047ea59a429f0025baec4721648f2e6295fa6709c3e31672ab7c825d67f84f9b5d7a3d71951514a50c26eac1bb6fc5be7aa42b27b117e72fde56141b24985d477f0f7e04eb15c72312d3ce1e75c72f80170b122ce36fee3df75b2ccb34b727f3f67bb41e1b561a5e7f3e0ff57a689d0f23102426a6bc2a518f6e698a407957ce3a2656974d8e2cb8014131daa378e7e9d4f11769f1dcb75bd771e730dcc29a5caec641a79cd9228eac9d78085d4b50850afa41bc84a1cc1ad573d42b8f273bad04113f72b14a187572741e1fca18d39247923c0791e11d5643774f08fd1306e1a213dbbc0034f4f28e6eb8a68e588f9e51e39b9ca9cbfe72ec6390c27056d21502e41b50605435b5e0942aed422cdc5433cfcc5fff70f6540d684de0b5f084a07d714cd9436eefd98289154d908993eebf9a48d20806df72fa51cbb0a427410a965103d80a685da72c76a8435ac61859a5f43434963f077240f826e4626a49c582f373ba8fd2c88e976bb87ce74c447aea3d72519252be6d9d36be48bffbf892b5e405d30f96684441548c329204723e2042595ac2b50c724a2f06024585f8989fb48f8d39e224f06a03cf3cc3f308f7280acebfee585b7242c5a23a0d5eec74dff63a5d4897e01e4b80f193aac3b25b0f2ab1ee3dc6a1721b25983b6448cacce22cb0a1146c87371ecaef67f1568f9c7323c33f5cd9ae72a858ce6a47114e05200d7c00b69d86dfb23b2b36a56d6cae0786a239becb8c7210ff9fe823d3cde8c9db9d10fddd61dcba075ce8eac6fda615ad69e600e57b345b51c1f199922c92c251ab402fbb45d9722b804cc8f582540888b46370850d72db92f72892942cd78473da9bd1b2893e840841b00b82591b431af8a38b57415e93d9db60800745f020664525f66ab38fc1ed875510eb089efda562a1862d4e7255ab2531263712a064132be98edaca298cf5dcd9d93b44e2f854511f99541472498f73117a6bf4e3f731d4aaed9f1af61b6bcafa68c2cf9c75a7a9931d306f72e853b6519551e5ef31a4436fc78b14389dac68d7c64cd2f1a9e3b18c3beb8a3c4aeb132a54f3d0fe006cef73968af4eb3de1bbf462d2f899a155672b443dd3723a48ffac70e9d163ec0f8f3d0749fe355748da8ccba02905b2eab40f19a6a1686c6d6b1cd96afe344714fb0c63348615799c4d0b0638ad72c26cfdff78f799723402e602cfebae1723783827080856c9783004afafddf195eb0ee6c8b83244728cd913513c227768a5a6ad2bb30b676cb09a0ae7517529637b7efd5fd458be3f8bd443481454bfe2e2739df983aa7b7a6f541c268dd1a0ec07a3e29e163b857241d25ba21e814613ffc919c03bf85849ce877cc36c52d008e9586a3449bc0072b78f10addcfd51f1913742ad6049376b3118691a97d0351bd98026e173cea56840e4860d1b49689a12779204e5b139f31a25a72eb4939f5a0e17bea986444a2d09d2a34c6119fda71201862e6b3c0af02b737766c9739c00a912f1a48944bc72ff386e2f51d677dcee0ad60df42b4fc1ded9b3ad1d4a34b30f61e1c0636c9846718e7cf08aa13a379ca419314cee473e6305dfc6408d1b6ff089258f7a7b05722cb69afdbb4aa1dacac97bbf38213a86393ee80a32d8914a5534a9d697d1bc7233de72727738e8c314450ef87b98f142204ab25a1910d28ee07ea3206c878c4f17b2006a579526cfa6e8eb18e349f9cde7964aeb4eb3eede2d1b4005b49b0f4247ec38c079752b268c52172a931bd01ebea7426f05fd466fab3a32c1c535f372b5930f8b6c183ba913e10650a881bf05725fc52a25cd5030478e40ca5ae6dc49376233d708ccb354b92526bb59d545bacca7d7a2bb6aa520c59d65892d15ad7208e9ed6ee8564e9a807f1e91cfaccd8706038e11152f45bed232680f728abc441824f33c7e876bbfe9578a12159643d6c8975cc9f987e305665c1757acc30272fbe75383c4c7764baa19d7bdf460e523ec12c87b8de95ce5fa57da58d89b6c5778604899d33c25d103563315fe7c0b30981231d226eb7e7a2465a5bdf24e7372ad7aa640c6dcf29fb8385a3d9589d22dad9d63a17b5cb51365a27e2fd21f6472cf3160ee742ccb7247e78b6b1c2628a51861cc8b034d06e6cccb40001f80e3729aaf47f2982f3fc8d9ceb8960d6af000f58a294b3c7371adc30f934fb011a7729bc184039399cd6b26367fd38bb38349267e4b22d9ffa806281e203c1872d4722644d81981772da6ee24e8733053f9e038c4ac25a390a9312fe35a3859e33d3f7a04477d4db59b837c15f02367633feec3d55209eecb053c26d1b2d136b4214b96c7db9dfb956b909eb0b6eae34edf53cbac07e634aa55776d99352d49b4a625456022b134e72cb6bf7d5e198a2d0ac6127fbe8f02500ec7bcc3d3ca67864d27ab7ec902a955a126fcb2189cd6bd5b7e0451accb2f948728f972e70a4e400c72bb44cd6a3402a06dcb851ecdff54843f144437724fbc6d2ad3f2547a18c2e272f67f9d2d91080d0212dd06a886968eaff8a456e6067c68c5dc7f261d24905f1fe52b38a6cfed7753acf0f432cb536e22e8aefb2ea5943abd589af8e5a71511729aa894b599567b75a30549ccea07d2410db14a0abc5d11fd229ec93664791172c497e257d9baf47ab12f365773061c406480075b8818afad40d4f01cdb9656723c23fd9bb69858041d1b42fd2a91d9703caaf25d5842cf8ecd692d382644e072c1082bb65359fe3f838f5aca19f5c4cdebfe404550756ab7916aa6588ec46504276c5a6cf8517fe6332c156a6cee4f3a749b1ce6451c0e88967911c3548c356947836bc79f83b94fbf07ad073e9eabc72c2ec3261b4af0f0f30198f829f9ac7226f465d6d76f80e59dc783c6ed778678a63a2b3699a154e7e55946c9795567098c9cbbc2ed72329262b4125d60ebbf480c5c5fbb496c6e71b2b385dd732b1a72403a444fdaf1104c5c63f0be3e73a02f0b3cad9fd5884cad291a1424e8ea9c5f472c3d972772b0edccc6966482f1a0162ba3e6226ef6fa57ea5c363d3fa42f727cfd9519798a5e417c2ca889d79ca637315cd317872012586c36a9e8836b57718f46f9d26e48537d0b36a1600e800443ae621c9036d7714a4fe7491e2406a41d5eae48849a11ddb8f595b50cf800b73d969a141797238b424725b1ff194c3b726e5d98548b58268a4a2c69ea1ee5ff2e07ac0562dbd3244cfe3a51f3932fdf38d151167caad7ffa1c1f9533d90ce10b3c3dde3479270b8fc3e7fe11e438452721cd34ff678fa054bd0a369bc938d392a30ae5573a6e4ae692d2d7162b46e5b4c769e62cde5f39856c417239ac14e7badb284e0fa320c820054c5324e3ce31c724df574da7703d7fade04dd6e8516624a327771b3e121fe52173986f0a476a172b254522e33595e9d1829db308fdbe29d37b0a5ca8f302b8b8adea01c2172b772303933d51823b395940f52ec516e4688aa6a73d87fddb01f559f8f811e14133292fd57e9ad0fa8a7a3edd7620751141c693326107cc48672a01c8fd10f9c8772edbe714e42d1b13cf2ba59af850e15a985264a0cc7a2d08f8ecb3ab62117e872f581b16e6959e213350c6e70f791842ae0370f0c84e3071d84a70e9fb2684e725a5d495385990ce0a00b6eb55b501c6bece98d301dd4a74d34a4368d412887720750176b9464e35b1d5ad67bf06ee6e2f26e37a6b9de1f04033cee9ffbca727274fbea08d1f48f255d929c3ee102b0bee5a36f04154269b468c4a5533744f2142c3183bcc74e7b877a740fd4d9adc8101049cb92fd7fd0a5a79b8fa0560fb5727e6761fb9f0104cdf6d9c1ffe27446f693650b36799011cec020a28526e526725a218b9e8f756b5e29ef2a72c990a748aacf30a31ed0629eb15f6695d36f64729667d67de52751c9a5f29ea674a56521c1272fcb645d1a18c896054d5cff5e727e17e8dd186ed257d480f4baf5b1ae397c238eecde676a28d410e0f3f495af727328f1d150c0c7bd92a76a6cbd84610609835f20f3299d9b2a9611e35cde317242d7905699e735001fc1f48a9dba945dc5105a792c91912742aa7190efb3db6798e5826f37dbf82fd61027a3efb179a943ab0fce869a71572de0abba513ac95517eb495adb7bcc0145633ea578b8f4c2b5c22dbfc27fea1803826a13bf677a729b9e5ee5eee3db7ecd685793eebf548c72e12871ee39477b30dc15d189ae3a72faa9d4e17ba1329d8d65f2444740e75329c9dc973b60005b1b9a918396a98d726e6260e62d0f04b46c4420d9bbfff0b5a31fbe236f0be80ea965fe6a8709df5d4367d104601476682993c73bc69ae54758513159de188571a9f104b3ef0c472c198e18a37cd2137ffa00492b73570eff78e21c933e7df2820f2e3b613fbf76219d91caa482e0ae6a685f8439f102e785b3102afb16bac587cdb45c28957ef60c4353a690786fec3af8be6409bae38aabafcccfdf2a3f777db32029fcabca2b3c09ae0a72463676c45d4a8c3e7fa1a06c1a31b52301897b6adf83df145188371a38113b0e3c6633102f9d384be2f1f3c1f1c73e16c060daddc1ef71aece7fae21629039215e1abd7c22f0b5db7ca7f96fcc99823dfcf07f7fcef41d1b582f39633386184372cfc6fcf61446bc3610465d2f77e8a9cea1c126b9d8ecb7065e28722ddb0dcc3621a6ea2ae4145efcb74e13c2a082b464a10d9513fc7a27040c0e7284a3eb01c65d77f50ccbe40b74679087c0e324675a44ff482035ef6298ba21329da2f529cb734eb6d002ec564012cb27ca2683b57ec479547e7c181589f5c670d702e6bb12b9a12ae229200b0eb3b980df9aea450720c90891e4185b25f22872dc4879c695365c39b9a7adb900ee0364d7ce0f5cfdf5c8fab9dd4f0d0e33197291535f1b9004f634eb2d79b8534c633961cd77aeba99ffc6e7f85461894c4c4efddd461a5fd4b17b57a0c16de6ad79cbd037f863cb2ae728ba0678ef3d4486139e0011b16b6fdb22988c3b34aa65ac8dd61c28c340a7efbb489d4cadf94339723ce50641c278dcc3c8f2062ddf74504a1a556c9c75eabe291d99c5f069db8f06f139272ae30c18d32de73d5ef694b77e696863a5406edbfed84d8dda8fa7171df3fdbe3d3f74a4f905a8dfe5cc11cfaeffe7c8c1ffc2cc526bb5618fb7c03872d554ebb5c94600b0339628a800698d83ebd90690cf0729c9cc05fecaaa216a72b90396fa252e4d6c3cb4e3755c302b5dc5f5592200afa3164a3caad91cc96d1ff05c46652697ba8c5321607856816de709c397abf423e8156fc97471c57fce7255b73c83e227f170f444be6a2ff38f87d8e0ca9b6aca7c8d8f605b1af7622172de2983b82b845f51174e633699d30997b6f7925f5904d2dc4630633b88606c729df2c436d702d307b9f1e0f42b9b40e90d7248a2a0040ff207e1eb05f19c427244e4115710a632d8178aacbd8eaa1c1d35b6285137e8193b888e5f452ed93272fc4c6c1692aef0eaddf8abb23cde790b6a7f7c4c9a62f58b623f0c5b96685972d00cc9ed3fa3c177a3c2b3a077dec8e215d5cc9087592954311ce5b51b4c6e72fcbf2d627e126adf9f432c77b7f16fad6061656b86a0ef43c057e8f62305f0720bea0f72a4626842d2a5263901ab054d68e4c1a6e80679655c1831e65ebaa972547223f9cb08e208985775bfd28ac0abbb79e6f0428c673fda712ff71b260d7257eb81e1a3bf33b2db8a7594313f3187f004d939455ba33ef5336ae84a49e26579af907f946cbfcb15ae9a66ab6b409889934dd6b20ab02c60af96945a950d17fcdf465b5033a1df6bffca71c13ec21695c6cc6f1240e39c6ce0a6819890b6723759a3b589a7d2e4e1eaddeb154c06e5cc6280bc8f5e56ee966471ff4b603172f489850b4d37c1b08d50c32b5aca0139dc66a8983f77215baafe54fca4548e726ac0f3bf0bf3551727b9bfef11f767e9112f01aa317a014cc3c50014d2d9fe720df512b1686ecbe1a53a76e560b9e784f046064129836f59c368a8a4772d2271adeefc665ef1774a013089667ed101e934a286f91b2261752584eec22f5d09466a832b637a7f3189fea190a4cbc93f796661371808dcae0d02ea436ddee7fd720b2c5908a65bd797d38992b6fea7dd5da8f89e8730cbfd34c34610ca626ff2723b27001fd8342442aab380cc8f4cfac7c96ec29b3431d66708c53bd46e0ef67202b3b8a557e124e7938405e5c4b2bd15b198f5346e00d7c3b26de3624055944559e06b0943f6a196d8d69b76bc4b19bd680c67db1f79f677fedcec01be1d56438b7a9527dfb8fbca10b94de4df2b71fffd9acb1ea02141a3bd1fa7eb1473b6722f9f8a5809cd92985a7464d65ccd009c5a38a48665dc0b7786b7f41e45105f15237ce4f49cdb9093c8dff0089e23dac7edc7926c8832ce53cc71c6988b2f7c271c77aa254a0309189d3eb561ecbfc3479c08d82ea6dc7d480e7478669865fa72b2f3ac71f7b1868c5d7e00a4a78e73e7d73dc144505eec2d47b4b5c19f2232723b275569d2e84f0f9770b519da68c906639b98e1d632e3acea29dfc210bc1c7207e12881a9f258833ad4f36bc5b83613ce59a1ec924d54fe1161d27ff415641a59bcbd24550fbaa50800891e2447126e5ed52cd6d118123b6c76aa09ad7ae43afae15d075afa81c090647507d29bc7309850dba73c1141502c4c9b3ad8b5b27283defaf1697053934d2fbbcad1259769cf67d72d92cb42bb74a24cd5508eb27253c08cf6c27bfd5cd594585236dc1e86dc041c300bb98b1e7f3d5ec9ce4a96669ab8b19359254462128663bd99e31a964478a77877499c9bbd45e822e588cc72a54036d7ead3fe4749cd1293aa5e14882884015735db2334c4508ce361ee8372bd2f6c5452b6dbe00ce675ddd65b0974017d1baa71885b83f86edc7606119d007aa491d197b665422ac63fe8a6a38161e38d9a839928b7587de8a5522889dc00d42aabe2108031fb6a7b6e1a8b8398e11b7b90bad1c5ba9f9388b4f342fea072808672bc26e6b2fb45417f1cda32fc938bfcddd3602cd9d41662b9a1679f921815cffbdd3790bc9ebc72c11809d7edb71d804fdbdc637014e0c5dc987c419372ce95e2ad0059d0fad20bb5a62427459efd4cff96a7be7fbc8073607f671e304bc7bd3de216ce898563ccf18a3bc6037ff44e7d8ae0f753547cd71181a054fa4ce3f4710ce29af12250424b301f6a7fb4e743e0aa542ec866c2a4f9408dbf6b2b154bdab36a0b4c31c44e3b5643fd7d02e5308dbd6f8edf6c974a364be6d256727c918dc847d421c170d42480933a3f9bc628bce21a5fb4f219f1e233984b387299566661aa87d7bb6c323496232c283e19a15c5c3ee83e3f0dd2c2e7f05dec72275009052a98992245916f7c9d43bc92e48eb0ecfe45a1bc4fa464e52b023572455207b5cbc3e831f97cee0aca7ce2f4d04f22b1a1b77552962aae22f712e072fbe60d6e3dc00900db31c8e8d6155bff8925040ea2a4ae81d59db65772ceda72922ea2463c304747e125062f28c8b9dc5469b9e3f7f6d13f4d7435ce9ee94d537ba74b6502f52a6b570adbeebdeee43c0f25e73086beb1e0cc00c930a15feb39964758d32ead7971ef5e012ae13be224587ef6c476aa91d7fe86100c078b17724afed9f82df23faed3cc89bc08aac537dc8de4299d45457359175ccfbd51d229b6693b81037822d91c18b8499fdc2006ed2b17c0058918605ae39eb2ef69e172f6db80945d480b759a339959b352fea1210516d55a2b3f0459da2fdc41149672d38335eba259bc5a7f0470f81694ca6187284490864d31a1ad6471351406327287ed150abff3b828bb26b6f152d2051e7d93de2eb1a8b71425803ec56bb5cc5926b739da307bcf7a770d90fc62d2aa7e3b618e4fde17785fd73c4cb5aeead611fb0c93a3b7603e779153ce1172e5bfbd2ac4ebafd0149b5f09ca921a45f9f972e2212da09d9b38b496b83f2c4a1263f049cfe51ff38daa8f2c73c0ceae64e0726121bb5dda8228de72e07447210ef49a1c79a4e1a5ae5c971a5058881305b9727e75286eb44d0324f29cd9d60ff6584256a960a8fe4b5641042c32cfda55fa727b8678311a8d19e23d130cf6de01357200e17aa6946a8089983dfe0313d35c7285ad0da8738a44ac8302e224f03da36cb7ef2bf0edd323d2a4a60a9ca49fcc72c7fdabc1ad7a32dba4f09ed0e7be9f932a5a48d891e3354d3f99017b9b8b9a72806a76a65e35e848325aef5381e1133ac08bebbc986dae57b849b63db722d47272423ae219db0c30153526c8a634b118e1b50c326b12134eddd8b1d03008c752c7a932a58a36ca2a04c79fc20d6d196aa13f5431da68660160d59b3b23720b5ecdf5b37541a6b7a32ba19468cc942ff1c79de8c4e2053ab122dfe7237492d0721d48af62c38cbfc2937d541a42651a41d38af21d4db9b3ee77761fbd6816ae722d9670d5a0f75888ac97c9aff40abe82f8fd4d5c8b5982f2ed52b4c9a6aebd2bd8a3cf0be0702934d9c855765d80a3f25ce96e027746a5c5270e3ba1816d1d7283c751def104471172b54ef298bf8b8913a6f6e019cce05b09cc3f3549f9e941a797feeb1228f0f9733dc6cb5a85d5d550fbd484c325d5aafc1b85460afcec3bd97df2731e9ac55a74f931c33541de4561b9c5d7576ccf0ed635601c3442eb33429bcc7796da793328e1f3352899db16dfe5cdc8d737bc7c87291b17a9a76d72e7954a40c16a5e01f95c02fe86d50b2eb8642b286aaec4704abb21afc4c2d2723d944f3ab28db80f803332c0b0dd83eaa86b1468649b51208a8b321cbccb8e72e0e09618f3386e592c000d8a2cdc5de15d2b153650ee980c32951052ef5422630e6d31e3c8c89db03de89d80d5fbe3428e17ee1bc8cc870aa00b183732050272310fecec2dcafa77035b77ef19a15b925f4fed59badc5df392949a02e83ad97264dda9196b888096e1af43369f46923541d386824c11e8225df89252cbde1f6f936c0f6ce47aa9805c0563944df33cfb8ee0bdb2081ee56f107367e2c44f7132c6fe84868a500b96beb52b740c7255c5cb42ff815346b1050f66fe7a70c0cb72c2e9e38a2b44e0e52af13da90a67732abc6d88c8d55443d83d877a439cd83f62a02b6165a9d100e4c794b755d33c39e4d540f79a7134191a600b2d9f15e1bd72eb0121eed8a7a89c550f2f5524609d4c98f7c871ed3b79d3d19288ba0332e13ec33edad6b8996699e0fc71ac96353857c6ed60d65caa0a163f5adb59e23464192b9a6757b6b05f6a8b6d99ee8a361cf32a1662915934c747a3b109994e0c96319f118c235bac0fbd7b711694ad4ada7229f3c332e1c16ee7cbd40f8cf2e5806bd8c5da5afbfe2cce99e702ea27499208bf34984b62ef9275b8d5f580f36b3625942858bfa015c884e134b33f1f8b7a988ca8e2dc74d730e601f542e706ae353d821b5553d3918e86a9f64df65dcf29c00c87128b9b2049da6b4ea5ec48e33c55c7afb79d7958717197f8a41cb783921ed8a0f87f24ecb2dfcb6a887ce4c2637288879205482f86a16582acc00bf29b7fda07ff121f1379a0ddd38d5656e5621965ec50cded8f28cd5fcc530c2abd0b45e65a0f9022223db75d2623dbd69a9e11b10bfb7d7b9fb12afa9bdf82ae8a818237b02ebf43c466a307a77afa2b597d2b1e3856bfd9a56e5302eb9faa4ffbdd937342eabcae02aade5182a9929bfb544ce92f054e2b8289aaa712264a383fb87935effb73ca288d11514cd59265cc4d720c115d3db7bcdbd2944ccceff890281e07d858e87d9c8d09899c98ed2a240d37638d851594c7e14f53487e362a8873f41907adc414ef7cf0d4d7a1559194177268452b304bec4779a3ead63352d6e5a5ba7dc1fce3cd327ad718c466d56b7272422f609d17957f0c1c82494b573b1c4ff823ecc7ee1476f2b5e2da822804357207db8eab13aabbfc282dc85697980ad6340fc6c2f08654099a5cbc907fb250723994c6126334721177412c7f2d96a5c7cd9caa44bd63b1464b2ec1c113ea13509240af5bd9efd8a95a1521b6902dadf19ef7009207d5d6722e3dd4ad14d212722c1e6288dcff9b7bb9fe9311f3a00564a42c54ba5dedbff164847add2cbc46727ba1fe1ae4c21c9616e0ff309d32f8782f451c364bf1da1d7a214a7eec3e9272cc443aff729a94654085203a0d60a009d8b1c06ba3681681a750941d63e52872f4f9f8a3ec0099d2023b40c6187628d281bdf43a7af87624d5b7a73374ac1a7274af23ac7b96300b118d6b4692924f673071aa41ae72161fe9ed43e718a307726563b5985209f63c3e5f96612a22380c577d28960126eb8aec2e2dbaaa8d5a47ca36e7a99c2bfcdbd7f41f4564ad433276ad6125b9a74c16cbd73964a60dae72d99bb06d8a1ebaf1fe363bb673edb8f37c3337c165f6b4c6c070f23263fecf5e66b0d44d8d7ac9996d90dcb08cee81b6c0ab5822421991686c6d0b9b4c23c87225a3c53a616e0dac88fca1cca5f97cbc6b2814ef820444c25118ae1a6c256772f1c61fdb4afd39f689485ef48dc2f67e7cc99d5ca3facf569bc7cade53758e729d5a672e78d473d20cacb578154862ffa3005615cd605f684000420e38af5b72fa6fdfe9afa9b952f4915f69b06461f2d9e52c84387e65e6d07feac4b9c7e7729c8c261f17296f0003837705e22e5733192471b98a1292ae55e37d3da93c4d0aeb8be3558d3d56945fe23dd3138075f56f4b4e24e5bf37287f8d67a77e62c25f16d116d09956572186396726188ddca91ec37623ddbd2c8d5a8a14391c91504a9c14f5db4ae1f4ab87079444ec01ffc62cf7db1e7edad9bc89d0e7141b3a9407d061b2967d187b4cba243ca58d25f61946a438e8696acdcc009f630b5ef11630a14d792a7a5712ac930b095ea34103c388db184ad180273ef75f9bf28b2f2c72d31dc49da74c83165a206e86fed028ccf6086232f71e2b56d6dd2240944f6c7252e0aeac32311075a7b5997fcb867706028859906790033917664e95f2757d721921bc2ec7f3b50c01d95d1ac624229aee367deaaa8188ae5fe1093d124464728165f025268a9e1b6638ec1ed9ba71763e01b753f85d6ea05dfe7a83a002a72ae2e8860daab55c824a280edfce37ba6fd62e37e1defc38b8eaa1b4f403742572c9b7f89b526618c58b006e8b9945db0f85c67e94e24305ff5a24c75d06e6de331e3ebfd44f72c598f5d8c69562f03569cdb103e391b338b0433f9c13d7aee44809730fb066261447ade6e5636e8a6d852966f11acb8b39442a08170dc0a5037212250b9c9c31ef8f284f995b57d4c360c7d2dd86e7ca2944c29f9c04047ee23ec09a70fdb56922327dfad779fb4bab58e0d58b16b8e911fb911e8d98faf45472e9a16db8c651e7d701466ef0c6e79c5cdfa406140bd17d64483b8c927ccc901dbb4fbd1e2e0f7020e568b3d96c2dfb26ca87b8390ae36f0064d5e281405ec5233218842d914e632492818d9cb9a6965d2dfb21a20dc844d5aa3eb401c608c8721e6b608c7743a0bd92c892f83eadf87a6a258fe57c333af48ef25b63d80cf072b9dab4f98ede563368b8ce2b1d2d0951c95bcbe84631776b4106380421920272934835b0a8aa26d715a6d1166aa762efb8fd92ad8a931248c879a502673db17243f3fb0414201c5b8f31c93721f8c7e39fd62370dfb9d3fa817a696e37981e10b233a699b8d5e03324087179ab7cafb6527f31734d13fd783ad9f565ed55b32af60975e4fe8a8ab42054814b3dbe8af4de43286afb6c11a86e62fc24802fb572380240029497887748305bc92e7e98a1724f9d13a797545308a03f906308b2724ed4c2a176a01e348ed4ec5797a4f103480e316e8536f34d0744c9f3bb185f72c9235df3774597d18aedad2a495b1e34ef27f448e2c2ed4983497bd4fcb85672fbd9511cfe0874c28d44a8116ec3ae53234ad6f011b7593c2608aea06b41b1720b997e3437b1d2ec8ec147feb5c8987f4a301041958d72cd86a1c272f884a13a46731600627e5246b89f6c7bba764eda28fff5012be6ba4d5abdbd3d7758e272688477648008b8b058f6fcb5f2bf90fbb8212f9b5a8328ef8601fe6ff133b34b287337e47e3b68e41adc577db0f5d3b0c21e981e492d500ae93f913e60051b728a8d764596705cdf64ae2f8eb7ffe7a97dbb3b32ff24ee3f06d747cfcbf1d072e62b5ffd0bbcd24fcc81c4623b3f7afc3f9c88d8d9c731ba122bfa7fdf3469016c21421d2d681dce56562b679f4c7cd7d5b4a3057e657ccb28d4b49c26f08472e9da2a06cbbd80caaee5ab233e776a54b75e995d2ac0f6b8a6a00027085a7a72b5091229ced7585fb47441d9ba9f9422d1d5a04a699ce2d472395685a61c6072c00bf3124fc6079e85d0408f63ab4bbd915746ab6322885cd5fcbad665defa72c3ec0df6f4a337f93840f8e16e99b644bebfb3aa202fc0623a48ef3fecffe04dd5a560ff6e081ed949bba96c2f77f95d683edb1dc7e5b0a151242158e444d837aac0817de62f12ce29b858c7a1f81ac1ee438663bddbbc7af1065cde7daa76716cdd8817acb3d1072e7536a30c08f6c80e2e13fd4406840abf484d60c9703f3714a26f8e5c21d9e6d28a49cc41bff6fab646ca3923b93b6078b12744215b5a72c25da3e090538011c4a5f2de76a89f77e3e7c92d24fc65aaddd7468717c8ea72eabd959d67a671af40f7156d77332fa7a96dd24ae11e1c63c71474bf7d3a3166d117946396e80836bbaa5b24b8bc0a21b29784c80370830d15b25e4c3ada30723486ebe06a0b32667ecd7c7176ffa3f7fc7abbeca7f55b9165a1035a75ce06234d04d91294e614ac35e41e6b2e4e437f82c6083d685028414b46f363db5d1672989fa02d9f2f297b9b231ea2d8cb235510624d7c9f694fae34c7bace00a729724b8b685fcf0ad91689df2edc9f9ae850529530bd4624bf21914e28104c125255ad1a1ff6a1b60b8bb2da4c341cac90c43de6ab363620cb9a97d3f621cd0b3c38d1cdfb0aca0bf38cf6a9558dd1e42a1f519dfb3ca2da888fef197c8ef9d884729b1634405a35bc9886894871f4e10a76ad65a0c185915064b77ae0dd7705ed04067b31b478045f420e2551cb003ec94866f6372849d353ebe47566593f91924c2476ed940a07b42a540675d9a7ecf856d3489294b7c0ec5b2d9871d79cd49a6465a401dc452809808cf76b05215110630c425a83d7945baff71f875f629dd918421f6ec1014781be7bfcb56b8b0d22b29c3d100e94768716e15dab51fad6eb4663bebff6296638f7d1710a2f5d28465b51fdd5621b00f7f77a75215ac24e2403f13f8c9079a9b7984d11af9efd6f28bdd411b722174dcf52f7df56d9ac1ffc72a3f3a6dbf7444976cb3867b305eec82a31ae52e6a917e1675e5817a58134410ee2dfdda7a2b1194fa051fbbe91aa7a5fb2f3fabda776694eec3955f2918862679367fb933cf9339e1ab5d7d6dde5e2ac3b3d7f8139f7018c42df82cb30e28a720d12712245d3f36d9ce911819adc560f85f8d06add6010a0cb8a24884d697b0015abeb384c886dfc48f3c614165ead70ba79b329af5f6a32ed0aa8c27921137185f2fe2f38082a65361fb2c245c2e60cc7ae61ab8493a7ebf751a5a07a269c4da8b2c8f870ce5078e47bb7aefc8e10aa4031a140e5c33cf2387cee4d3ed852120f288911ba204c71252b4c616b85e3acda9457a06b22988dc73e57495a1c4772f663b22fe3a5b1f4677f204c7137ced5b4fdeb7f61db4613f5ae78daafb67026e4a43ff2a14c97263652449b318b4f6a99e431d46eafcf0ec339a11f84e81172e89257cf43294ca5b2d2e24c2b170dcbd1354f6976dd00749672d571a2c1900f02d69f013ce1e843ab2bacc819c3bc880c4b0dc6a7fd4a084900894c7b5ed264051cd5f3ab4a419028b0e4927c96f6cc5f806d82e8d218bdc8e3a347154633725d6cc0a67820abfe482a557d06ca6abb1e4e4849cb5082b8b95396c26edbae720feb8e682f2333543bea1730680499574674937870a43cd681991914d86d9572fcf983e4427389033016d863cb589b28759f7de152e03c11938b9e2ceea022602620b95900925753ffd4a2b4e609842b0f7f943d6618ca4fa8f2f44ff3625672377db17d35fee09e9e6b8c10901641076c1dcdc8c1ff79c959f8e8ff0ebfa572c27f5faf09348d5b7de1b2a464c11d33027e8fec13dfac0b9fba9d0c071bbb72b58eafd989c282295fc4c98e73727de863ba367abe92905e981f0f51a7993f687f360d03b839b1feb478bd2d3d0d6d96904ef427c46ddf26153ffe1e276b6c2e9e026790de0d780dea88197867f8a54bf6fcc5fb4064cb8ab1f5a4f4523c9e72af00d9352d7beec062b0ce87f29e0c94280253645b16fda9c490581aa271ef2d64aa8332b4d5dce4e9a651406bb3789361a0494caa9f4aeb081bda4293d7ea0d9efefb52594656337dde6f192008319b084a21b14055af993bc5af31a96d1c5bbef9944f64bd3ed681c340ac159e25478ea474d920cbe5d1762c651a7067e4442af3aa7430b85cd6d614b030df0ee31cfeb52a536d25a1fcac55cee2606cc94ec2d716b3c079cd16194e0f3a7cdf206a1be61e8530f9e2012a709f1b45d5c3726122bae7a5f9d38d0e06f00f5ff69bbb58b62ffdd610f3b297453c1ceccf5c37d2878010826e1f2a7bfab2d1ffce9c187c9b26884933ccc293c5c531868af75544a6391129433d9f1a8ce47311506068b0d78f6f7c77beda6f1cdee68536fe63589970505474caec0230841c63c92a923eed818f65f57131e5d236b5442a8f72efad5fb3fec61b7a0480e8325dbd2687c881e5e52e61cf51718276fec9f62c40f77c978f22e42f145ef31dd53ba0b6467796bd15bf9ea33ac0fe428b19fe067217be46df49292a0cb8be4c49ad839d102237e9c06034ad259bdfd4a3dcb7c271f8e8abaece8c7a93c89f1ca51792a76d19835f997153850128c813430a0f5c72695b9d0219aa8cbd0c47689845f4ecfbe8064a142285814f6b2c9b4fd766eb427804f374c1cfc73bb19a1bec6f3ea05cdc13cd945566665ce8213afcf87aed72b064d89bad412f5bf7c23b4690fca1cca8ad844f182c63bb1b13c3c8124bcf720749e5c1d58032e31c2186637565a7a8b93452ac20a74e0267e685acdd7d6d64fb06f680f87ef40d0005936d2c9c48346d505d986354c356f10a449480f28c0a3b71b08333ac7140f5917e578331be4cd861e360d73045569ac5412ca8445e56d7197bef7c731f4641219cb39c437ea7b6e54ef53d91a66cd7fff62faa86dc72358ebb60b79dfb723f3588dac7ffb20022fd6171606a87ceb4889c9812fa3b3cc86608edb0d21125eea1ad76e1558ec89f4a642451cf89470609ddb92beeb17283483253ff2d24548ef22e34428d2eea7d8c22cd5567072b9eb13d1d38a5495653f7373040ea17321c05b6f7b4cd5b3844cfa405ec8f404315b28ca76478ae72815942ca12ebe08230e625d320a7d6f4e80f486b025f5ea38929e518464b813bc035bda5c5319f879d3d8fb686ae2e97531949b811f603c6afa376bc5a9fdf2fc8b18be1649049228eb5b08281bbb91a52f725f1453354fedbe686700d322172fc30102572ca413f99fb65015c2c28a7c3dc065b1acce8702128f600bbdcbc72222bbfff267011f12eb7837e311194946435c2f4ca3e12127978f3302606ee72c1be41446e5c0bba60f9fe998f8ac19329e6b83d8de62bf2ad2d7055aa1a91729eda2fa2c4cf39c781db4ee87e6713691d954fbc439499babd117f459ae390727f0193ebee49e874f9ca8b2830646786ae93757ec408a1cb495adfdac30ae6728b4db41d5d80bab464e9e3350f9663a99a9961ed5c5dbc768424d204a1c391725519d07839b62a490ceb83a3dacf24bad27351298bd472e5f81a652632cf3c1c0547f44fd6ab64b064a26a3f2f7db05af83039cd9a542bee7a4393fde6315972c71c393426722ebd41c6015c1487f5852bda0fcd029fab672974853347ce454022319931f880586253a5353c89a59b9a76361a945407118cdd1268b4a77760473350a6fb53b3d9311d0b0dc32333d4f23000edc5f1b5680a0382c2c9ae3b9b1a73815e59d373e4b61174b3d70f58c2f3c98314ab1a1ca818f9c08958c71eb51dc00bb750f2c3600a8d408e0b836623ee03f9414e44c15a4560f4176446b3ef093db3dbe65fd660a55d8ba3be83763eb550bbe2584a5a5b1318d8105b97222d72b6d3f10b175b799d9d3582a1d2ca3c5effe146085eb5a1046b54aca0019d1b721bb2bae843d9170a2f341713b63f256fbbfd4982ba356a10506752d8d97ade6f21dbcbe290d129d53b264291fb0a84a8d10d8f94d3648de90e4a51245f67157298e73443d7c641b13b86488ca37ea8f3f45be7719eeca8439c1b39fb887e92722e8c16d446ff787653c382a6501b323196f8ef4402bebc03655ebf3d0262347210c9111542a72b23461f6380f5e4481528b1d2c56fc591d0195acfc59cf57708a01200b2af2912e37e89b13a26528068c947747c5de72a226f3f89404b96fe7276d6946f578d0baf1064a27cc997ff9d5eefb2e78db7e9916efe70512370e4725ca264e275a6118790b8349796d866839b0c8c4ae23156d2ed824c89f241791559d3aefc22934bc84e18993d17cf715476c1ac369435e1c73040fd8738d1a372e6444ae4ba47166475b3a36db9e581160ac91355064ea6811b531dbb9200c97299920751f837b6e08084436addb954f12242da39e23d362e1ee69edf57bc994f3a42478123613cca00485f022c0db892dca31d2bf4104f44eb2d240f0ff79c725c7cb2b4c59843aa789809f94dbf3f9d5907e5a7a5259389f622cffd96c850477253c3f13fd70908b048341dfc77c9ba4f54b580a67e52dc44f3275d8748cf594b5e25b805b0e46582a9d0aec90f38226d4e0496460f3e7dcef41b5bc8d5f864710f3b9e9d4e80debd4318a2c6af95f90ce371472bba833bc736c2fb5e1b657277d406291073d58423c90f52456836478b7cd50abc4eed50635581ea51ecc66f3d2366b1b618c525357ab060a51461231ce5621960fa68860d56709441377f103820a0fc554c3e3dc725406a81b95c526c074083f9d58bc42287575552f5a072ec4fd851afa1f1b7614916bc6c48f7f336e5177028f42f4e7db1fc4db1bed672c9702c6c353818ffc5a26436b2461936a502aaf23df7de717031a68e9c040c72010a3861b7f55e854d5968da3089f0c6d2aa32014285e4ca13fe5257627cb072a0c566121dc24b5a6ddc985d2bf6b6adbb6209ad4ddad189b7c5aacd85bf3e5bcf2b30c7042c131c76b01ea7888dc9630ba7572d9b7d4166eb68940a618d9d50b58131efef120b8b0558090475121dea1c55180c65acf9cb0fe68019a2cd6b72a7c28779668ae5295774b11780c195af2642468a5be6c241e1eef211fc33667230e76b3d5d68a98cee444d6722440f418328499965500304331c710ab2132172bfcef7a0ec2de0152924c3d142771c3a5f1adda5d6b54bea1e2afd8179595d72cb5085696b6948675c504c47a07a123bc67f72bc7f0c137bccc7eaa200e80d725dbe51c0f995d61bffe12a828911edef039368a803edd6964956645317b7021e52497f770e86a26f0554a2616473d277086171a56e8d366af974d5d5fe7fba72d9e85d15bb9a54a930f5b7462f50d7aeecac89558f36f567e382dba200672c724326c641292634fc5f86757167452515acb76df9055d5591af3a12277c74ee722e13473bc37b5503230c1637b2c5fa82e86071658ad79199b8264367f92c194b77bfffb3905fba867144a74b8f1e2c66995daf731730fe4bd0618ef42b9ce172efef1806da9061f4c350b14e41be5892d199e5f375e45164886631df380cdb72588ec38f6f0fa619f9f80ade475fe32ca1468345dbf19bc377692077eaaad57280d051750da3dd822ac98567bfb6b41d2a038721267f5a84ede9ef346c57cd72140df33f196bdac0d6a15f2dac93c1c45995fc0836bed6627a74b0d192e0a90337a394ca052f71a8756bce6a7fa22bc21360ccd93e26a15e3e1208a3bdf23e68683bf68e46dac02dc5af24fd6fdc1fcfdabcbde0411f1b4b1417abde7f52c0221da243e177ea36436b3b55fcd1f5ecd5100f9711fdb6abd7d35f956d658b2a726560aca63903674b8b98c3cf2b4de972e960d5f284c3ba65b84908aced2c7572be18770a1a3e69a0889f9b212f2b856db5498fea05d2f7181393dc1d9c92796e0d4620bd2670fcdf54dde80450d0f1a5abdbe9a4bad8c7a55934928f9fa6e37216dd84fc4afb495927d2715f0c013cba6641b03cd869558ea61e3119ad465e72e443a942aab75de805d4c188c22295b5238c7416b601d5db9d54b289db3c37702b67564db234cc19c069d25c9b9addda45010edc4545900ea5538411e8783372e6b89e1478eb778337e93a94a666af06f01914dffd02d74e952d480e85fb50025533b8bb908923a7a66f616503d252251e85ae0d36803129e699b5d0fff67472188a3c332c92385b3f4ffa410a37d519077e97657d67706da58c8ed3228a3e72dec50801a915fadbe25f65755954c30a4732d13fd552bc425eee9ba01a0a4972ca10d01eda88867fb907085a070eede4bb3733f7780e82dda5c1d99d820d8b3df199f5f2a339a4823627dd1e69bb09b22efc3944b67b3b914dd52e65cbd4bc10ede6b6e96db985c5d0a13d7baa0bf71c21705498510279b2b65c9fd7304cd5721526eb981ee3e65c075e504b10919664b99a09393159471405e75b890a7b36725e97bf2bb46803cd791d19655c11ad1c2dc96b35b4cd2f97a5695da7428c4832c68b6fbbf14c72ab61c907e5ce9b024660e9a3d1f393bc9a7859e9a70a85de282dc92f8f67afdf82cfc5007ca060ff2c6fb8c6a0068399b3d93c2d3d528dbd720c6d9a4cf372498f5f35ed1003b7c102118ff4fc2f0299d60d3f93af09f3647268cd7a9ce7d8dd7c812b2d59821b3dfacb1ff61d89b13f7833bf037c55c6386b16974fce21af0a4bfb15de50e9cf4bf3f9b5578b44c57d2911e562e9ade1b5615797c018520f622958181c44387db14ba2e003eb660994852af0828b09d5984530ce5c165cdeebfd5b0ea2ef72cd202884586af247ab65fe4d69cd0ddd871c726e38c5fdbc006b2557313004356de4b70396e10683c443562ddc7f38bdb70870045f3872479b6458ddf395ec19d0c9fa042239abe8b80c6de973cb3fa1f5a072fa13b5274115009d452d410fe6276fb6a319efb932ea846006dfe064de14c96e3180e5355d2b3e0075fbe3b65f723ff7d7a04f9daf93f77bbc319d8880dc0072324f6653698923824ef0ca5d6b223eeccee4c17c46941f2f5f5e1125beec027280fbdb1ca20a07e2d23047090a224115b7f13b648a3cdd18520b05f252de3d72a85c81dcf09b7c45d51ca43bf8661b4571c686d909545b57d17dab19a7c7e672542dd26a1adc6f7ad6ff5156510ce0d738ae9244da3aa5b04d8653458ba5e9727150bc1501dcc792bb3e7d0c3309e4d641aa3902e0586449660c81c663654572f48f8dc78bd11183185947c4ac22bbe8969c7c849d69116f65122317cd7be3555cfde552dc695b4097f4e2182eb9af9c2716fa9d146fe20ff2c7ee7721e296720633a2c420fb86d86245dd3008de2fdc995e4e6b2b74a11682e112f01ee338241ff6c2969f6511c03d6c7a8e04cce3eef997553e237f1346409d61db1b0c737290cc7e1421b83aa25ce86be91d019accd222453001826a22624f7a73796a1a204fd57b5e283b669ddf96cb1925f551f7807342357fb800a82a0a8509c1e71434c58b04df94634a948da1bffba9ab800c8847eca70ea4acdabf56294e3f781f72151705c91fc99676ab5a1430618977de4d14d61d4cbca08042aaf08e0508c3729affa49611c644a88e2c52b494254790dd75a4e7e258a22a1dcc75734179ab0919cc5255133939980af2d3735964782f50a954796b8f180ac311796a4524fd723a5aa28d270cdea2872d386656081c581a281507542d5bebedea91dc8d716172b81031824b22aebac20daf04fe1034a2aad37d621334d2c2989ab84343de7e51fe22f0fa56243e588bb41aaf8d2e9c86629d82c08cdef3279aa60b52ca7a9f72070528a251a4ec699b54ad06f84acb13864bb197fa5d065fc2513b75820ed5724774da6ad4b62b98dd397c414ec5597c7ab565915833800c872d71415c119c72e5d308a847d626bb7f1da5955fd6f3f324223acf1feb235ee988fb88cb8e9a7267dc32d68d87af308d17cc9f08680fea59c8c2f872846613b3b96dd7fc699072a990c14e986886bf6b7ff44bd74517c3c6f8a501213b96618c29524edd2c137282d4bcf7cc3a34bd0b1c1b51ee88e66ce417ef2f32ecae582b13b25cca7cd2290ecc5fe0135309037aae8ab4bf8ae9998274307120af58e835fc52ed1604cd72b24ef4f1bcd7afa77671d734735c519bbbe10a3c3850ad4e4e455aa40657f20825c3eb70eb6df645ca1a990918069dc46c213fe194e773536c281ff52ae1f34344083fdc5ba32e502661f8fe1db6f0d8b9ed4a280ce6e84974ea932cf13198721bafa8df8c703de7ef8cb38c3dfe5c97dddc2d7df08c13b6e85a39a59b11053e038011d1d1cd9470ca5fd1becd48750b37256ddfbcbe01f1e3f0e71d1ab3f7725609c27c8e9c08945f69d6dd724c96be43f43ea6df80ac7399ac7697dc40e772f4dd907b2afb4cce01bdd19520195bda522b817777bf2c9e48cfaa724bbb097220ea26beeb7621b5a86e45c591cdb55c462c965816035882eef04b6c0a0e4162120c329ad36596af938b7f13a12d987b5c0f456d654949bae1033d98f7ba2d72c8b5d41c79e3b263d85adc1990b17a999b0da68519dda66d9930b5b7a219d02f818db6ab00b32bdffd85bd7c7d921ca595e90b04677096a5594a5a675eb69d720677da77279e214769a6769b38aef288f7a42f786aa7c6e0bdbf0269530e9c0d001d510efed9e182fe39f986b6f022c0f8a1e4c2b9f956508602b3edaaa48b5452057e07dd07cc217322bd11a2e53e4b616b61b69333db931212c32e230ea11bce8239235e9e98b940d51c360050e719a203404222916a52957e4280adc9c1502728180127e953558296b0273d314269ad97f541268d723798702b4ae8a57972fb6bd056fda5f753a7123186619c2e35172d7af3c05e432be388498c613a00722347ebdb2a5a7babedf03e5d04dbe890b9d14a4c9177dc458b02cbfe72f21e2340118b4740970867a7ecc4e01baca80725a5eff55d37eb18020e7277d050dc6c38e19a155412e714a518b63bfcb5be22b97e16e0e32a72ddf9c069c3d019f43b762f74ea8d7e4baed5185ef9a837decccd647ba38dc92881a86c9b59e9d0bb6c8ac0b70259de8b80bded1c219e20d4e0a8bc0d43cb963e7ede5894e037f1207259eac7cc29229664aed0a38fd1688587f7b11ccd3c5dc1694c71fd80d6e8b47289a1beff5c66486ae6f57248bc3d16cef8437dc2ab5e0590d9db082a616a5a281f3899d122cce46c61191da8b75fd1f74de5953abe912c63791aa02b3ac9fe456374ae177da37347644475ee38d5d00bc6d1ad080b5efa77202c2ec609ab7a43c76be76d805a42ce0f1b27369bba8bf23afbc3b5b5a8584c350cd2becc04aa72616718b515e2373a034c6bb16cd0a4e9a66beaa9a2a678f25cc8a253eee1876c2195f1150c385bfc5805a7fa03aa66c4305806e9558545219ff6975aa5eabd72432f36bf8352986fc79aafd753a97f7bd49319e730cb446e4378bd67a79c59723f15c725a5db8f9dca9d8592e8bc5ef9ee20588f1fd535bc6fa4ee18a11fb85f5207ec0712d9f98103f5ea21b8f2289609ef0d346dac2793a1116c2040a7e35a6de3107bdfa01823ccf99dd48eb09fc441eea502f12d6cc6a4e764b99003b972f984548dfae758494e163730b20e7172ae0c48584e8d3d9e15aedba18fca2b720ac3f7a307af406d4b724b9db032bf22941de510f8d5a6579ef8de9775b247432d556e763a55d74a11b97d3a095f731a9e48cda3669f088f5b3024c31baf117237dc4f804a183b37dea5afebeb524486c1f4d4b2be3b97847acc130989e46a38f1984c1b2cea115af315fa802a4216590553e5be66fef1deff8cff3d25714f15fd13a54576882d31280a5c51386989f5f0d4b9a9adb9b4e3f13143ca0dce644d34155916abbe8282a0cdbd64d415d6b24baca1b1b27147bbe10c3ca4e36da34eac91e259064df41242a7051fd1386f6462289ec8009da40259762735ee694a39548612504a6b17cd18f288c3cd5d1e0830104a20f4c2d679531555b7c4c07301bffb071150a5158550e247f6d5931adcf89a88d32199edcbde7792693d316649c17b93949ec6996b48ff13383704aabfedb8162d42a31ce1843cad3dffa4af1bc33f6a7fcbe40837bf850ab6a68005616a4d2ac89fdf0f1eacb3713e7e95e472d1828e5817dddf41f882f0dd101a2f0d486deb671f4269f2f3cc4694405c06726b51744e48c6644431084069c276a64922aee265c501badc4b463f9f71347572bec3aba51316b6cc3dc077da03fc1681ed8430290b94af6696dc5d0bd8c31c72ec466d722b2c7ad0c4de82c378e5e273aa715640a0ee58655d22ed02f9a8752e5087e99fa1d2db1b026b7dfec43fd837af0fdc982ff39c6f10939e25ff7d52118ae63fb953891b0f6af023d5659d15db7a32ba727b2d066f98fd066789a4555a526583f0a1b015ae843ee7c897b91216e9a96ca8fb080cbd1631988858b982725aaf6575641efce25d045b37fdb68493c888fd2c9f7451ebc768709abcaa70391abc5420469fb5919c5af32c689326189b3458095d7ed6a19b1b0471e852ab2852e0c33e36c7da1a598a317ae45d9ca621661344a47a65c0d2de9f8b0f973a728355351e9f07a78a64ce9c6f2937a21aa22a75354be438be867f17e71b1c9669e14fdea42918c9ba5320ae66fa35acf63c2df88610a3516ee7809f6f00103a728c11a87004adef376d691c83470e7dfeef172c1a42345268b64f30a35659f15a2a8447bf2db3ac9c6f3fcd59b2a0c20c1a1d59473315ab45b052e60b75888172707d1c18cbfa21745c2b9c155f47789be871764dc40d877cbe6e8b05c65afa728142563e7b6c4da5ba2e06c5ebd452405026a9d5c989b6e5169b91155971c6388e98a57aa965ea4ddc81222a0c9e5aa888ce29c97175e48dc3c0456cef9d98727785f8432d4e65ffd4425ec737fedb252767d44ae5bcaef4f8f32c74444d2572ab7238cc41ecfbba0b7740e4b7da9f9f0b300340a620cb99f6d38cd623527672343616fe54c1aafc39b271494e3a265ce3f2410a3c3a14d6d7c7d16dc23d6072bdf933607449381dd85feedb73588fc09510372eeb99ab9b090233df8f1adf7263c48503c143529aa94d79ffd60ebb2bbc72ef3611b7c0bd6354b7af4b28c3411acd58ef81c4b4670c7c124a865d8d03fc9a87067a3e1419001b61f5752322725dab3cbf6ba862207fe2f33b44f0e20fe8b7ffb87427ca71b2d65d4d26650c179d53e9747177c255c5afa9453d6ce16fdca0b704453ad5356e336629469b7f720b2aed0213b6c853bb426e7356356829df2e5a78e81462e7132cbcdb2f090472ee1fdb557b2a9ad17d337c838c7fa12ad301d82e88d26503a6ac05befaa2647208c63501538d5e155f6bd04e7f0fec1c547c4179a99aa45d7f60f34a51429c315047e9dcb9b8e36174bb3a07bc398d457ef4e736517821ce9007813b110262724157f17883016c66581c33f64f78998b2534950147500f4c0f31e66959edb446efe99b05a96ddce27276873cb593ca008fa7a6e82a1017af19f0232802917f02679fa7ed38bade46303f54124be475b3755cae4ebfafd532305e4fa1cc861d7257905b5816f179dabada52ca384f2adcb3a96005fc38487ffeca2cd10810db72a8342aff32b34a0d3e8ad50a010640eb8314ef1b33d45118a52ef126c30f4f728d7b6566b9774b621cfd51a5d0b2dc5ce2d8bc4d4faf02e24e48754e8ff6247257fdc11746f2ed6de4cd130d0e366ced3b5856f456fae499cbf5107d3188e27217e8c0bea5859bff8ed34c58627a7364c115980fab925daae42cb8bc9dd4774d2dbbce44a91a5422be23221e633cd21f95b1b78a50989aa48b61749df5602d72f146b6a484e35203831cc7ca09a6c59fef09112d8a01c705e85a1d61f2f6d3721703f90d4b30fa0dcced2e2cc1d080ba3d442f66f9d1e34544b5678bf657460d548dc18a10cc8eb344ba9035636fd9cbc10dce2a634a34ffcdb8e0ce5a796172a6df555a09307146a4a28a93aa926724da026b58b9f12363c9dfe394ca4a9072188f3f81af04f68e34d4bf6a9f6584dc9be15559fff91ec903741436817b5b61b5ced415779b120060f2c614acb074d25e1b25a6b91cb3188c9f8af1d25f5123f4a8b5f3376a39ed4d32e0500f508e54134d1f6b1ef9dd865866781283f74a72eec230bd1e097e97a39f61b86e0d7247957b444fae628fe33b1ae06cc572c772c70055f4c9f707b94aef3a3268e9dea88d7b06ae6b19e4177f25c4f08dcea0729df3acd727341b65e26069ff8ecc9a84d072e018bf70d506c8083b2fc8e9ff725458c90ee41e710198896b20e728599aa8aafbc1e0c1ef4959fe051be0feba72dda0ab7002ef9e0131e18788bc64c6fd1a7722d0a00a4d26a5c95425ca3a5d72d12726811b23ba5ac0e9218ccaa8a39b59ef267137d9e801abbea6e7063830193ad38d667b7096a948a354a8a2387d14ca599844eb18308bd78bacb3ad09075ead773f5252f40a9167f670bf0be81f6a506b4cdda69f77f33045780398464a724a4de2eca2056e0143017f0aaa5ad2d5d9b05af027f8d9a2ca5d0b747c505544fe5484bce0916edcae94db5c954e5603bb404beb985491694d7e77782a90c97297687f6d8ecc5f2ba98c67c7bdf5bb5f59ab6d3f9d730c24b75b58ae02bbb95581319118bedc1e96d32546ec6e076ea280d27f59ddf202af393a94fb8239a15f7578ea242792b84c49e07b0aafb961dcbae1333f2d950cd21de87e5bb7584072b78cd288630d350bdd351bbca38b092896aef3eced50ccd97e9ad653e6dce772f514265031cf6586f956f2014aa879eb2b76fac911f0b30384b74c32df082a72bb9aa6560ee324e33d57cb4ff728c52541f9694edcbb411e70d3f305412b01728b9b4319d462d26438741291adb1bb0c6ed3482a227148f257ff153807f28f7237360fc4f29e8096c9108677f89a389c9efce9c1f107a6621a6d4b22c3eb497263e4709781d1f9675232ff0214bfe4d3f8b25fcc8b47bf9e3e33b3a7ec6c137204d8302f2c796f0c9c87ebc000b6e5538da4cb6374a6743c275ede79bb19ae68129b4ee50f4038322f39adb4ea38333b803bb69e96a1ec60e15d28789bef2256eb6e70c9f1edb4a8715912cd2e5c6150ed2230876cd9e47706576e24fa561d63e0cb90c755f7e065e24ad216b126c142829a4e68ebe949174eded2c00f39754b77ac8e98f1f5b8f2116935d3e4bf346bbf78cd33a5ff1d84453804bb07ba5c72c7a26932149bf37c1996abe4202444addf5028009117c88923354213179ff006f7ab41c3a71b99c5674ba276f533110e20dd8263dcf693c9b64b3f4bf0a28b723000a51d11d25502bede1f8f725645173f6ac896e4a4e42f33987e88c1f356729b5862da2501f7206f2292621ede9b70f8a286d4fa2347949e8686a6c1f9602363c2d4e994d05b54482d40ec380abaa3f9c1871926dd35f37202c44878841872badbc629497293b64f2afae47af2361c8d559db3f95c8e8afde70554527f907201affad0e8ff88c876274d3be9779798f34126d032e26f33003230d35e7e56723b8ad0423297ca713323c84ee0b7d60b7ff6eeea747f0babccf439899206ce72d6558ab974121506bd37d3b0595d738e01fdc1ff0ea1ed03e0d7015d4c573f2e3db2ef534a410ff24ea0b227919ba4f18502c65c1e726098960d96f74012227270e6d9bdc8edbf3f29e8423fa2ac8d81032fdf9bba84699438ff0c0b5c9069722627d02bb6142fd8d2cdee57afb6a88afc68a9c2b05ab7bc547fbb6c40babe1daffddac9885146cc095ba5710fc7ac04d0623aa682dce02c8ec6dd46e718b572d22eaa74d5fab0971f9ad50bd6959399e0df6c8a20afbd04f7a1ada1db5cff72e930e638528517e13f0882df73bbfccea6327a5114148ccfd05860be2e8c057219a368f3595d3f49671a56e05fb279ad247fa3c0c3c0c6e56c8bd97ea3236172addc815c531fe298d7c25dd55625f002533ca1980bb2a7ca7af0c447bfda81725a3b25fc9eeccc15c72a83db55fc351e2c2fe3881e5189acbc1101433f2f8472d327530d7c7569dbecf2edbaf8ec98aebee719bdd2f4accf34c2155ddbfbfe72da7567789b52717b1de1229fc3e7a96530da2e554403aaf241d3036bdcbbee06ade44caf55793e18646394897a48ad0215c9d41062b431ba7a786b8430349272948ebdf2cf946c3e15e352e06e89de22e94db124353091e6e4bb356917f73316317525084e446544fa7fb14945ef53a900324479b796d4f0e38f40970a9ff7720e116d8e563b44d821a813ce1ec9e183b51fefa8e4043f96dcd5a56f0da4ed403e37a9186ee03762ba885453cf18063dbbc84b4df0055039107a162f44d1b972ffb157001a03e90548b0399e3b7a823ed00b5087679bd50afd8fc73476fead72af018ca1e2d44f5c94fc1fb052aafdc1d50574b8e928363d49a78dd1d6d2633d5f97b1a07cf9703bd3ecdcb222b65824e24c434df329d4107b5a867f57d60171311128ed6dd5e13ac5aa591da3feb47292136853379f47390a4284963a4221468eb4f9ce3c8f9c9e538e5a17b0e471d750322807e7145407a378ab1b9ae754532f4e4eeb374e66aa4b90268931cd72caa8f7d16cc509ebe37d5eb8f24c9e2c60020a9cf145bd353b115256aabddc95cd2d9ae6c45e064e3ca3e5abd34cb70229ba991738e7cb0b49bed2566a0ca1961c12e2ccdfa9a2d2ad977de61720b85b2b2588f1dfb3719ece2231fc2c7c4d4edaa41e612af156f0b59f3b21bfaa30fc72b2c20d95308a01a69766b130263564254ccc6f51fb3e3f35dddad1e088b70315ad374610e1b9114be9b6d6a8ad3028781b504f363585ab86d7a0fa04f7dba772be5a088a858fc333feb3b61bf3b7786f3c092fc5007360c33da69ecb6256d66df64cf446a91d5067f2924ee1449f16da26894a2e422e255e7a3286094f4c617216c00fd9908508e028bfb7ba60c0dec6a1d00b11cfaa71d922b55a5417d1c372813ca80c800612c59505da0cc1682490bb3db1f44574876e7b3151069db6d869fa058d22a0cc33b2ed50cade3e7e7ab115673c98ec0a69c496988a6b52cf732d6ed20e8e93e0e0345d07b55313ed832d5e24899d8e7474c0777b2a3504fd8572fed420b0848993d034b27dbcb8e4b9ace286dc3cf6d74004513228c2f7b4e30986e5463b818c53be62a67a43322cf31cb05d8e82e30a60c97ae7b6f633b7ef41958981301f41db2a62cd8cb623f9d4e5ec8440c7c97dc9f00bebe89dcca232728e16e3ad5b154d60f272ee32f6d6ab7d95fdd5bd0f9e22b5c7023df972a29f72f6f947c0de5f11aa067333b2c14530fc751a4870fac2001b1b3650c1db695521d70385281f81b050236d01fd32bc5515a485d3fc7a3775da41a063d0f7bfd3722f46dc43abadaad2785311bfdfe67e3365dc5e8c2a36a697b4acd539aeef147288bad98ccc27a7f076502ecc4467d260f941a4bef0f2caa8007518238c658e7205ac9ea895f96b2043a97c61e5720ccd323463c1ef39fe60fb86801572307f5f76b9cc8e65ec514c253b6792f94c1efee44c27d0fc23f3dd8111c4dea16ed372fbc573fa40ce721bc3ef5a49d2e1b89096e30c2174f326d69ba1ebceb11eac72b2aae67c2d205b6bb0654f8823a680faa1a1dd7bf3827b257b98abbb3e5dad7227d7c5deebef55b51bd051ed3cf5e6528d1690cf04b30af3f9bb796bcd6f611df6eaaaffb9f5c7581d6d1a20730e62a730c90ef355e05a6d93a41ec4d7d76672a31ccbedcf1ddb6a1635b9489a54b884ddd2cb1686b21b99ad52e3015e0a4855a3c35d2f7078739842027bdcca0089bdacc93b7c35c23ea57287bac2a0df95721c8a6c318fa8d962eb411d23d8f770106e7daa881588f804291b71b521c98708bb351f9f884ddb19b28794057cbca1e3d969be8f213774556a085ee2a9e15d72b140be59df9adcb946a8933e386ba99b53af5d5df61a868e8b510f9b3dbd967226df7b05bde21e150ea7f704a8c20d790985abfbc284414322931631d5344455d815116202a985f1601e4bd75691e1a1e1b5480bd86f756d0ffe41b023101b4b425781293cdc091fb8e6889499ca9c0f677b90024efdf69ca6d377aa16845c4b93fd6d9004cd899e478aa8b59d57705eae171cb8d36472d694ec0a50accbc76b3c9015cb14d08add176b6d4cabc6ac7bd4bca209be9bbaed28ed327c85222c726a60e987a26ec2fc747d7df21c34638744bb613362ff1f890692b7a696ddae729a66a7bbe097d696de161216007f63768d72230b57c82b34baa35931196fe163e73638bc5b6c95f60e3f4791d85b7ae24a970af206d6ee6e015e9ac61ffa7f3ba557e8da04b31ae7cab4c8448b464bc509f540e75124ca97a3c8aa14acc34c4afee7c4c326394ae8d5298c76d54516bab9c3467c1eccf947e491b130d0f7aa7262f0274df2ab657969fed9627fc3c2b02b42bd0892d89b6a575087dca37bd172cddf65a59dd924bb1548fb53a52af8a6e0866b0db04186d43e99df0fef811072fdf5151b55da992f2093ce03e68c3da65f6f85e5e3118c499bf8c0e6689ad972bdb9c7092962748d2c946b1117335f72392f3c792cea7044ca45c30c4dc6e572200f22c4eb34e1675069ef98a8dd17fcda1269f4613fde7649c543928b8e1c35b5d410f0cf468143f962f0d514a0f6ca6d197d8377ae41e6d9100613642e0172ab7374142b9f3a504b0b734c27aeb640148b656995c2e982696f9e4123ed4572a8ae91bfe670841a0899c5a3d7def912da5a14ae0d3d759f719ddde14d988b5875a0fc5b6fdd952ccc2f3a18cce9b3c20dd346c0061ccb12c1b44ac7b045f028cad896013772555e36912edc4c3ddbb8073636841972581f47d204bcd6f94a5d4f2aaa9d6a6d9a5462415be12a96f586205a913b4bf2ff56f917ba8089a70272575c1c36d84a7bab921b9ba24322dbd87f0189a7969ff185ded6db9aa29eea72dde19a6bdfff2a5e5f92d5eb6ce1b6aa934948800c37f6cdfa839ff3405cb372830a285344337d6ffe6f0780e6ee635b8ffe87f47879a64503557fa429ed7d2ddfc495a68843296b1c3bede94393f5b0d57f71cb64cb64e1e97e5d26ffdc893a9d55cead605153ae677d57772272120a3672e1bd629e6458e674704a4d28f17253db2c9ffe5f970eaec2cc2607f8b536ff773c5692e4963d979e7f95c5521272f8f466e9dd4db6d90a48303001952ca7d48f86aa236ae4043176fe169d8f017283a8c75536a5ba83c75d0458f4e8887e4e2c6194bfb056549e5a14f154252c721453b456b90e42042d1dc6fb509a44bad603a6de78b99297c61491621b728d72244c9cecf19b6bac5e3346f0b4fcf93612ac27f2e0660b5d43afa81a6928c272d5ac90966812316a187621d3fe9b38cec33b68c93c89f40485be75d80f0637615ad3497340a170240c33183839e67b8f07e9be2c806837a3ce8e618d22729f72e8e999345941383027623df7e38dcb3b833e4d25243c54ef881defa8ecae4d70687c319f63537cbfe2930e147e3e424b6f7887c0d8cc1a1160ca1a9b5c593672b3210120eb41cd1dcc86064ba560d2879a74cc80cf1e8c0b2038e32992b5ea72d9bf56d59d72a705cb23225956a3547f4106bac76c5e321485214ca968ac522d5a3d4decc7ed35f714255ad099ce22e462b0976c04e5d3da2f3341f7cada697282501bfa92800188bcb9fb01f846645102f567b20a6eec4db43e1dafad85b8722117a8ad94ee1d9f371912d062542f594107ca9f21108e2c0cb04f1acceef90561c8d59331f9e56c462b74e3a483b64bd2db16e2c7d1a5ccfb1b0629ec35296706be582e24a8cb8227e6978afb6ccb6c8aa51b33361b32986884b81e6c140f63da597c5f082284be12e627d1f5bde91e1612e9f0ed98fc6ab89b561b989bbe32e54e7c2af6252bb9b9614b0ee7bf7f1eaa520674d93bc4a3040281696e1cf9727dfca423c4dac4db6f0a278273179625bfd71d845b46b95eb10aeeefeaadb272573fb68b7cf24c80a90a4b810f27da3ba6ad2c506455a1d16315bbcb37c2c371c6cfdd092c6c1a8880c5457305b72b53451132edc584c3e25c4ec606682ab5725c742024aa29da05cf3a7ca629c6829c6c3bbae86f5292d4fbf4213d15497c7271aa9ae6895fabe93a13116dcc9e6e934864812a8f6d1467ca61b87d137414725f5d7ead3a47f28ab2b24bac79e56f906c8233245fe793771fca41738cf11f7266a7cf01f05c39e0c1dacab06ef56d203898a4e217a6624beda485d62b3b4f72a0be8e35e1b423ebc6cfb1fb533cdbf18f219a2251f372acba54d4b27c36f872239eb04b9ce898075f7d22013a5b0c166d3492c984da6f498ffcc519fa70fb713aefa16d7ac0e7906932d15b31dbf8ea6aa9648472d49b25f57b467d69378e72539a710672e2b41c73369f1a7f9048eefaed399f005c3d179126081c22fc8f723ad303031feaaf1bf3867265b2566ce38f24b0c1be3e2d233bc6fdd49b56e40657605d2e8f8f03457c8ec7f82c8c3a5c48dc7a5e367d07c861a054463397c73385ca255a4733ce25d1ba22771a6b3ec0449ab824c5eae87148f7ca42f5a01d13650273081fa782420e8caae2b346ce9db51f970b29d1df1a7cb0325a82a3ab27c1a8bee1b5ec502b8cddc0e81ca6091594c21a169e3f7a67728813458d075a72b62e0cc5d005f877f73d87bae96e6f3a045a710f8ed28289b82d2d1d2b3af4729e5ea74713a28aec9abfb180ccf3e518e8a8543bddde59d87524551979cee972e9ecb1a8a1323504cd17a7b64b98a5076706e414e5eaf83bf7768725b2518910a9b175c316090ff7e1224cf64e627097929302a6af86e0aeef85f2b2bd09b472d06ee4c8a004527ea640b109180aed39bc4741ea9251436c6e06ce484b259e72f5eb74e628398ee0b2810dd51ac887995943791a4816bfd8c7b5297b7d1aa972d504a06bee74f7b319e5e358ea740640e9663f64d94ea6d3f6ae3808ed425672b26beb94c2a0479539160d22c3268339319caa1697e877906441204cfd324e20cf48f99ab62544115902eddf3470289f9ec6e0b671ded91d5f79b363c133c0724cf95088245dc5c8f58e475ba9db0cd8d94d3c4e77ebb16c6f8409eec8e369724d1abb756fde02aa169dd0122bc05778e523115ef6af4512d9b892dd84018a6c3d140e8d9235e72b88eb58c999d26557df40cef1d794001771c29fa77de01d1fbe446b67214f58bbc24ddf4535adc14ece268cc039f923a507a7a780c39edf72c67139e5f2a0468e9cfc22c9c58a5615bc4be95cde369414814c75d1fefe5972d8e4f72c4afbbec475ac38d7adea97f29f16d3997fe0d62b4a631408d996d961bf23e8da081d5e1c8fef7632b07abf2f8ac3b296fab204fc3aa74b0ba9dad3720f84fc3a9b043189e76f160b730b4c3685b7e3f24c30051ac095248444fe0727e5d76ca1d0416d6ef6213da87c9d5db50130e71b4eca12913c57d6934dfd5372202d70ef3f5f11dc3abf0256ef2259adb83da80458477162c4394ba02899f44dcf6d25f3ab7a3fd7679139a69c23a1a95059169aa3a7e1176c2b12f6ee5215727c10526056c4cad112da123ad2d1e2d2b46c950ce9835aa561880bb996881772e94427baa61ae518af04a328954d7557c02b3e1f744e84bd145a86c382498e5a0e3754ab18afd76f55cb4d78f4e8b941b4bd55dfd8131d2a461b5aaca07cf734296cc01aea56a981fa9752b90e1b8304cdef81610d0c5e697ecc438cab65e772f0fef9d6848333a2e50b21705e5369a71dc4a975f0f55af29a44384fc1453c724c5866766dc8de304d11f50fa96e88762bc1236e843e6c7bcfc763c2d128b572a89cc8bef59860647342ae489980714b7688978667109041e91310f5764fa4725df8b3973761239d87edda3c3ebff81e0105b645a5a385a6a6480fedbf980f7239aaee1ef9241d972256dd421a52983c80df28f28232d70cf829a9772d82903b90d77b57bf6e77aa73657078db3bc3607123dac1288e8a9a815a6d01d2d60d728e9f36340957e00cb01405bdb812c26faeaba09dce1683a7a177e1ad9ecb4a38483f22d840db1a23b328e0d4b2c7f46a7264a9d96b1e26229f4c2b23e5962e725e3767a357214a6a5ec95a08cc666be277fbce5d55df900a4834f72f4a8ab803a9d3baad031b739637b2b56acef02aae54bfa1f9089ea0008d31ea87259b72685ca87b0146823d7688fd6b2d3c5474f34b53e7c4e4329e4bed54364da36c245aa18a4b02ae6d91ac3b126c937935d9bf119da06ff90b41ad92ab9fc0876e1b030f9534b7a92f9a845c08f2537885949be2aa1a3ff83e59a50f4364077e31a272d84b002e73467eb551eae130286672ad522cae758fea385cd6574e3be84949726b0960831b1b9ccab61b67fc14fc9100b3e1f9e8a6c485fd57c59864beb7783cda608ede6ed11d5398c21f85b7e749852ea083308ce65d999cf3eb2ff34414725e65c9a40ad1633b62950b0c920d65916fce3ce7e7d7d99b123af9d90e92066fa653a934ff03775b64a2a54b7d88a8be5239a42ba4382eaf77963ca01e36cc6ec797a18772f5922a27c4360182f67b3444d035018dda549975e6f694a371111341f927c1ad3ca82f7e3b3aa9419fd43c1040f5d18702a88646f47e45650c4172b1d56a6414283572ed0f79b71fad0676e03df61b21b3c3da65de9cfe6545d07249c67cf9cd20782c19bc831c828dafc97d30ef718bdfbd36ec91543da090ec72987b2c2ea950b339f36d71ff8573ed331018f9e60638195440d189ca05836c720dfa54bca13ba39b2584e1a6641c61bce34482b89dbc92bc3746277ae92fd72c20c00a87ac02e8f68afd1f83dd3f161ae5f20abd29139e7ab952af8d06298672279865d9cda68bb32ff33104d295b0d1e6d4a2aa81e159bcc876c36c0946365e67d745ddf6f80bec35f6625ed8f120dab2901b239d06d72c99cc9d60fcd59072f6d56123c2db5e1101d00864d00b369ac2619dc196669f1f5f642f967c90a0729bf455a5b03b64fb7f67a88b2c3f221ac7a59099f87ababfbc9546219fc14e7297ea4cbab48ea6224f744068b342cb65d0f858d2395d2b10d783e648a41ad67223519760dd5ee8946901ba53b22ff43270ceb9900b9a9c41b6396e9031827172c4a13a310a542769ff37de967d5618756f5f709f717a1d806d3767842f6eb772de4e25fd22a1c1689088c176bcb6dc9b903f35118e5c7800155e07ef79e2cc72dcecd645b41bc47fb183103895cc92f90ffce30dd452515a6e21ef7f2bf12854739aba274c52a3a37ecc76aceaaaa67447cbe03622cfb4d1388f273ca7803c72c05a0c1f95d4794fc7b440e7d9155f2d9fbcea93e75b61d55a9af5755a4ecf72df7625b289ba7b27a70978ad52270a5df35c06d77725a74eaf9370469dc5e566a12458fa9c5eb6260cadf94e4ac2d0668ee58a013ec66f239a9851c5742fd372f466e7ad8e2df72e491b4ed5b6cec4c1b98d7075f3fbafae893b7d298c33bb72c9fa8311edae73d6fb837b3edd4f6691178475bb3a33532ccb4c0b64c095cc725d6efb89414cb559785336aa7db3ba88e0c15a23f27aa7835c0f1f2f6d47351a82f842e3b22b6b8471c6ebd2ce45836cfe869a9f308e79ad48bff32c99a3d872ae1c91786a8e8205ff801f5accc5673053d48f6df46d2cd9fd4691bbca279d727e63c8a64d89029c080265b1d09d636852ace09a5b7f56c604f80a1724f2b0519456b71e3fe192bb19a149e3278c854d64ac2848f19a5a9587b073f1b5a545126131cffc9e87d2bef3a9ba1ad071ea56b1600e71a4f2837d7197eae212f09d5f8eabca5ee574d6243c186a4b5d9e14800fd6b7e74a766b897846a0fa164e452491829a19b49e586c08b224ac51c4dc78259f80c0e1227fa22ccc0724057398729a8b4af17e7c6f58cee9eb9475dd75d85b2e10d817bc21be4dcca83defb2b22ece33026b5e6eb9832ff19f05b6aadd9194ae1e2918f99cf214c489251d8fdb72b12138e4574fce4559c00aecaea77393a86aab54326714e1d9ad60a77125c572f6cb05ef53e4a0659633ed48757f782686889784e77d77ae87de3050f47fa472ce2d5b4f3f91c952546492234d9ba489a4e0f5ebb6b8344a8e346af6d8f9e9720af28e4ffa6c53145cb570a20e08741b569a1b1848098c3947737140955c2d72ae2ec0bab6dd8b9109f57a006afc5a1f7177ee63baa2be4091cc85b4f402fc58ee4d7b6545fddce8d9e947584673c5b4db6769a4e594ec7d3efb12dd7c156872c19874cfdc4c0fc55c777ebf32f6cb2b5ab8298bb906445037009bc22566547208447c44af9761aca8aed5484ad443924e46ff081c816f5854c5d20f11fedb7250b49935e38b50ce12db03bf0eca496f54665c4794ea3f4cb5e321b9d74be37279f4d8f8e8012ee533a9d8492311b40b61be10ab1a2023a23804d3dc51fda872044788d24129b06415bd551954f9b83ba6efa7958416f263a6ba770632927672ef9717cb7ea1bbc3fbd6d624867d1a2cc5e9e1a054c7e69876d51188f350a043dd371f13e1b315e22903fdfb3d80c16809683503f626be691ad85cbe4a283c723b03c0dadf9da4d112025c0fa48b8e2f73c5b0ea9434e5fa78b30bb84066747296716658235ee9d11bf0026fbc802c957fc92d5d073e922ee9a9e90297e253598f4c8275a58dbc0bd727d6815d3c92db7d5b6ff566f415a555b4ce8d56f0895efdca7507e555ffeaa996695f53afb1ddbc41f6994a0923b340cdb47da9b6c272725b40cd92d84e28af744808927671bfac7639edb7ebb70f2b9394b5850dd472b9650ab4f37c47800cfc5dab8339b6c6b27bc50bba470702577bffa3e184aa72c03741130ea14173c1334e632f8c5a0969249121eea421627767a86356b26e72f958a4c43964b5e3b191631829addc5b3e8c37404d8bb92653821de1b9b1c04caa72c47ea2fcde002ce1c6c1c9910f32f71ebf6552c90848dd764ccc8ad191722ffe0d667198f201e41a502b2b73c7fed89dd033444661f7c51f05c29133802f2118013ed3b0119fb1658d32cf927cdefb4f9f23288f7e9c1a4a1d407a14f53f4c63d0481f4f6629855d08125941ce8f20d1c26bbbed8b09782a694dfc2c6c7222b22d05e0aa1f23d1533994db99fff55f581329585f7d8cfb61b79a986a6e7239bc3405d765dd3d3c3f25c6c14f198e499c138cf7cfa85498b19c2428651a7277848d4dc9b588049133ad825ebb6abd84cdf045f3a3bba2000d1607bfde2072d0ac0610373dda9ea78eb755eca239d48cf0207428d94041fd35596169c2773c9350bbd11b3a4a709d31f1420e9c38ffc8a949c404bfe22b2411012bd50b7272163cbba397291cdd4c472a67804795807a93df009600553e7889ce0bdb522c0460cdf125c90b5c12134c4012368fe27fc55d9c7c7960a6534e7d96aa93d034350881aaf51653bb227e22e2ffe4485d0917910e2460ee2e6a86e106ce12b12c65d9fbc313d956b382c610c24cb5bc444b4d6bb5766ad132235955e83dea3b8e722da8e9efc0e5e249649b267bfc572a23e93f424862222fc72b4aa1c21c27a01abd70566de1426263e4d2c5d9d2233d4d75d32986bd9a139916be27194a98ea4480dc3d90413545070d67326456ea3b7a811a83bf1dc9da43803122959015a049424b2beac782d78de9bfec39cdfae9c46601f0a600a8f690b198535c03b6835b74b61fb425947ae4bdeb2d31fe84b0d2153cff8b0393b7f0194e0192bd300f2c4752ba7daf6bdea1282bfadcf0f9075886684154852ee4cde7d1a36ad0e2b372d4af3fabbd96738efcc60b2b09e976dfcf02c623c9de848e1db1b0321de98672ff954b2f501c97dc7b917654c89226e72202eef6cae7860069839da959b69f43b602a26eb90df3a2ebbec0f3d4b65c216fb99b08246d7ce1679bb084fc9b1a7270e46d936eaf98507934f09fc0405b9f49ff6b4fc04c5bdebf1812f75d132309c6c95e3018bbd81c9fbf84e56a35506c51b747af490dd9a84708282c85395a66204504291b319d0a468f78f87306c231a7e4adfae824cb9dd1c5c6049b2787728c0451f7a701a7bf02eabf5582bb752659d8b17ab47ea76e9e5a8d8378e88847b2f699391c417a2497fa9376acad677a24ec1742b03705403618fff333ded572bc0fdcd3660a4ccda7e076e2bc4da31dafb7bbc228f4a32665010f32202960121ca4af76191579128b39c487ed9a55e0f6e953e49d497b7062e0e855e35eba5f834ac5139af119412f5d70f81cbc285eaa6e9ad2d3c2ca28a5023b94ae1b911d0c5c9be8e5d907fabc0e7db00b0c722cc882b627cd4805b01598b814d1144572800486d9e8d4873d8ab8f06d7c0b3eb3b113cfc4024e3841c9326a220ec57c727e0a5a2e4608aaea045ac658c9ca34203b1ba6f1a907e71723d609c174c4e3400ee2b5df1f24ae426519b0cab68ec7ba3738b323984fa990ccafda395f0e957275d90d83ac6c67328ea4117dd826f8d732f5841c62b396e1fbf66e9f6d627d189f6337315b987814450e35c52c649b6e3bfc2e300646ecb1d60b0c6d293a166390e106e90e58298fb13574c3cdc3085d476c798308fd5786634985d1317f9872fa1b863408612a8ba523b289455796802f451596147350b71a72d0f098b4067213a4c21b598cb9225bab9360ee3a080d1e1c6b74ba0c9a9702de9a234116da4383ee02ae8378f02add9572babfbc10db5da06ca394e94258c89190d8f3248e1092b9683a3a37d48d18b839630294f01f5dcbb62eb4eace220013042f1bb08a41b523a45cacad166eed72b3f65e5ac755b9df87229b04921f84f0560109e66e7036feadce1ff8b8bc301855b6a7490f99ac4c75c1fefd6a2d4f364561a7ee187257ff1d936dc73ed7d9e2252a8ec3a197ee5467c9ad8ffc142588231c0e893f027e556dbf02d9690c97201d210c40dc9cddf3129b2ed7855b65fc85dfe043747207a27367f72bbf26dd3c958e08d25afc3c374e4cf813da39982fda82bb027872e8ecc2875326fefdfefa1011f9ba2ac2f06df78b3216aecd150f5a2820dde95b7ed7c374a5ec28269d0366690667dda0250ec18118cf93e2b12dc4f6a67907720c87af1d760345d42d1b508fd7e7023daaaa50d690e8a5b95ccd0367581a18721ef4c62b98d5ef73d6db02c25642fafe23bddb951dabc2d50d0ec1409456f072128d625126713e0cd20c0e9eb1c4ffc56ae42bab37c138290c16caaba20c6c727d4f24ec06b6a78699b0b2f42c06f66eb2c4558138c751538e3034e8995279727b43aa8a2e5efb3cd167697b39735bf981b3dfe404321e7666234276fd1dd9723aaf283f7912972e0cf72c92373d1adf1608224316a0395cf6ca6aa78639c33aef8e9f3480f7c372fec7e9693cba5a3e81fae2acadd819093471b396e19e93004c64cc680e6edc508c0ad2e1c5c406e80f4e5a4b3a62a35e1be0eb32b083f41c147495a838878dcfaeca6dac5800bcd6f7e7454b472253b23b79195d6a1106176aa22e0a6392f22f15cb245623dc15efff3120a017d83f39e6de2b2b483cb852e3f15ca774887f61d563096f218a7285c0699427de7e99e497272d0fd585d872dce9eb09fff5d2415e60174a9e161de70dc5abaa9fe5f08a6d5ce072b1dd0c7286b1f2f9a66a784a9ee185662d44be4df7887269fad906c3615e15db6d4b5e22cf3a401107b948a676d1f235a923562d77706f61ba2b7d3b4beea19a5c0fb81b6dad94b3cd59a9f53c32a9f95e2a16591b843bc65ae77037795c235cdd35a91adfa7b446018963b2b42972ccfbb56c9dc1b3608df27d854a0b6114f6ba302e727756cd731bc25f180fcf1368437f3caad20f3ca951d240cdb340bcdd67700e725adc32bef268a78df7dcf6c5d140ad1df23d29cabb11131a82e2c0c900500f727b0872971be9910c13e0fd015c2d5dd45e1150b79a3cbcd9e61d15ed8d81335a629504546d8b99d29e0bc8bd55fa7f829a528c50ebc0097edb797723a2b17272cd6bc584b73ff608df0a53f22c4406c86fcfbde063e14d28df4ff2c01ba3141037d0ddc2981f44fce576247c007c3ad2f1d9328e10b2f24a0e5c5941faa35372ca3177de71858c1a7adade1b6ea40eb305292fc1acf4d68984257b8662a79972445c9953995e8342554c599454d8d454e7be8c4f21e1c7a2c5baccf918be4572b7fa914c3e66c0033ff474d4698ecf4a2dc19e5967433b84f97bb35aa03d8e7282179ade802a6d775e4494a4bbe11f4272bc65dd0df6446b7bc4dc11c14da572d1fe5e35aca40e542d4e7882bcd11942ff2b367a7f568c585e5cccc021b8c91c4138f045437f5fa9d0d5c895ad8b613b874c22fddda9ad46acbb55c8e10c6f5c69971fd980cf9adcdb1e8c0fc5727ba41a65cd22d5f47f34429beec9a9de9b4cbe3435911f09d200a62d9fc43e103696db79b98be22fd2e194e90b2d18570672319ef9fe3aaa8b705b7ae3fecdfe1402aef868bc2be7577c0350d638a4c10f1163ac63b1ce3d33e6fec17dbc7fbb45d70ca3222b785d8318f62132aaee8fb972d5c0ac153b3e367dd7415dbb4d5924b995d229c7621da2866b029e52cf009c729e7ecbca81f6a6909676dfa0199d89a93dab47e03356711e722f729af5d15c11a3fea86e86d4f678d9d011b857bd20bbc95456cfb0635e0cc3511566e839a46dc96492d4b7a61d76d9af9c2c7480937544517f5ca40ec39604b77640fe843c2647483611e2d68c39f6e581e161ff39eda65ea7e42562dba49ce857b8098d2072d9446199f533a61554d81ec164df1dba2645a9af3da70e4efa2b212ea630280355d896540debd46cf37769bb58c5228a230c6fbeef8eb4c43134bb746550494ec138563d013a7c407307ee476ac49339271f258260137c4ece56b2f82cac4e7293cdfddf64a462fc37cb9523c8bdf8beb386dc5fd82d835d39c8df89070e3536befb5b8517770baa324320996ac5262db50faeb619980cee14c80bc27ffcd6729f97bf906604fd2cd1db41aa7b0338d1248c310eebcb7ac6df69aa65542b7610fc0b17c58a0cf36a9758f5f83a4e079fc057172c7990f659e6be59b3806b9e3e46ecfa7af334feac9612f6ba208d3214f8cce129100cb5330198d03527c3616cd7db535af9fca207988218674fd2ad6549128c1da931ddf6da400f21d6f687010394fcfbfdf0219cf9d221bc768ae273c1cde79dfc02dba3342ed2a3dc76986ae7d2fef9a554707d973a8f848580f07e46cd97f993578a3ddac1300f3533835251d9fae2eda2118315ffa0a100c5f93ff506e29a6f6f57c48befb1cbfdfa68728090f75918d72ea9b08cb6ac123361d86b7a0e6b1c593193b4ff6cc5d7b69d72e77656d4aa3dc4762ed7831b0684b2f6a30dc4298eeb4e187009d6b12bc228727c7578d861095f858609583497b45909f06133c7e4bb67ca307a7311f95f6072e6e71546e690865b71de317a0e2014112477df9e382947fbfa0c46898a2a6a722d8e451c65afb93df4570f1f56d5326138772e80c12cdd8b9ec72c56825efe72070bebbc0e4dca2df9a024d0c6c1f8932a8e9cfc9ff650f9555991c685eab408d49377e5201cd11e85c5395edec9954e2fe907950b3202f651dcaf929da53a46703a24a29adbe61f63fc813bdebf654ffaa459cba7f4740c717b21f99bbbbb13fb2e883232c573ffcd5f35de39038c6bacb5cc119d5d3d895e708d133745e7723c1006d5a2de3c84261a33c60594284ee21c2d55fc5653a465393961b7b76556e0251f4ad3eca31461938f2c74316e8bac3a0c170392aaf64f24e93c5083bd722aea050d8200f8912efd9b5b013f715b44b70a8423dcd808b6d6dc18a7f7f32deb65afa45469800839998d18d2da963c1ffd71515f3fcec52e94308e815fc0723f0197322513cac8db2d4f4eddd531022a279a72145f6555462b94442eec66727ecf5c1f646d2cd705aa888850793b4139b611b03292ed7d65563e23016c9c7270b3bc4a486e8c8e7dae8050529162be099ddf8f92059b6d8ef23ad53e77594a82f940dea4cafc3c3ec948e1d61cf331daf31e4efec01d1069410b9daa40d072292284ed57be47f669a3dddca29a37cb3bb1b62ba9e630b1ff71b165670b046efd9faa12c6e9516ad67d0132fb53841c12642eb6cf63e79fb51e1ecebbf04e1858b57039fd01b61bb56bb1fb78a6a232c32c3e00b465dd7dcd4768f09cde554f807d78f0b9ede7bc4855c01095efc3d655488ce455aa1930212dee4d0dcb5972b498a6db92c632e3be011a3d73c3e2a2e46694bdaaca0a3ae2273a5f3ec6e037ff8c94ed61a0a8fc5f6cd6e17ca104274160df05513cc65cc755a34fbdcfa772c974b95914e307e537884c095eb680d2e8e6c435a47bd6728f0eddb556714a726c1b115da3a9ef91032d1853c079ee9a0e73922bfd14acbbb4e762157911237222c7e6be86cf0f470aa15b0e207a47eb517b1ef5bf22b3985088f1d7e00e3170c53fbe6615fc156fb5e51b7d5133a4838b01679fb7280954d8153b4d0a67293c5633b9d768160e77bb79ab5f90e4d203f63782388d7a7e0613fd80ae259ba272d739bccbbd3b655605f8cac338259045a98ceb7a9933ac8b7a183f0a5a5a7b7248943f46615d32f31fc797248300769a96493575844efd7b02ed58dfc98a7b72324c79ce53c7073c9e1c54d49ea2b1f9a5bc74f466a3dc5d90f805881a6e2772f4a96e1c7290c0b77607af4b6e766734e0c818d9e34e91956e19f8336ce44b72802505b0145820cef8b06f3ef5e2c0a744b8c2c4b27b13db1e8b27248caad272695d8cf660d9e67f0c702145dfeb447209bee7dc5c4b9703a2545cf3b4e4ea557a1ab9fa833e1a5ab0749c1fc382fd87c3e54f5baf0c0cfe6618c99aa1b63472564b32b45639407dd961c026e18239dc9446753b1570a80bfd50949e6275bb723065b99200e081859d6c565177ddb6e75b5d1d8ef8a957466e080e35f456f34b8a994c0f093637eca76a303f5def15ca82b0a13e53137e98555b7e45e0e19503e5c7de6148d97826b8a39d045fd4d0ef4bbbcc47f5d69b0e290c5c7b3afc977239003a6f4cbd779adfaf0453e4ed78eb1f701a1bf508e4ca8405317abec52872bff450ed7c49c081fcb686c05da2ad75a9b71b13cc2c8ddd1660ab7f9c6d3c140c3f08eb3954d6e2a0702a06c80938eb3eb1e865cb26a0c5a49e72075b1d035914bfd9adbd71c4079f82b8d45a776db11b5bc3d85ce85aab8cd39c5f5b2971727eec74d59240e3b42d0bd9c6f44b7fad2a9fe494c69f26a55f0368b8dba9c872eacdea674d1215b633b3daac0b3487db40ac8c52cd8c68dfc7dba36f945e430809954229ef740a5dc20bdda9b2ca3ff38e8d0721ba09c3520ede8539b4fedc712dd6da77b8e478bd2585b82e8b5ca633a30d186cad86111bd54f644374080772036705426cd7a1eef4f138ad87d2257b1c37951d79f11c1424b6a823ed92520d53855af43cc0b537968cae16164d7d82e367c77d2590aa82a0bb40b51e7c3072c6c493003bb216bfc8532ef2bf8abdd3c227dd1b3b67b8a931571a4e69ff7772453f84fe3337e75ea8939924e32c64f343e3c3bc4eefbea4b19207d9d048401a2ec10b9433a5a466b13b6a59d6bf3f6fcbdc7660777640ec6437c75d16dceb16c147920504da58c529b142ef5787a4ef4351a46570a8c5ab3ffbd3882d2928246b061ddf4309d6d7691626726f5b8949dd5dc9325e2ef42920fcbc7b11e069726fb6616f5a1c9d761f1cdbdbc06b7eae7b6aa81a12208872de7ee10ed4e65a72f5b4a21932027538ee0ca43cadae83b79fd22f4beff5fd861fff8f9c99961272a12c2bf9ba0561b75b0cdb615f5dcd517395a1495bd8680f678da8c8d509d272c95f0a166218f411d0779fc253c66634563edb0d129843c6ef53d0f582a0566237249782dc01f2d9e4f3eb239e5c318104fcabbeef264fdd6b0e62c862759b2dcadaea174ef5119bce5ec92a334f93da8abd22cdadc2c23e3179a285f6b300082d3c9fafa5f82538d41960a63fe108f1512953f97a5cf57b99827d8840637672b4a72dc44e124a2eed8ea638b776f8fe64125fbefc77b9bf59b25410e0b16f72f66d4633917977b6a83e3cb6f98d447210906c2dd4968e3873c3bf9a75544b269695dddd7544047c88a995e33c49d3883768f9d489084308ff5b3102a506dc729322618a1d8daf0c690e6d1fd62bba321a8f027d554d4616fc9f1cf5e2bdff59e2d2305c502eb1e865b329925eb30ea5cfd5d082e2ca58b8932125432767f167e557edd913f568f298a54c93da0964a6747eacfef4ed557eeb6f2b49091a07724e897ae8c39c64797289ebc1adb37b0ef472f5ca110722b1b6c4b41b0fa63f7226f35b1250137213da89280ea780b65cd3634b9e611e12e10b46e7424fea0b7259f2177c0e8f14f019c71f07b685267f8d60b78be8ede13b8fa3e6c1fb927e717c9c667b5ce7a8520024e1f9a7d09d459eadfcefaad419f868d430a16ada987213c4e2b490d726506f439bfad56a60d763a08cf6291200bb3da4c525f18940725f00b0806d049c2e86735f1f2bc3382e7e36f4b6e186ddca4c59a3cab44707724c04159196839e9c93f194f6b4bc79236eee3276664919cfecde59fbc95d4d7214de1c25089ab002881f5aec257a91fe18821f5a27e15db5ad001da56fe9e40e4d61ce048ed3270e491c44302fa4483b9ea473089fe2557f9dd47ac00993e54e052fb054190621a9664d2e4dc2cb3e2f01945c5f539d4879c175541952bf0172d46a0006982662abf6a370f425224747b0906fa6f3b782b343d48358ed033672f17ef6d45cd15a5fa47591b8c16e095b578d723fc83ec9371615969cc6d37104435f46c5c8b09b08cea4dbf431f8e200d6b0a88c7244f3dc03e1f4c92e084b721bd6e11aa8c2f9c4c1fbc7260a529721017a35717b79cae7a4ecb6a9fac3212abfdd5d6a46ec713cfce4293fa816c87f9fb0aef87562e17af978c36a5698415f6e820862c9fbbc4be1a652decaac513d5f347b95fdefd36ab1ee1fd56c21373697ab76d41d89f938841912a335a5fa5f9beaf32c8cf2980132b7e9b05c838e72f2d4f5aff71e5bf2560a2abf53f1eced79ba36ec7594931335e20b1879b60a48129de5dc121d577bce58ede0d828d112b72d217e29534619545adff6fbebcd60e3ef0bd155f9ece9999b8f727cb3d8e11d23b269099b050676c1de5119f714725b6fba2c0f4f2b0b336413c06ce4f252295f487ce8fae25676c86347355a7d50c3cccb812add48b59dda55c8178bcdb9871ffdeb3c0dbce8a21c3675febe302379d8827788b002157efc2aab7b2976884b4ffe4cb9ba04e6fc1fa1842e617a72b8c64ee82726111c62fa442f8f4573825db40eb44c17385fd111de2a6d83374503da764563ac27f0a21dd314d6733aee22ad21e61fd2d06833db296a82225872b9edde524c1e6a78131379239bba6802c9621e93e1b01fdd5aa9bb49700f3d723b616b90200f536883792232075f1641165d73732c8432b96371caf5447f5272543a9c4c4152af4db17d9a2552fdf0155f4b1ce90555fc972a90ac20e15d7351faa72bc4bcf0dbae8b4a12ec4fedb9810d1212f0668e6557f3f0ef824317197261433da74c747c724ed45675908866b21ede40a26755426bc0da276c0a3ff2723edc336bb861ad1611211eb092e957a9505f98ee7f4304d10beaf91f854ac00be64d9e5f23691362cf8e09fc79d0b9c3760f8a4ebe9fbb3506802e3b93e4e2179f75547efba5c61a0e048ccdcaeb2b3d54a65ddfe1223669456ee33115f26c7220ee64bc47a346d0440201aefa9af5c439f4d94264dd3c72dbc71d418fabbc72b52950b0a9d7f704f0efb0b444623138623a0761238d2fa63bd5532080cd8172f7d1e6dc00867ed3a31ab6aac38b953f06d4b2ad8b8d4e581d93594f21fb687227975e0690d22d5d1fb4d1cb16d33046d50c55c6f50e2e3e204639e5344c8c72828c3ce4067ac73c83edb61573b8e42bd4baf0e316463e8881da4eec5196010c9c0d5dfe54fae1cca167025b62ccbe5d0f69e8f1a93d19f0b48862ea7b9965728ea0054f24d426223f3560d778a493bc49a20054455966e68cc67ce44faee8720d9cb3695993af069824d9fe5b989b25f74e6ed913b82996a4bd069bcbf5ce7236f6a4985cac3620381b7c4d239ba6c1ab1828cd1c4f400ba4db7a5a25474f726c120ab86455390e689fe3a3dcb4c24b3f4200eed6ce923bf2453de17f230d000cb328b18ed58d92f27b2fd24426ca19ef86e7a303cbdf30ae2c6c55e1a884729903df7ce0a9df710d268684208ae940697397563043b05bbeea29022556e96a4a2b8c7cffcf29941fa245de8369fa78d8c18c715ee4876ce44651e862f93842c719aa8c54d30e3297906594d1832044d39a4b2f0e3ceb13c3fdcca492db3972c2957b6511ed8280837a1843aed492fdbf25f9eab5ad8d7b895e8352da88fa0e44da9371b216773706ed8e357e5c9cb2b91878864114fcfb2292f747650f247248f00de53fbe5b540e20bfb15448259ebd7b4f5cf3ce8156ad01afdb376ee9720b6df116458f88f1375d917cce38761ca284d792a0be505660f9d7f66a499f72f62df0678fbbb9f35b86d3814ae3d4be786b7bbda9ef623ca8e6634c309c14724c171259149f452930ec7a2a78eafa64f24d98ba09d911a6ffeb58e61be95f563ce3bec88ca93f8b87515d3ef795716d2687b15af157e47c907e8fd82feb0272c213c729bfe63847f4b810760ebc59a7f1e445284b748b9d5a65d35664023d725b49bd78f31049673a89e4c8902b8d67a47341aa6e0904558b9bad69d045ed6b090bd1f694c538ab4083a7a01428bdf9ffb02a177b89ac454b95e928bfabee72d995a4ea331298e3fc7d27cab57ff632722064fbac901e2eaabc65042958324eb88c023b1d92f431453c126a275b24f5f87c262dbf315f96a5fc3ba4cea08372dc167e66b26511dcee2c1b03c2fa7a28cd43bf547dd54b14891ee6fc98db517203604b3cf6ac41d2716e00c1890220aea7d7987d2bf09c49f400464410921005651412420c813fceec1492b159f2b7f6101fd9f99cf43f25c30621ef8e75e072c96b337c5450abac715c09c9b17802b37673d37f8c0b398128f79e463aff3f729d47390f777fc3af50039deb5689342b59144cacadbdb1f3c12b9eb3e2554264d53c33ddf64e1684a5f6bc181386f837dd4c9475135e6d121a5f3c31fcbbb52bf38a3dc3eef262677723dfbd7a7d6b44abb5df861ca830038e165a3d0235544ac28dd2840fa4189f31305063220e65358b0f17ee93d07e32888a5bae1c134864af4ea72dd9efd560b9b5c120dfd048288886be69f9c2ff9c8d9820b229b64322cbcd468e61fdc10a39e3dcbcfce41c64adf42d8ad900ca979f4bb5dd8e526872dc87166107f06061a0ead1e1a7f999e45d44bf126d889e8490c2cd2eb37b9e72caedda7f27300f9e59976549dc71fe5495d458c00ef5386b09217084020a8372d40b8531020a65e0632e69497dc1d31d743ab65acf0d4232f424131cac2b55726ac5beb96c0f5eaa9967df3bd08563f69423bbf04b7aa9af9235b6433444477204e741048addf63c4ecff8705a912e27eae99892b63d250347fa70e00cfe9837edc9e875d2417afd092e93030912821a70d67b49b9e77d29aba8651cde4a50721685007f8ea41c5bd441d95f3e8808ad889e1924ca867260eef077917eb896242d175ea16082836ea1879474d0ab84117185a07613775f333021bceb5892d8630f1a247c158c7c09cbd51f9bbe0296226f7b020a1384269306c7bb1416e4010f8e91244d891389c61b8fbc57c1b931c54fbf9ff40909698e7b5d040b46037172b3ee5a21d17ebfff75c07ba084cf02463d762c4f9a3bcef9f59109566734e5720d68460c7ed72711decc44143c6de7863b073cb1e44a7950ab4729eb6b3dd3727d27ef3709801597aa9edfbc88e55b323773be8b96b565c516adff6907bdd45c6f0354c200ffa340e2107a7d8335d4c71af51c960d1c2c45e9c2f36ea4fd08728d7d9393aab13cdd610dc5072d825a3e186ae42c964bb8e4a50cd29de7e04772e4f6f3ca5263ecf9efd0a97bcf859693b29eea2bf8985341e3ce7a6917a24a72d688ab1fc7c18c5d87d5bdc39361ee53d24e7c53f72faee30b33ee4661f42238e127007109359f7f798c04ae588c957955ae31337472324765187ff383fb591e17cc504fadc0341bc0e102944dc9c3cf5fec022ae33f4390a4ed38a8eb6a09681e9b2680b7e31da7b907a67fd6e2d24fd1b7ba8f1427ff156831dd84ff039d729242b149b7fd045e4f7169a79fc3f33f76f810e03d32fb71770a356b94ded16333e31d1c76a30864f7cf92ac583acf384053d51fe909538f631bbb29e9ce32726efabbc1383ccb857a0db0b458f2ac92a26bb2713814c6a13af3f8f6a37c2a720bede1cc43e95f201dbdce41481d960c2b5aefafc087c6cfadad4c274d1aee20e0ff65c722ca586563708830a6c072751381eaf02ee5441658aac913e736ca7210f4c7e2e73933822049237434b8f1d248c705fb0ec7465e016ba28040105f7235d50a60c9889e7e94c7e6d0ead3a4a7621068108a3964e209edc6ce1e69181be98888dd7e8a3699b62da86b632ff124ca0f290a9cd1e2d64dee177537671351169676f6c6013b37b464b5502c957f7ca16481cdce0674cbcaed19c8aaebae164b1ba5b5e3516665bba0867c1635295287d295108592ecd2946226a075ec49433d528d2aea6e38f8752f7ec438dd5d93839fb0f22a4562194ce0a84c4b0b6b13870f18188c0738f7f5da627f6550197484ec16197c7227161ad3a64be577e82f17740ae3890a29f73428ce8fdc3fb9f6975e1a321e416226f3f08f56fd42787267e74b7e6117714ea1319ff60211659dbe578f02393065b97d2971899acc6c252ae0196b3c4cd96e958a8044ee8e146141d15fac64672a8435e15bc34211ba72ac7f77bd0ab71abbf1af21c6aa9078ca3719f4b4cea80cd31df51d080b2a1772911de18a3e3b6c0b8fc6cb791a905ba79a37c98ef82061f2b2b2c2992245fd7272396681f27a06c7d382b32bd42c216ba6bc84bf3959841b031228afddf50372b5d99315a94a8e201ed6d1b5d50bc6d72cd6b2d9623b397c267b7188d337204815f753ad3b57ccb03239da00a42869b369159c0c8591d52c7e7c6d208cfea972b69b8444e8078e4e96f4832d2e9c349680bf7cf1aacb691dffe4c1307a380f7210a6d16ed3a88616e3897dcd72b36e22a0d9a90d25251e217f367a1bb327ab72f6f5651a08b7d585b2a12ca65b014078209cee0950e60cd195208124b0e59e4683a92c286efd4deea76d52510fed1e7bbc53583d5bc3f99af9719c538ca796723a49f6714ac2d1f976a800ce9f8ccfafbb9ef032aa9a551a4b2c74f594907627ff6085a4cc7211ed1f48ad769911f17adb511d083c4edbdcd523ffcbba37425bb6fb66c618248b72e9dea6325db51fff9c0aebbca5c1d3d26133fefd4e79201ad0093785eed3d0a098c4099821762cbdea089d44401f5557f6df92297189c172a46a62764e82fffc0a7e4f2d315d6e2f2ed2b0047c155cf55adab5ad3ab07d72fda8a45c826cc6297afef387bdeca2fb9a1610230548e774b0494c257b39c372af49e9ff3043f92220183da68b253145861d5e20e31d8b5967f1a84b28861c4d8812a75cebf70a5584319194ac721b69d91bbd49b065caff3ea3838c4f2f5e728a6b4789088dc327738713717e717b86329875849a3e88db09b3fb83921eb772d162e537e4e37e6a06b0ea9a7271734eed7753d34575b9837bf18b2701caa90a25747b5770bd23a9d19722cf4c85a54bc16249b19a6dfe3f6c05d6d4a6e78a44475f3c57a1104afe24c9d942e0aed0d22e05a1946379db3810264a3a09dea472cecd330a357b934c211f2e750727520bfd7606bc6090e8e098a768c212b8331ba9a3c6a896a19e42cee35f4bb2937554400b8dd695004814b769064bc4b51e72eaedb1aa6ae23c8e4a5e1dd9137b822326abbaf4642cc2c1d1c3f4b8ebd7f348c738a7894acea280ee050b11090927a9b86a325698ef7d476fd6c39a69edeb72846ea71395d3740df85ffcf23b37c52332e6ed06003535f608634a07abd34272667dcc60d80dbc9b68eb20e1e58fd173c6a26c7a7d6c8d03e8795e19b4a316726db310533752a1755928ccd46877d196f4463d668b4325901f4697bb14894a72b7cb4eb1ce739ab128505910655f3ad65800552ea2ae7c2b7be3607efa77fb1e1de4f246d882fafc17a0742a1c26512d6ad51fafb5c216a4eaf6088966e49a184eb53c2ee517d171033f8cd7396a4445e5e4224e34894c5325252ba274a6247205090684a0087349360fb2df62552b23c3cf47925fdb15440bbb9c4266ef9372ebb716ba8eba21b59e9f1ae70a7ccc2068ec6a0bb94a0d773476596f878e2f72f8d82b48d0f1d8263414c025cba4b1099ef6d6290322c52d169a2becb516684a846b268375f1d759f372ae74503d17a8a5df56ce5feb0230c6d3e24d3dd66f720ee5824e2db5d1de435ee15d6b5d7f1fc50b112af55291d0a7122836d155c05a7496418442efa320bd6f75011a17217eb08ad6cb1e66b1f2460b80bab1844372d7be2a66cfeba31b4f9b9eccbbbb691d6c30933ef3d21346ed9fb993d715610202bbacc155076f7016e7c02a098bed82428e697a59e3d02ff91a7a6b4a17977274932d489f97a6fb93e07709ada3ea65058fb4ee89adba867d2274221894087273c1f7b4182ad9c0dd4ab8d65b87ad16cd6ecd124dbc73f070562b2708246772e884193c4dc68d88181d8baf9f55ce758a3dafc33258a2ec4fe741901007cd7275097331757547e2e48db09b74221205d527131e7786db5ae55491f0cee206674b4a0c63f2b8705ffd975e9b0015d97aab81e0cab94c35956936c3315533f702cb70a28a400aac92276e4049b3a5bba0d325df48ebd33c052520d856741fd0728c2815798b12a030c166fc1d20c85f7707bf104483a34f61e4f8355293f28072387c86d8404a9ff75f126c6e4372f0843be565822f50e3e304b953b5adb5c272f204ae224024102394f912e32ca31b8e041343e0476dceab283c775f383dbd043a3781f91b6616941456122c999f3fe1e69f9419815eadc5a83bb7a84580b97283767afcb61fec5d9aa33e8bc2a3da9854ff9d49a96360a2c3bcb480a6e622721aa71b1983a9f42b7ecd3930f5e05acfde780fce57e471759a4aff81b952203258c834aee0400b39c3a14fd66ca97d9f6ad6c52a0f3b476846f60871e09f200d22051f336e0ce16e929df1bd7156a74d8250e87a69ba9c7612c9af3451f71b31433c02a26dfb7007dbbed8b5776967b7d788f4dac0e3787dad5e759dfd0d2a7253cbd2dcd98fdf9bd06a2e8187af8ad492a66c9c629c8b3ebbc9ef39454ffd72a1b9eb5bc83b7180e91c87f0eddfdafee3919cbc6b1e489677c701e775e65972755b3f6c492c8f4493391c973b9092b24d2e97ded9139cfd319ebd722fcca8722a82fd7bfebb67125ef9acb7673244a4a509a64b40a39bb7e223b1efaedebb729b22dfb2d92cc3493a54c4bca42e7da69243969b4f745bc63d608524277f78724797cd8fe3bd310624b3cf355eb8de6bbdfd51b68ae3bafab7cf1f7b6b5bfd72c4924e7a077ab078ce69867e326fd6c7dc713c226b657d71bfd32128289919545dacea2f8c38eabef9ca72b0392529c52416b6560b6fb67e10b0c072f15c3a578da837576198259f19151a6cf505a0bd86de9842e94125d94046bfcaee28e2721922105aa4c53ec71660bea721a49f54ba3fb3d3ed274ded19a080b8f3b0aa72825981a1aa50ca2b3e90d8dc6cc304d93721a80789b3a5c26187b7847084740aa303ca5aae65c1af02d44a8e2d7d71ea29cacc8be8a39cd02940a9faaf3f023232b958343efa63cfad042896cb595d3e3bb8be5b8df660e2af78f44137e40c0885749edfdd8acdb498f1ec897aafadbf91a14af2687040160931d86dbabd2472d49f41529241eea0156c3ff04cc748c95469eb983f513205b9028e2b421e545a658b4a5ce33b5781dae02dfd660d04e392eeb8961a56fd36c397c1c5cf55ee721326af91b151516baedf9e376fbd42fc66d0d5caaeabb57bec2d3f1861c14372a9ac49e832af7f2823a392ac692c9afc3c864918a30e09165bcd87bf72685772d9638c10e2b0c5c14d6dec276744deb10b0bafa38664ba24d0881f1f5acc4472a5412775b931cc295601c94fcb0db8280707d0cc1b8098629349e11fab099400ce4d88d19fb84ed79e4f7abd5058253ab416fe4547eaf065e9a3295ded6e5b282e1ccd2066a36bbcb093f8399940f79428fe53d0f6be904b5ff8b8c36e8f1772e8f2f0f9b1f8ed1a16134f0fce7bc63e969166513ca962ba16b23bca6489675c614fc84a73df4f4e5a9bf00dd515cf250987cdfd1313c144ef9ae47e6af05743374c7e1eb28dbba8650909b4584e4af4cf9bbeb86d120b3abd992c4eae884359a3975f45ebdb413a4d76cb019c8774a121216f1ba16731b6583190f002a4b972b97d029fb54f13dadafcb305adfa37f776e80bfb43f348cf8529b6f332fc5867798aa31e8d3d822aa06e284904b581d5968018efe08c23fd7bcd9c2aa1def77259b2aab4ac700352fae2c65e8d336c8541fd7b436758673cfeec729c4c2b0172d4e4bbf785214823f52485950554cf7b9ee00ca63820e42a87fdf827138e6c47673e4f2a00404078e9485f406723a4cc6f8f4eccd2aded3894bd1c6a15635c72a3ece203c3efc2ffca8d7d2ef40b82f812298799bf8b9757569014f5e7791569cdc21ec1f792ed2d80d12cf533692c14541d5de48edecd6c9014e1b0d23778506dab9e266b416a577dc3709b3afefd70d220d360a821477ed6bc6742fe17042c5cdf818ec78b95e46c77f4555304e60911e9770cd69605d09f91796d5c187272fba34be5968f561dcd7ef693df0e14660da2ad755a20ae4ea4fc086b3a387372c38c965dd1c6ccf760759604f73b3edc0abfccc511c11b1d76193c6473fe05728cb52c29af6aa6cadc17234bd346a2a52ba3517e12fca7bba737ff5fab8c6472725c92f8e2733126d2242524726519e5595d66c9e78b02c433b2bd3ff5140f72b4520c21284c282e8082f24d6ba251447c72a94dcdfa3294be4e05c337e3b05ad3be542fadc4bdef42afdf0870ec68b35b534bc2996150eb450cf18b85fb68723206a122c7dcc4777dcc2a54d46733f71d6cd2ab6a5632c8feffead2dc28c110fea0e95ae04f79b95cce8ac6f32b26c14826107db14139e906c517b353f9000071b21879e2753d6c3233a3ffc264e65c03f8d19b0e81bb6ae554474c5d9735729c76b1a48b5e767f26070aac6ad05f0366c5866835dd37a69ac251d305ab893f85330bb69e46bfc6af9287900b9a52cfd939d1683aaeb58e459a30e4542ab23566aa90bd3ec007a3aa684c023ca817cbd37fcebe0b72f8af4a65f059ab57500799e4ef1cf7d1003d529213183173f21b5b5abfe9fd1f7aa03a47aeea1bf9da72ac701303b15a86c707fec8824513d6631567a620788d4fb34996e54923f4051cdc7f0b7956e43f41386378d46d36b30987f563dce608e51ac7cdde9d6e541f59a948215ac1c027b9f0165691c8a68d22ea509401b4abd0f2d40bed8e9a4895263045d5531191ac309e2d196d7a54a77a650374d39650b91e020b329c077d6038320af9dd40aa875fca697249aa77852bdc7a192e87f898fab54c01244d0cc4726de31647e18a3caeaf0c9d272e11d97ee4dc9bf6efec3172a28b7f631f753972d55fd6f5de091137da537e484ac7fe1812506d5815026a16bfa29d797db28b729859c256d8ea05939d5661964d0d4df628810e0b82680c380ac90225951c3c7123ff747cf72dbff26b9243c1d493d1724d18cb2f79d0e030bd6f84a2c45da9725112098b9cef703d14b0e379107784971dccbd9de295bae314be83ec10e121726d969843a94a6fe9ec874233aefcbb7cb8073cef4d51ca43df5d66ddb6573e7262b3717db6aa1b947ec418dc6974f347340a9f0ff57d86e1146d365553b310727a8755d7134ab2ef2fcdc31e0ea776afd24b944d863fb338721368a64f0b7672fa3f5c23752b60b7acd414866a2f8a23bdc44071a1a0d2f2491f4b9b6d7f243cf69d53bf43018dca6331338bbf29e066b9d92c1486c64a62574cc43f0954365a0393ea3847d740f35f913518914c7e60c59e10b32e3695af8ea245907fa79d72a50250720558b7ba66be187e4a710df05970b7c7a3d424cf016bb6884fa478726449395ad3eda164adaab51fa3daced07ccb6506c216ae89be327345da189a570004cd7136c02fbad9dff827baa0ca9ecea8462c1199ff666f8cbb4ccd9aa272fc9ef11e826243ca69296bb6483355d3916d77f9c578a31b9bd3946145a49607d39cfabea8c7f50b5a4a1f8fbff911ea3ae396813bf7fb71d97d81313821d772f01c3c45d0ef2891562113e331f58f56c309d8a2759f84b2d94c0e3fb7663303e25433ecd12d73ba95ead74e2e00b860c5fa3967663d83d22b28becc1b6e084085f51c36479e4dd0f61237c7363869cf9d4fa6c56a516add840a8c9dd697ec30a7d5f808fc61baddbbbe1d18d39d30afa403158b57939859e5fee7dd5e9acf6b42fd62bbc35249ebd68fbd3be6b21193cb7d1945d70aa67e507a3a8c0afe0572c66e7344555355e143f538eca9b1a38961c05a77e8fce2bcf7818923d67f876ffaf1e3545f857a7f3de6174a96f6c01f5de9d7e04f09566dae789b65a74eca72f1d14be6dc34fcc503d04cfa070b315e62b95d08ca7190550ee0d9986134486fb0396752810dccd613a52f793b7bcef4af24ebf1ccc70231c2c075bf6758fb729b4c0116370a272b60f845089f70ad3dc0feb4edac325560957d5fe8209269720ea922b27ea0ed1710cebac100bab053a5479a213b37eb5ae410ef655404fd4163b6c4cbdff7ffbbc2f4171e787959b007e2c3261156ac93d6575fcbe16a6469ef23ad9500dc5c9ec4b37f22d2f05f6b839688006fa56c86c46a8daee9cc3172535637d4980bf3eb5accdf13ddcf5e0d33efe49acde626709ec51642d380bc14a83ca4f4743dfb4466f27be8c1264863d81817f20271f2240a012445e255b5721349be7c0547f9bea87f06a3bdc1f0becfec498ce425b8b6d15470ccfe8002724a2405d807ed72914fa72ccbe2027327e966099607419148b65651f4aee40848eb21ee30deccde7c068ce7c5586e4d674ad7626a7808bb7db4d29b45a2cd957286e8d6d2456775d854d4c55eedcfa9f5686b53e100258495319b18fc66119f72f1607643d42ad6dd179dddd15e92ab11563e1e34002dc43a3b5a03d324f4044a523b040ac870128c71dbf2ee24c62403dbde08265f3ba9a530610ab9f1d50d249c55a620aa62e82fec0e723f7aecba0ebf40245a4154600a0b483c27f252d34adf3982278870461d243931f55b748ed1f2e3e32bca5867e503f91f4d60142d01927c8a889ccc22af37a8ad5dabab2688aed42a5d8bdca0c8e5a8e41eea88eb72a5e0f1c89f06e10533aa4ad6eb7ae94c614eb7d6efb580f6378a0690a8fb200874f96966abb6782d018469daceb7a462cb3aa74dc1375501428b585bfd625172b21a03cf0a00a376f33b48e871e92ac648763c83bcdb0dee4134142d87684a303032c69fdc7b50b913bb361d5dc8539fa0eddf77fc932a6f792d5e1dc8a2df72a80d9a5cf49b722966230a5f226f948f542c7186b4bd8f434b5fd92683c6df72cac6decf163d3a304d4df6b0b45e176ebab2f9d7a9bbfab3c36505a185bf1a240e50af7e414266788f17688e1d7f22cb9842041a69e1e9700bfd4420787884720b73953b0b83319ce45d20b1597c9f0b3e514ba4f6d8601a06f201e94474a60bef2edd71abc9ff8e086aff3f6285a6f95061f6d1612a263c0812e77b00cbe9276985bdb09c0f12845600cd48e1d3691b9d52b9d932ac987a9a90c88ae3440b2332395a781fce27f5f3e0b13af32410895bdd7f5e4827b5f1cf858e49904c87728bed336be5c8d50b8021290612d05c862773e1ab7b977eda2995f8dbba5a0e72ee12d68f3fcb717dc0b70b8553b7b2a3ea2b1f2439a87ea1d4ba06b223d0b87220b7f70ebfd2ce2a191af7c07a4c8d20d6cb4515faafa350e4516593e416eb33217055552613477b0c1c1f855af8a1859241ac864c1da3f9f88911ddc637942936fa4410288abfc866daba2d3f1ae0ef5202405aa3a63a2de4011c00f81822613c3f2461afd4864b6c6c7736c73879a16a99b3ac53d4765e803dfa9ae3edd3129ceaa20626b2f667b96eccc4a220addb829ccc24f7161b56a6e9609056c2f772f0e0b7bbf34f3a3da91d1c417d0b696c8be1063b3bd393711b02d6653885f34a423200370c34e99f4705ee92543b60d8f4690c463f4a9747e790663844aebd33e0531fcb99138dd358cd785249cecbfb57d84c272f72cf0620554dd4f9fe9a72360fb2f690bfb1e00ecfde8e36caf518abbb3a36dfc2d38a06e255f02f5274702a8b48ebd31a9f667575e650afff2b9ea823ba53990988f966ddb8710f5ee072926115d9ae8695abcbd7273f61a9e1aeb09b82efa0fe62d68350dc1224b7164c96066a82eb062454a79815f46a5125b3ee90ca92214f6c7e71860c5dfe07b872d2d067a6d07de7f6bea90ba8290250c6bdbc1df16aff34e0a38b0cf26fe767728c487c819ecd7646e6d07188aeb218be6357196a165b1dbeb7281f76aaef1f07d630f1a5a0d6b3be45d0e465e6127b9e9bfedd4511e559a4f1c33db95333c672984cf9a3addff6875f8f7d15804ffe673b6f6981cb29299d06a971e6b8301136497cd6e286313505a73d2beef0a6a22699f79189f9a73e968f8b2e560e087326972afc019226658b0684af0063b7d74b402884bd0907fcf2e3921b9f65bffb7266dfde62b83f5b57de827c7030cce65fb06c2d509445a172fa44a4ba74503d70691f17a99af2512ec57c2391c26f73a42e8f42316d469a09b1e73c1d4c7f6372e6e36e8f422092796ec81cc2698afc5d061579d4038919e786c6406d76f26460d72464acaedffe7a6691c123581ff9d58fb864bf582b0943b3ced6842a1b3a72b8c79a66906f457810de16426af17c89557a04d9587e01d06a15e3e8973a0972da9794f2902a35f632ed379fe3af0690ef6a7558d0b7c2016ccb93898711b272d18a15b7c51d231ba55e3c38d0ee285194848a5da7051cc621ce359400886172beaed25a61c807cb9c28f301f8ed1e6593d78f8806d89146536ae7fd7e6ac50648e34311811c0ff9deef533558f4c6c860a5e74ec3b96ca20d83cb293d1e426481e02662623e1f18715f4ae82c7a0aefa444876d914f6a59039f6508522e6f38b58cd15d6931009485bf4c76622ed084c4aec7f39811fee3212b44f940848272fed3faed65eae4191e27fa75fa85498c159d2eef6de423fef933d0ae0027a7729ff6f8978e1b7249e6ae4f57e03f22cdfd3f16f34638a30aecbcfbe2d6140872d6466880cc45fb4d0290bb46dab9dc7db3ec2535f4a57391d8640cfb5164b57285ee94b0c787b92b8260f3e4eca1bc0a43c5bdc18b179b46bc4e053a4c6aed6bb66e8ac9f2da4c71f20cf864fe8647863a9179a5d4b2002f6601b19645fa5e5fb88fe141873d76665a193a3556f370599e760b3684ac4723eb7d15a50715814f98d10072cf21d555d3ea021adf4f9ae9f4ffb622cc799e8ce620cef71504f95754d003fe3c76551b4a3ccef42435823b3a478e5c7f04aeb989fb9b39a55a1e721044267498d81decf715590457b83216bec906b8cce9cf2e94f9fe4e39964e720ea99237e4d9579e2da0e676be72723ccfba250cb90735d4def6f4f00e41d172a9d861ada74494a252a30405eb8be9241e7fc5db6c2c71c667d116aaecada932c7e3778ad012b9a8a42ee38f3726e2af47f0add85a6b912587a2fc296c96a572b01e2217a502522d58835e45d70d1a19c0037cdf26d0278a71047f9eeb6df35cf78b0274bbf9f991c7146cb4a7363db1d6a4cff77b9c968e4d98fc99d8e6591eb3117fa09b22ed766d1c01c37768fbb9db3a3bac17e57fd90480d1b764d7aa72061ad1139001babe5928f23f64c2d180409f0792bcb745c171e55c9d4d018c729c5de96ba7096a90959d3fb4ccd5b08306de35c5e21f608cd6d26b4d756dd44533cabc9fb2d690d6232109da12fb3d212605446ea759844605d64901d450f27234b3128b2b6e606f80375f7975fd22a97f9b29f173a43e30d2ed93c84ece0d2ec9afc6ae9eafa479feb7a6e90ce09795552b4657d5438160608b60a8667aeb72db11585ab254fd78a538617f3668e05626a19cdd8f3ebb642b412f0f5a70540d454232c9af8bac674d7649458747a244143b374d4e416d7f78f48fbb30a0826ee2d63ef8e3cb7115540eabbcb48c9c10b0ee83d6349d2626330f8ab632417a7220ce0144cca882813a848db18951c9a013d7618117113d0f9bc53ee57536cc720f927652bda96c6d8ac0563dc20b4cff20fe8bf48ac176da7fadb68e59b467724f47ebdf146c3ba7fcb0425748fbe07a9f67609f83cfd70838a8fd2e306d5920f0752c1f06bd56f3bfc5dcbaded92acfe2ba227e9517d07ea2ae0ca6b0ace341ec1448d09cc60695e732bbe508160740493220b9dbe4f3a3e4047a169da34372b9be0cc7671283047458f63f69cc687a945f1b7e576ab0dff5f029c49b7aa4721feaf8a94fb0dc5fd14457eab0f29e8171b80d552603e25a086a93f766228a7222cd5985368b35f08e7824ffa3160435ccdd51a462214583a2949332f859620a90b6d1970d074b49822c00e151d1a25fb9fc345300318cd605cd1ccf3bb40e727f82ff2bc2f3864f9e01661715daa9ca89bf665ee81d1c6a36801bfa20fad90a29683549bb8df523b198fac93c6ce2eb220fb973f558a135e63cdddd49554b72dffb55ef1907b8e31b3a16f1eb84c3e6aad9d92d428586584aea09af1704d252ad3c7e4d56b2737da1dc559c4ede5c9ab8a8378562efeb59c794befea3767c11d706fafdf6098f9e142f6971de98bebe5f9116ee960fefc3ec9345c867e6127289a890f8f3f3db859cfee78c41cd4365b1cf964da25c1426204cd86682db9970c95db60af1fdbd0ee19210a6bf52e06d3a5dd4c4a5aa3b449fc3fa41e635ba3b53d0fc1f286cc5172dccb75f5753838176929985a995578a4e92a8814ccac472781f66b122628938f1febfd186466da5ecee77427e60e606b4bcff53bd987c67e611dde3bcc25b566471588e8c4004686f731dad19104867f4c786c5efa5b672dc46389e9615eab4a3cd705dafae69ada9e2f86e056fc19d43c2efb258231a72077d6a737ee59a8652185083c4fc9dd0abd2e890fbc8228d10735edc0079df5b7b89bce6e5cb171533d5d345d939f38ff4a11d559079b203e33dc1f683717c723a6a382723ec0ebc3ece0ca83e54e30622fd9a779c02a4f9cdf0ab41376d2424ce85e4a04c4afb6060c108a66ca419a6dce1d98da71134ec7edd452e6f3b6b72cf703c56dcfb67a651491a5cc33d63a4b6ca1c38c70b2272b64a1e0332582905ba1b386e42fe4f7b4842415ba74d2d404a7977f00e929e4aac21a0afc1fb9072d7ff9ff694e3f594fbab1807f6073dcafe5e78484ebd803444eae728d2568a72e61056bf406fa303a2d8ce8fe04716a58a5ff403ed08c4013921401584f19f720fd33a84a544cb828ded753fa7c9ccd644833da1173bd15d6ab1b66e563452728ad0e45ee9b724fafb54d00b7642b5fcb84bea527a49bb98581782301e609472f13de09fdca5a0fd7f27c8e3c1447896337ae99ff158063b364e69ef72eaaf4803105277075a012cfdd41f0ad609b5ce3a81271b8b257f3f84d4585d017c7b1e3d2ac8534cd3218a4d40aa745f1ff5e2ddf84df9d53b664a174b32989498057086fa446b62e36fbc55d678b688616852da523f8e89d90fc0d9dbfc2331951563a97addc474775416ad1ea8422fae688a5d4eab8314d8566697e47935ab9add726d5e432b6a214b44734c695e2b83e09ef70d633de4a8393f6fded0f715b29972f4d38c1a92a443b60fee5de90e2587d644e46b2d7798ce714b1b5bbc84d2ac00cf3a59cc07c1a9986f3f59cf7602a69c999f65fa2fd1eba3c19e21cfa555b3115097e8de1ac6a6b055dd172707788b750223a4f96a20886a05b20657b140b6668e9c77f3940c7ac99aa1433a2868c5d90270be97286fb849340c42a0760cef1aafa50bbd3bf63042226e1e8b36aef2fd6b721ff45dc3d493aafb9d01e5e7a3103a07cf98b5fa345e9cde22afe0cc37f75f25acde6215d312e693c6d724711212d70385ac2dda7deb90291681b86664947816ca78c8953b938bda108dd35a037295a42b60e28c8cb1a232d53b2844b7df2f6e2bd9c0deb06d97855787fe5e624aa5f96ab7d0112d8c1f2ed6d3eb771c7411745b6a3a7daa3f8316d0e7eb18881dfdac531ab708c958e0e835c01c88169ffd930d4eec73974ea24339f0a3f59d72f1db89d96ff8b11ff83d00141bd5bf1be66b770764bb2ca047dc58744e45fa7234beb916da2127a189e1ad0bb4290de76d4fca43f256d085f0fa4f356e649d473ed4ad61133771474c1a4cb65e5bd61c78cfb774b895997fed41c49ed1f813727839c3df5b85b885fa74b07bc49b75b0fd084b902dbcb3ef6e71a8065d57ed720f01a9b76ed18075df0226d0f021e3224f2582b032c573817e8bdcb64212c6720c3254a444b0b37bedc7ea0fc23f9aee8e728517203e4c34302e0236342b3e51047e2fe81ea797d3112f9aff57648ef148a5cb2968ca18b6120b156751bc70726e6f6abd0bedb3436b14863ba4a54418dc6ae27625ef53177eec647ee1d8fa72f4e8dc703ca598733a35381cd09e183c90c4295c37fa9af331a8fd466cdc5572f84e175b0de2787075e22458e8cb8d8af804c79e30064809282a94b9b8440a30576d9172f6734b29c69207c9afe124d75a28f5b6e235d1ccb36c553867cba40be3691cf5616c24e80258c2923354d4c620959fbc5c51442e2369e4e298d6d77276531500a0c3fe9095c0f792b57307345494b36232c7e2a65d857b9ef5d0cd72bbdd9a48df3b35c6f2986c56aad7b22e683c0b140bdb9b9b16c888960be2dc72714857ece5fa5cc32ca326031ee99e82bf04185319c639c6f485aebc8eec222e2be178ef41ed1d3a6ce38466d4bb8dde7cf137d95e1168fe0a178b48d4a27472da8dd6536fd82c17584200aa2191c9606a49fa8890ef28352e449c385879b372dd89b03e4e8ac9e9342c330631151a76f54bdc5b9d6932093fb0106f4439956511f3dbc04d428bb25fffda3174c424fac55c5c470947be15399c80eb2b8b573c760a1d99340073017c3e8944029b9a74dfaf8953dd720f84e52a2d9cdb8ef572e819071449567cf2c00349abb91fd7b50e01f78e82ad6a0265ab1ea78b5f8b723db545bb6a81c035f9c39ea514b9ad202402e3158d0a9482b9d71cdb9fedc8720285deb94de77351f4dcec4f19cf534b8ad9546005494a7ebf52ff3607da0c7226c9f54d67aa52631e51fdcae017d4ede19929ed6ba38635c876c31a4c9516724e613af080508f02c49d36397f64f8072b0f0a1edbfa78ebf303f88e2b1dc57242bdca65f18d54197eb080aa7526773f36b848dcdaa004d8ac3e91d23c02db72b9b5bc20b9a86a646083c2bcc606cc15fbffddfe9acaeae1657bab6b488fd672daa4ddc3ee3f39d964f44b666b5dcf7a707dab63e6ece4e6680bba502da1db14b10569eabc9293504d9ece9aca1721890ddf2649c3ade5f71fd14bb63cbe1872925c3b0667c010e8a3e624dd959b78655a53804c361c44dcc206166a5057c50fa328afebd9017ae0468c51e7ab89a786a49de65e0037051133f992dd5b19ad079f47f5fb80b5a2025477583d97d0a88c5024b5f19b298c73103ffd8a44359b722bec5923a73942559f10649cda5282e7f8aa980ae6cad79fc8f02a22dade8e7209ad2f07cd0967c5ea94680631c19c15b5c3faefd549e94348da60906c85f7720be0abd7bbeae25dc2dca4aebc640c7f9a86fa5448a0c2053fce1b34842e7c728eb8a0b369d2038587b093d9669386cf69a9e06bd78b2e722bc94c9e0e180e723d5dc500a85ef098788b24bd06a3a0111c981db7bf81242b40100f5d2c0b9a721809b41bcfa3c67f9a5cc6f842a07adbde9a3f37c3e365d3a3ede84cb7e856729cedc60dfbd967d4e243ea90921f1dd76bb4cbb54a5056b170e4179147511472e703a52ed96134f2de802c6d2e452c801e41b0be652e179e9f991a3238c2de72022b8b5b48e615f2b29e91fb3c55f90f55f81be24cecef14116c743c36bd781856370c6786dc04ae0e48f24c0ed2f0f51221da9c1056e6aa8580de42fec236670e996261164b784ddee02b97671743f849c8434b24298d50969c741414827c091eb1b478d59e14235077f04dd05304a958e1866ea9884bc979b15ab479b4b472c1ee13003f3d45db2e6742274b7fc9076fa02e64bb91dd0ce4c85a18a6db0072097c7f6f706b9f76c818211ee43fe4908db66345d9059d168bd3a71098a1a24733fa713393b9ffbb39d833bfbfeeec372476d287ec7e7f8f16bcc0c2b10b3172d0c1207d4c420f1bb851f3af6825682352344f9588f65c167d9d105607da8c72152b291e8e8d783060b414b43c5746879ba708e8d98a90b355b12f6e32b37300f9955e19258d5ea1cae05d24f6b019062f067a2482e598e7494d08381a23ed726d70bf4fbbc85e3ea56e909b5181a57705fb6fb98c3b956672e146889fff90190197363808878bb3fe16839c6bf7d9388a9590ae6a575dece6d84cba13677d727431fb70eb3c22e44be6b9648d9d3ff8c24a9aafff304ec016efcc46f124a07218c2a42a28ffe2525e41423de8e93d52ed0cf13f6aa1c4383658153ed070157258c3ac89ce01f9e7ca487c8d0bb633aac9e91bde6abf05a678ece89d41823f7229f573951b037d762cd6a34c5e47f87649a3fed670e88a076bb888735468fa7243fb994e17800e978627f141f36bc1519608c15babf422d158a77efbd54af430e67cb5b36a47d096d1af7add8cf711bcdf001904250f4047441220a0bbb6e37298998f1aa71deb166a7924081dc78bd1cf6312ba176d58f00634c8d9f09d83721ac5406d2273e38bd382ad29a53c5b1aaf8c7323d1771d8d98adc0b34663be72e622df3fab7ab7a9156bf6c77ee5e0993f4b777ca19ebafb247ea8b6ea7cfb72e481b2bccf8c522916b9aae7c9cc60f57a8e84689647bf7362d792bebaa89072708b84cb34ab8fb93128d943ef11a05e2daa6e8eacbbc14515e04baa87b5cf5496afa9b4b664bfbd56d3e080743cfa393eedddc0e7711bb15ebb0e9adb8d157296beb6c993b3bd11a5c157372de09d4c9acedd49d24f6a6015c4f0d808d7ea7207e51ed73f681ca2c15a6dce8458bb620b98afc7629fa2153477a819ca3cf9240dd2b5021f8c8e2b80e3564521cb7ded300b30dfee032758888f7e5e623a0b7270f8fc5d736f6bc996559e892dbb261223f87fad18550cf896e417f70302e87259cfc4d6a3b18f421986eeab5badf4fa9fb35477ea3d5f1e58d43d2f9b84c47246c9fdbda29590edaa55ef3077b4053184a262b43633aab3f053b67bdb88b8720af06cef4ad7ff1cc4650c55d735ebdbf1d73e7ca06c16fc39488ead574140725f0676eff98d6eb23d9dec598ab8ab0c2784b398e7f5afad50f85a4e407e8b72861c41d97009785f609b869ce342245dabc9314a99dfc3d64fcae4b17e8f7c4c1a429d18b715fd3a54cc960a2c83a0040ffbae9f90d0283790d6986d4c725b72587880776339948eefed4a3702c04cde1735d465331061f93747cefaf633410a7c42ac450da89dc10191fd55b6388123b705302ba7b558cd9e7abbb44bbc61424c37bd93708ead7b9a7fb73c0d552f2e1ce0ee43cf6fc5580e69f3b22f5df5729807eee17736264f94d91692448b65f2ca0ac8e1b76077550b46bda245e11e5c087203351caed6a4858316241f21294bb4e3815e9cf8e61e73ed2f703c2844392a5bea91eea5a50b7b68901aad3a67e813f28e13dfa34d1a3b19ebf009688b7264295aa43e30ed1894baade055edc49a346a1932ddf95ff9a324b4a2658b2372a8bb951b1469151e34b45143a9bb35e4e7ed87b2f73045ab91f77a2bb3ba0372df303b44fad6aa33d32471e4df3fbfe0c71020ee4c22cf786c9a107a6f2728216173ed4d77a1c00a7a46c8f138a31bdedd3785165b37288aada7d68bc7282d3a279c6f7037097dd1ef4959a54300a828fde0d743234d4de5a072e6ed5695b0726080eca1a96efc19e8fb014924267b9f79f446125f2c5c317ab1916dc874944f5b0597fd1534bb9d1d891eb7ef817bd5f600501cdb89fe93439662246633613e57807c4addb04404b6b1f3bc70c003c6ec4bfc0d147dd5482791bf98b0eae0721749bd50bdc51434dc8ab61f52301a08d3bfe2198260a130a97110408edcf01975b1c9f5f77a26617791e3f4748154df8e496613ac131d40871bd792f4489b28d403950d8d09ae3da144628a868a3e46fee76c07186f1bb8b3eb73e63f9b192b8e59d112a7efcf70f3dffb0e704d4448db69b632681026492355521441b9037225cfaa4a72c0f695cfec127a29ee70439b080bc41e186eab4b3cdacc0003d5055dcdf5c437bdc8dc05655e669d2e8b1ac5a68a88c2d8f7260a793d0de4c8167273261ed12484c60b58d085cbcdc6ae69e48fc21ada41f8bd4367140bf7430f29c2cc3d6ecc105b6418ff199ee275ba9deb1522ff60c7f6214b92383d3983a8729f80f81c7e73f33c215528a139529a5165cf2c5a810204d108b837519121347254c9f06b2d57892cf55cf4360cce3379643c69924046e67150c3ae52522f0e7210a4de8772955a2ab662daf757522be228d3485285fa1c117e53daccf7129521301df18283c51f9eb71236eadc644a4332cc1a1658ef70b33ef450d2d26e4b72c5eba4b078122dd98d29f7a79bc4657ccba7ab7446524f8987a4c4be4f22081030f2254edc64c0da6d8eb2c6a46f11696b58e67f459ac783f34f8e2ed9d60800000e59884838311140cd5d87345f7e2888963100a6a8062dbd905bc20425bd729879fd1b478fb5078c09436fb58f2352394763a0c8c491f72e13d439986a1b721ce8d1137c9f2a9244868648ed4320ed6dffd87f192bc0f44f6939b87d4411723e8d7bba03291f574ed47952459b46645ba79f91b36879c48387bdfc4a757f727158e611f81955d3d5bfc606fd0c73dd3b3d14afe2e7b5376587f7c9dca0d4726116c333d74fed07891a4a8be732fae890e321fb3d5b8feb003f01c1af95c85004c46b428e75a4d70edef27009b2114c8c8a4e5bc76814e11f6a7c361df7cf72ae501878ea911bb49211e21edb2eca756e4e3c3490ca9dc5e061068f3c77d7244d002d1c0b641db9bd776bdef0ae8b3e6216c233f1bc73eb1368d57b542ead1289aed033477ed32b5ec7c49b8024b401e088d938da4793cff45640d755652747848583276179c65ce5c8e4a7f3ad33d59195923cc551c3e259a62e0fe5985872e9193113e0af4e40b1749f2d2463a1a1be45b9d2ef6584f15a65a04055016a72347e17c9b143a479ab3a24c8cb1cf8d18827868647d2edd56dd818b279db6372546a28a297ee785bc9166753a2ed49273967c311082c9bf3ed5c822db05a3a72c6d5f88076e3e4b18d994b892a503369448a41578a03beecdf9418b65b31ab727cd0eca7d0f4d7482772f7deda12e4faf1fea704b377e4563d08594936fd90717f899cddc58a711eb8d32d6c48c65370ff5ff9f197b71bce2aa14de3077b63729e5794af85b035587c06bfcb30162a29a2c223a3af5afc642a47688592e1e172802f10fdcdb88cdf3467b8c22ec0fb31b055d8b2e032e84b5c43d38f297724034dbe4ada4169a4a3d0999af190abe59074107387cab9e78edcd6b49c46bb1a7219a00c7e69358a10c8dbd1d072fe660ca9aa746f9c641265a7283a71b39f8512430a10bbffd69ef59669c1ad59b77926e44814179472ab45c243d4f1193a2c727a70e4e812aea8827b5d27c900792cf105ebb37daded67d6552941d2854d022dd132e18c2230d5c8975b54a9bf41dd80fe3d53e263376fb9d8e1fb6d7b8f0a4e93555fe1dceb7c488321784d81360021db699a2d52abe32bdc1bdde62e1c7c72ddef9ba10a8fbe8a53c79051d5857ce6ce5d17d8d8a667dd8db90fe79df10b7204cf94c3c979f7532e4b855c9bc871582409471e4f9ff2d478fa9dc81248942a144b5ca82e7b8920be3a4fbf827bc71c72791d6364d2ad348716d7a932847a4cc00a46c787fc2100eefe7fb356bec6192bf48f233615588f4ba87a14c5e6f972d89bd0660976c9e12751fef52f957e0be4acd30a2c69d023209a8c339046296c37e2b5ac61cd45509bf58f28842e04c7fab403eff825df9253efbf043abe5b13e406f29aa9c051ed7f555fa0fd5ce0fabe5b5b67501fd681ec127366794afe424114fd8394b97e8a8a2af2232412ebbc4ba33d6775268164ba2fff35d420847233bddea7f771f4ded168432db5b4c2a39142afe296e908e19f436b66a7e99947e3d1409c0420b27894de8605afe7e03e8d3e30fadcbb09755777c617c323ed727784185344bb0f5169e9e2cb756c5ed28d8fdd1024595609a9422f26cb29cd72bc5e2f3f9d6ce0223ff197c3921e08bcf2855d8041d0a8bb92a77ced4812dd3af2d055aa59b6a10095c582f54f4d1c9da4eb58c0b55766244318bf6008229b164060c7647ea033255c14a21b88d0f85ef971d4c9bdcc01dca111887431e27d728c01af17792cacddad60390eb8500e151c83b443e333e1d0025139ada979784ac7ffc875bc9db826d48c30ad59c8adaa42ebeb2ed09a7393937e23503e5aaf72584ba204d4a8ceda62b550dece91f31097e345f19ce2fe7ddc5902cfbe718b151df49a8422d001f0044fd60fbd6babd656dec62c0ef9f0c1656b4426fa1c1b7228c1ac1b28d7b8da361db759c2fc6dad27f6f7c52f7c48083624efec8b915044d77330f0c744fcb24159674b9bb1bd13d43b3e1fbd28076a9f15e0598d9127723d60dc6d14b0ff3765e07493d70e4905a03b42ce391a18f79f4a0ddbaabc753e58c82e6e723ac3ac5727f0fc66a911a577b496ae06aebac0e6f3f907f8fb56109c1600b3671dad1e90fe6636e6673a2b25e9bf84f8b0e2d08e02d471fafb07265d3c8a35b6ea634f6ddaf632d68605a110b9af05cd98337bb157275a0fd884721ee03336c982fe5df7466e92a93c52fcd4e4087102190c5ac86770a93c3c9d136b94ee85f9bb11d0543eb3f7e2f2d66748d5245c41ae82a17df743c82bbe8e72e9e46c65d8c5c4493d0e6932f9fbb74401e585e629c8aac38c2ef31f23a1194f38afcbb675b2335556d298ab0c17fe862498e5882343d967f8593f4bb62d1872cf6dc67910677f247d66552bc2cec8c9ce4328ec8273dec3fa24a8a81168bf434b1399d68d96bc953404e6cffb2444a9f5a179a85601604ac9ec6108f2946872f20f4c1a350fa1acd790b3c0c60caf05b3c27cd30b7c27a9bea0012a18fb9b727422e9772fa9afd373e3957b554426658635479c3bea194fb5c2e8790ad7d572f5edca3a34e7f0efa0901c4cbe26c1f1a29b44a22f2068f0b8c54c9396a5fb4230f7e9648421aa922abf8a3949378cf78866dcaddefedafa3aaffbad6c119427d67b3a4afd817f779f168834cd2c9d63ecf0f3dca48ad052035dd8588b277218fba785355ce6eb222eed18e77fb820998e18212b429f23ec37eec71a58e5c34929b4ace6590cc6ed46f6d04099a8131e8fdb32d2f203b26953c0cd69ba39a7729134792d9fa550a98aaa0d6bcf035a860f503c08600accb2fc70d9c75d3d1d2ae24405dddfbc984248292a5c6c49ca2b195c4a485ee0137042bc33a47162dd7257e332bf60f9a20d445213a745bfa9212a79fcb0561414b144ba814320596c568afc3ce4266a1cecf368d383f546dc334b347a70271f44685e79b4616c13b77254887b12ef72cbe02e764398600833043ca7377dfb8f660c088f43794f34633557f0729d5f04645ba7cfa6f4545a0d818054b58256d01bc097d702feeb0f7170ed58cfbae10630565f222812d96559aec015cff882f203074fd0fc4d1683207265801838c797c3b338a68031178c1475b73e11776eece428d1b7591e0b4112216f93275f19e65a90e34e806304bcfb3305cbcab28ff27b1a873c1b652c618c72f994036d01c8c66b367110a1e4f70d2e1ded909f38e20ca982f1687e0ce6a67244d3995a152e694bc5d75017234aff9434cb746a9ee7dac7987d2fa05a802872fd81c7423f266f1a9f6ddde1274222655328d290c5b846a7431e39648a25aa72afe5896844982a152b37bae630f816187b38d4a096957da934a54a504d3784002e5cad54e18b1cf680e392f943c39ef8499ea5832ccc056e07e63707e0366768215c9653f8dd14688938de69b3296bc04bcc7a0071d665b53052b02c3c4eb4729178bf48aff9330ab549d5e529f486e00f1975b966720e7e7b36ab6d96c92b721212932e88e6626a166a668d8372f8a9342c3514478caf8f08b8cff3f2434d72ff2259afef4cb6d5e3474552b421fcd979db6194b4a5668b403fe0de528266699d89ee07fa644912655e9f73ffa1fae735ac05dfb24731aff8ec4245b12167727e9dd4365e0760c272b50e3a0bf4971167979c80290d2fbae1ed2b1c5be250727a464470432606588c098b61debc32228b86836d502fe2ff5f3ca0dc75209e72c995273d4a5fc0d8ec5a712c04fa976b26f99e567e893459cf5e033e5f5b73723d7bfdd20002d666a660c9354a35d6f7a8034853d49f04a83b5b9641a23d53020c9ca4ae8b359cc6e70353e81fb0f0ed4f2837196ac88fc5b51c88e35672457270194e71dcb18369f3d609155b3b84394cc94b1f0efe6b235bc26a97c53556723821baa73f4837457fc431f2f744c115402ea588504a7dffbd8997b911f82a617575795e94d16b7ce0dfb20f4af9ef28e3846cbcc2fd87ecd7b8cab35016b4725c1ebd2e31cf2d0326741c0c1468c1724b19afcd1fdf808cf978e9bf19453672ad802170e373636d5d038c26c5fda628dccb9ef8da6d31c5a69da40d23ae4f2f8e392e50f539639f06a9e92f7e3a60b840b2e347758a769b31b4d7c30d2b415d140952b0d040a63d8c32bb1977f461841508ac9874261c91064f9590050d29053aa58cdfed6d4a69984c94cc4012185b189e3c2ae946adfd17a093b30b402b72462c8453fda2d779418c56ed615b06b503ee2e305cb91929710b8473b5e091721d25820c19375941a4ea92237bb589776951f83a89d946acdff1aed02677fa72f4e4713924015cfd26c8b06fd62f1dc14fed0773c1ccdd51d53c7e662b968b592ab01cf72be04ebc64b2d768e512e1452af41194c0f65e8d0e84f904af6349727c70f4a05d959a985ce8ae836bd5d954ceaa61178df7d3f143233eeefb7fed0c0e3f1f0d3ecc32989bc3428ed78e6506934308b9d3be9610f20f9892704c48722a1fd7e3ed78225b95b6264cf910c1d8e7b3af54444662b42ef1cbe18412df4ddcbc90fd2e1d3663e2666c2f47d558278f6b2bcce0c81947e344ec11460bf1646ff0b83f21415ab2e4eb0b488770f776d13a2baf5916677b8da331d4aeebae72ae456100c8cf476614539c0f71603f294caae691364264e758ca350262bb1e72477e5fb158c62bd3878610656a430afd522693e90926d983d52667aa4b65e872661a9dc2efead0beebd23df040448f8be226f2d87bd2f77bdf854fb1f315f272dc687e7af2290d23be603eeac10d8f6c6d101adbcbd7170d22f0b0d735071c326d4dfaf7fb37327b51abae9fd5c726da493f141055a8ca5f3c4f4642a174665edb48903729e7fab3bd91d65922077289e8fa3a98263e86572edf20ada4997834d67e70cb78f0dc0bf41c350b13b93479b4443cb30d4ace769a95080c57b79a72bc2add9066dc267b02110ec162e3bd6538eb8bf2ea54386e2d0d3f607b9c2f7277c4ac2fdd91ae3951cfe35fea7574661e734b42da61a0d63f40c3f21ca23d529c5de91f41eca3a6ab5eff80530e654efd9c2ecf8d9c01caff58d889c3b24c7233c123c1466834bf2e30b4a46061281537749304c4fcdede0484028ac68520466fdf6cd42061a356bf074bef99ef56a2bc1292ad564bf3fa2a39d96364490972076ba1443bba46c99d3731789fcd9a40451b599f03a421f27c5cf6d38cc9db5b50b603cbcec20d522a43b43e626e5db81766e69798f612db7b06d481b47a45727cd0b57500b6c9ba613db6f08dccf9f367e0cf950f7afce9d18acde3eb69ed72ec158de3d79f5d9543a707dc72a4e1677308151e190f1f7c79eb135b02e9c22e778f69dfdd61c4785624c7d619a2f6012b8effbbfa0e5c7a9da1188fd1c19f23bc47e9448f02e3e081285945833388194eae85d33823e7e9bc5c9bd097f3d9724a68c3b360bc7e1419c507a6ef21b2fc221a1ff58c7b935a0f0d945f713cee722062ea482adb5ec5a58362c0f29b781582e5dc5a4f1ac7a37ea8ef8aff4cad330bd26a3d671e8317c7e983855a751fe770415bf80f842893b2d859e9e885421446702e19904600a1741ee50b99433dd3ed0e022c984736d8ef760c5083c0cd729b536eeb49f3f6cf5521eb7ed0dac97af4a770638c9502aa313a3d229ab79972c59e2c81376736e6fa311c0a62a35fb4f86008dff20bf70bd44fd95480555872aa9181d985e974508aba2118f3485b5557ef6b892b74d9f853630ec1e4db99729ac9a4f6af5118ab17af813bc35b4e9156cbcd69db1612a0ade66b9a419af33452ad8cdeeb324ae658733b4c8e47f3f356f944543e6a0067882223780d663e7216202665a161cdc07b934126b871731621a000e7ff2f203afe51c95878e8223f436624b536d3bafa64bb8a4c9648cf70ecbc0c241861b7a1c7dbc0d65dfa470028550fcf8368af38fd4dc710c19445c28c12b30df1dc43eabfdba09754b4857262ce8926c74ab5257fddc56928ab5bd7ba57d655109d3c2c462e123ea387cd72fe3d121cbb33b96e6279d295d0b01c0105321ac9524932f3cf7ca70d6826d6729571a15489c80ef4f1c13a1023fc306a4672550def25be6126cd3bd70bcc567206c4cca1c4767896ac37d16e16b3c2e80fee7e413389e998ee416fb6df220672d1d077b68d30b2fbdb164f89080da7079a585e603174cf32a31dbeea943bf972aa9e7acb4ef5c5235ab2cce8ad75ece7fb4bdd7c12bc31fd640b350007f78e7244df3041f3b495136d8dc0b61ebb1fb11ab0e1ace92257c32712843112a463727324b8e8b4d0af9e977bf6b2cc940f208967810acfb4c66e4f9dde90d8bc0a72278cdb1462a344a7059066efb347ad72237e594fb61a04984fdd2f5c1a821472e3f51ef1d0fe76801613fe1f32805364d80ae18f942ed2fde20e76a808a0fd616a669bb5eaac434e247ce811c9e65112796fa3763d85aae33fd98087fcf4c972f0dde48648e4ba21fab38995569d2a466372d36e6f8f95aa89a563d98e1b32587e105e22b96a36369185f2fe38cf4ae48879e73a06d34e0f3583166d193df0728829642871f0f1300994113367259020d31f63b83bdc95c69a3fef5011482e3db94b2f43346996b2aca4f05e1f44086582318545e21974a89b39abdb3032141da16b10306e2b7ad509a3841ec42ea92f5e6c66b6bcf6225f0ebd40b99b0ab4724bdb294eeb1fa426a1ca0660385b67633d28542987ba277c24648e21f2e78d68055f203eddcda7eb58f72b5451dc9faa502dfa55547a6c916ce73028214c50728a70bc032d8f47a5114ee5f28c20c326d2833b53244c8a6db728f0251f2eae72d18c037cb22e82becd0b812d45e0777fb71d8ecce0237025776131f12a989552b7a0ead0d1658fbe1da0c731d3d095684ef652aa562ce397d65bcabab8ad2572d3db902708864ee3e2b1247f4da308a08e377a7b9b5b5cc66ef1a7b79783f0728814738219a6be221a6d3c0282336de4ca40338db909ba069831f078cd9a91722230a357ea5426942b0983fea9052db9c980ead770278a995429aa77b251db23f232aded124292b52b90b6e2ebba89ba50325036ef55c6ca09f25d77422c9864047f392b68bf33b04f3131f3414be88ea9ac9049f32cc72f598a2e07297ce20d2c2a37340d38db761cf0222e18500939633871f82f5efd56ab1bd8c2fbac2f728686301f765bff331bf9898d4b10823aa4877bd5a5f248f9a3cb206002c28672839fa7272b2ed26038e250a869de7c94330b7cbe6b76cf03be4c8254c4b9ca72ff7d1fb34475dfe646a095a9ed48a5fbbc6b3e00ff8253d34b903e9804a12a726b71816ee53a545c5b3e3db2c4bd279bf87016709bb7eeab4777f1a586811d723c71800a1aa8cfc84990e6adf3b292019a0f53f32262b5dd4adfbbfc334c602def51ab42d26dafb3bc31358af51e2072363c25cc6d667cc75d509bd93aca992f490715611b9ce34e805eedfd64e1df3b490562e5b6e2519682bed9a1d23da2728a33595660fee44a4e871cc3702202063844b3993faecfe780efee72deec7749a406b995db71f2e6121eb4079ac4bff88b124d3573d7e14caddd831ac62a297289d3315fe9c8b28f01ab5e8bf37b9bece602935776597bfbccc268a0ad9815475a0a034b7197a0e732497bd8eace9704c786c8902f3446ec677d0dc526123063ef8e93df17a5b9a4397a415224116db4606c51ab15b1ccf737744d5f6d9a9c130ae5000bc5b1713f5bf71e2f20ffad7165e95097dce83ba7da6ecd967f79ed729d47a75b61e4a9f2a3a170986aabe8aafe9c3e24bad89412f0892c657f8c5a72c6eb731ecbb83f016a995f49ca3328b5ffda2089789a4db13e1a0ab8bd5f1908ab3c8b2c0b40e6e1a4b6e17c9ea9369696357e210400b88005c837395446311f83ff2db95162c9268881238a0ed2e11ca0aa8e6ca556888f235e08d3743bc3725e0be63c568c9e27d4d56b57c6752b8dea707255a492f50e2ac559a744531e673cce6e959447f447b4446c177d56c073efc3bf5a515c5c4ad5d999c838e60d728394b9f4a90a88854bd8eea02c49e86aad17b32c95311fa04e4bf0546a5b2b721672c71d1c0d44c77199a4c8f6231dcb2425fa7ddb37cc35fe07504487e5a272c1b4188f604c429c85f290ef0f42240096b6a3d3402d5002a1cc13c0f01d47721be6b0b4c6a8037cc6c1111508d5ea9aa2ca5164ca6983878751c97b4b7e9265fa2d823251d2c1deed327137fc7a7abe4b66cfc50936bc1c58f19c46d449d77218cdd9f9ba28f7e6f0a1e4779fee2545278fed14c0a24b471835c0c1e9750f721ac4a5d03563caf5db74f41fafb31e2eb0daa2f2208109155fc1e7d2804d3f36c17e94d7a118dff55ac1dad8d202435e5f1b758b434b117741b3150b768f1e727663113462f3fa44d9a1e7f114ee3cd4a8327d6214095034af35f816849d2d723cd29f851e16f9a7e93ff8731d39a9565d769fb6239c21daf4537c2b59d9a772357b6fede9a41b807e2a385b7416b8ad72c128b91a44f78345e762faeb8def40867de86c3fe17d813748405bdc19ff4cb8d87e9bfee77bad0c8fddad8742975d1d2752cd03e820b12e3655aa65b7b15922e15ac06cfec5febfe856cf6f9bd3669565d224b723cb45124b8d116d602412155cd9b69e4166871fc6b3733a5de6720ebe70f0e4d4f1d0fdb5cd2a70bec346a168bcd25754856c44764066ae552a60eba5a4c99ce6bd746c805656e47fe628f47b68723018d2cf5e6aab56beebc87266ffd1c432396f66d00eeea28447fe0a8fb9bf1d104fe2fabe85e8507e21cc72d454dadbacc8ce189a582b8a6ebb49cc51d9a3f9a7e25251f03dbf46b29f3f5ea5f7cdbd0b34495a763946b849f601b6cd9c6e3caaa6fff0399269388f9765725b916e7bf6ba72946e55a33bf93beb294b489cb76352e3c7fbf55d24f6348a72ccc3d44f662e859de57479b401703ae17ecfb759e99bf303b274f0502a304472e460c661fe307da614bbfd3bf227265992812d31ad6de0e3f5385fc5bbc98b54ffbe87d16d59ad5b01a397c9985e960c50f0662ffd52417270e934a03af68953c1cfb403f68286465b1363e3611a20475d5019f6ca2550c9be900f13b0dd5872f82093a782b6dd1229fcb27712c5f2acab2ab2f028e7cdc88c8854c25899a550632fef4a8ff1693261aa06bb3af9b8ed18742761f80550271eb5f394e5063e72466be377a51052c66066333a24d5353ddebc1b30109b15eb5f7fb05fcb883c7222f7c4794ce8686bcc3021a1062d53bdb90f8791320de7554c601af4671a2972296234c5eecf872e0ec70f236cf1adc3b6c8e8dc5659c0d7e4c5a8cf2ac73e14a29c1fc63512ffe83d59104dea62e2afba6243608ac1683062be76b98f14c3561b39a47ea80528523d556db362c44da3f50e839dcadd2aaedb4484f7f1573c7245a66d174520c278917f84d8eb8835badeb66d83d166854113667c1d7980c16450e724930765c45cec47120e5445d67a2cfb88e69ee51e9d171a708188bc897224bffe5eb1bcc4db737ce42d4cd3c8763efca82314583aefdccca4154e813e72043b652e31703f670b69ea597ddcf7118b62a98e863ebabbd0f7018e8f90477232b74925251da8a9e7f55cd8890f836e0e71b263c4e1defc258141307cb85f628a2b5cdfb512e332222dd8ca9cd54f5b73d7c0e63ea345fcfd5f462078549d72b554d066d56aba4b1b21bae5130e3c6359df483ec94b2757b0b02c8779eed16eb2147c3c264fe63f62da82649b9c703d6598407c1cde5c2b3e3ba54069514f2ca8257f32c0654135b7fc0c515c549036c90dd71f13c97233f4ecd79b6088987200bcd136c3711801d106e7c9ef7710eadd541186d646fed3c21b6952e866e55a400a5b24c160e6a698a266e02209a8c47c1283aaca9a34263d6d8aea1243ee721fcafd5c9ac0e6346d70bfeb0cc361399ec1ee58249f7c5173d9dbbf6ebfdd58ae761025919a9fe5649138dd15f6d21d0f6bddde3a7f00324ed8ee292ec62e72a72819dd3f513f9ea9eba667cdff4671188fd1fdb5dbeeb9b2940766ce440f0e3fbf09091bc806e6cc784976f8ed4907eb42e0ad4ed7028e59815f6a6c2d326d93d070890f6eca3e36dd0f2356460fcf1d08d5e14424d47ab438e23316b82072047fd6544fd030939f8cebced38832d62ee5d12ad4335f6a7620ee835d79751578319065317e8d8e524a1fc6fa5e7beba31d4ee0f9cd1b057f2055b55801f628f417bb4e30e2baf3f1e71388f1a9a429169a41cf2b12bf5692057851f1a1297299b6655f15eebded10a03f25e3b2a1557823a858f2e6068306ca1ba692497904162c535ca4a0247c0f5a88438a7eba17d63206a5c0756043cf112b660064e772dea9ca5495eb6d2b7fd85a7ef28a5e6e64220d147b390944693316e004176c69d4531e2fe71e242eafb769440026c8fe17d98fb3a60c06a5c2b4a09999140972b3760ef073ff07034f9d02ade1e719e012fb8c3e6ec4bd3287f81d05f0368472e5293ee0e9be96540d5a28dfac3e545f8f431dd8f814d08382922cff62f0cf402bde3b60e96c23a4dcc1c50e120c8372f6118c6e2edbb6c1b5af1d2a4ee4fe6931d1ec29ee8875bc4efaf52c689a1968f9097d4084905c2d027139c33c8add725d98f1bf129d4aecc669a2abf9981eb44b65f4ba6ca60413892533b147ac7972f40dbd8d771b528a8b2d437b21247005667c45452a6e2981251e524dfd8e1c72d9aa4f7c3478bd3c0f1c09e9845fb3ff194b8daf7e2bd8bae2e97d7f851589725f17b584246997f348ddce9a0d507c8cf1bcae81bd932a1c52bab47b2ff501723de028b2f18a308a1b2f07e6c93bde2d96aa99ad2910fb42ca9e3198ede35a36e42554bc84ac6ba02fb18f9506d85f2569e266fb6b5d560cd4c68e289c53400ce9c1db2ec57fc69acec01d6a3a87037dba48a76c86b4035e87fdb32e43045658d99a7199e4f6e55fba34c98a75064fc37170453a346562b0c73fbf50c8cbae724a869a1bb55efbce9dcead4e7960dcd3ac6be918e9366083379278020f98e7688743c75c81e23ed8a3f5f60cd0d49321ca41d036333db7f2652f2a536ebec770eff25c52843694e8f8f736eeec5b9026c3ba9efc945942ebedd2e9a85c1b5e1c53b27b3c7ef188fa223421389253881bbcc1cca14ead33fa54a3467382cbbe1aba95c4dd2a760a042a6edfb4b5558f062c5b1f778349b512b93038eb8c5fe8727059e6697745ca328d146b03e597ee8fb71118943672fd7f1fc3df171c06b24fc06dc4599d0612360ebd65e8a07b941fffad59f240e320d43cebbf0da855f15ce22aee34e68bc0878587007492b6cea5cdbbe2c39ff60307d2005390217042040648d3f82a81d2bbf4a5fa15d950ddd6a770b3eea533ed44c2c4915ee7658b72d4e92d2c69aeec64ef84297d31e545934794e6081ecd3d339f256b0d7383713fbf59a5cef303d15782cbf10fc8f81b681b1bbedee77e94df19bf25596125e972a2a5308382cc7039c8c596ebdb71d06679a8f20f8b19b0f810a4e0dba0c794720b1cd581f5020535290607c26e51eec3a312045db42b20db91e6e604152c6925a97518556a93046693ce4e8500dd05936b7355d1942c0cdada2bab063b268b72dd55d7109f9a823caeb74acccb2190f5a58f0598de9aa1fc82db0119d3383f7231a426376a01de061272c250841a09f2e273b48dfeb848a1ad24590306ce9c37ee2cbc669b535b4d1229f9a26ef7932851a959203226987efc69cd45d1358d72fc805fbb33ace9abff3480b180691eddc9bd42e2ceefd83888a50497ed1c0b729f1e454f4c6fb272fae8b36b232a9a4d2cb7397a46319ea63e6c5870dc75b42a165c7b264051582d8e80a12368f305eddc2a8994748323ed58838658a5634172ae74f4465e8bc4d9faecd0ed51ef3d606a100615dde190c42105df8b16273615226af37cd3cab361c2b5affedff5604ee8708e7a4e861ed2f2d8029b061e1428ead8b631983042238d16d7e9e96234b9b27afb9699719bf8d7af8c0154a81544b5e2218f8dc2f5db1cdf5064edb4110dfd93de006fd1cc5a9c747fd7c7ead94b80628499c1329885e1d4ce44fe080913f1c6c6cea71ee711e634dc268e056172fc29ab1ea5eacd2a7b302ecb593cfb549dafe7aa35d87120d6bf8adf45fd5b72b1969ae0c65951258fee5c18899008c2182080232b31619e4d5e0af6e64be87273c4fbaf4518f02f9a2ad1793f208b3144fd29a365a9e70d0db689329f52507231ddde803a19fa4ad973fa70e3d4749896079bebe1b1d47f3f1cd3e7273c203b06b9c383a22073b46e8150a17b66be8e26f8a89ec574459efe74b19fba2bf7729f19621eb8914dd9c5556a8f00e9f72db9d7df7d97f4e45018ede1c06f7c6268f7bba6428ea87a33d2d6eedfebe4bb2caedb4a1cb8f9dda196168b34906e5269ef5f320f40bf4f5816f3724e1305a6e11f699cabeeb361e1e6eb87c4d00a8a605642ef6122067acde69d671cc11e37e66e666c103ffb5158c8cfab86941a17729842b622457b5989519be127fff0357088b1012ee88d7b492bf1af09f0ec127283867cd4b8d38a14fabcfaba7099db15ea8303f27972fdd13380588fc7e3f53ee5f69edecf98504e27ebb1d60f629bc576340544208e4ab2588a2a51c614027225730261b123065af0e6980a6c5907e59403df0cb12b7b0b9eec6b0654687e7286fc32fafa5badac4267e728e404487db6db51e8b88751fb9108bfd96fe72b2371312ccf16a7abe2dd8e2f99d451661818296ab37a7aa848ffb5afcdde497d4557b1cae154e0f307b97b419bbb093d8a0e8ce8654c3cfbae0952ab2924b180721909ded175964e55ec3777ec88c464aabbdd267b655be4882fe566685c78733398c32e3f48c3bdf8956e3447656c971317edc42474a09471ad509f1532a09a4b30a1efa1f1daf64a57393b23c3b7f71f38bfc4f506d90d5a60689208d8b87c6ff653eb5f7c0b51c80f1372a2472f9c6fedbfcb659b37072ec70706f256b10e72b594b33fee75b25e50f3e1390b52923e7b7cd00969482022a2b4c0d30341ca724e06e0a8e5e3f337415520dcca82c3fca0952bca24241a7be718660e9fc4eb31fb2640b27be3178627db43407ade8b1eb07b65ccc196dd8db3e335850467fc72c0d212df3c119f367ab7e92b6b73af3127f6eee97d8e5688fdce51c22c476472cab8e1abc485960bd4621772631f3d98a84cf213bb7d14a72b3efbe99dcede168bcea5cd7dd2616ab4639442b568d982cfe89f2a07b51c35c11784a0aee67c726f7fd5ae52a629a513d1cf05333839ffcac62b49ce1e8765b3b1821f5ba503103317e4ffe45a758b36876dfc7e67b848d4ab9dba67767f9931c562703706c42f8f8c43c13019cba1f5bb19b490044a31227f0e79013ac9ffabdc44fd7a89ee30ff74de6a7a79851aaa36af6a9076b5c02053e1fa74511609129b1e8f4a4b4472a9e3603b142ffe66ec975b00b5c5b8e0b9d3520f3d0787363c01b63dc5136f513fd8216433ed503d67fc9e31ff15b060558a618f06501a73813ddcec6168bc2af5ce8a9e3fb48432816467e0d8cd821e4361542b461977d1944f1c4ab5108672b5513863cd73e5a5905afa7f6f7212626dfa5cf67a52ed8698bc63810a36367273ca35109e7748b59f06ed5a2bd8612cfec93e34a078ec320890f98581c7c472393081f0cafd8ab8ed7ef912a50b355c363fa59b8653d6d172fa17a2e48e45728e6f9c28499af846617c32cab4ba26e4b227a5d58aabe034de3f074130ef5b6656e1925bb79f376fff10594de90b1ac30ba0ea48895eafc6cee08bdc1d8dc072ee48cec6aab27a11bb700d59ba23861f7864cd0ef70b82b74da40e94dfb0a318b42c5fab91782bb8671fca138c0eb5089472023e7721ade4231c73751d7551729361cc702438f8a3a7468ad66e9d1cb2c4ff8f35133f0d0e73245354770d127268c1c923533f13486f6c5eeeca2754a9611386463c115b65d171591e1939b272f000056ca07ac49ff82516a0d2f2bb445d74f5488b8046ec556d8fe83f420800f96008dd41b55ed892c6e261e06edad17e11829a2e84c32047bb15dc317291722996e7e64589ad9d94b41d76024707bbc00afd44c6a51148ec980fa77d18b872f3ae6dec6cb5940c57570fb512c618710879bebd77c9a8caaf1c8e6002a69b725a71c92cd25354fb5c4d07ff9eec870da2f03192546912767682d47983b32231698094ca0bb84c13ed432816d70fc00269708df602aa795b76a1e79f69982d72588b8dfb2d929a75d5a4c3ffad527eb858f150746f47375617f1ea2e0d1c462c8e9ceea185cb138b399c893b0ed965b097a26a92b4978d1898a039e8fe079c723fd32f2968ab15a58c556e5bd86f90e344512c296075f336bd7509fd1566e472579a421987e208f832aa7ddb2202d72a01cb41452739525d5b951d96e9dfc5722a99b5f550d913f19bb04f9929508ebdbfae165bac9fa4de47470d5ff491e672a225ff25c7894cc5e974b27fd5262a497ca47d1a67e76d5c5b3f9ccca866a372a86113625b4bb53f9492bf0e2e917d70a0e8f4c08897e94e773c05a8e1b512364ebe4e1cee8c8cb4507eb990200576be2572e372fcb935d0f0327efba76612728e8f890634b0657154d6d9c4a221a0dea64f3a3537cdace785db1835e410a5723bc1b784ab4f3f2184a908ea3757ccbaac191c4914b607d2a6be4842446dde06ca397bf74106849b8de7bed14f8c045085db51f093064a3cb0105fdc3bff32729611620e42ced03de666970b6674c0cfed0b15044d6e824347bb3fe4df031072f7d69fb9f953cd8594180b811ee9c9918ea9f966f602fd10ae3cd15ccf70a272eec7b006b17b7e516898b40be27fc6e25c29f891d66925e9c0e0eef76913b207ab6da4762bdca34f8123ecdc05d6379d7774da73b53712cbea188cbc28ff7b4854a63e21281b4343bb81855c56ce42e208a77da4e7f7fd9b1df730e001b427726d21afc9c556a6999cb15a481b056c6d9a5deb200624e82cb210a6fa1acddd7210a5df024e84e51f118e1fc60a160c3cb723dfa09dc6f3690855ee5f42e1e5054ef6d9c04cfafd2ca142ae1de55ea80a288d198a7de59d50c68dc728ed159872796948de5d35295f615ebbc2ba5cde4a74e4f00f0148f26bbba84057a9a18c72a26560977eca8b35028285ad123ccc3dfc3181f985c7ddded0355a093e00017221bb1a703985c9ef94ef4dcce7644d4eef94f0641617470f428ee1f3c8fc9c52206c59ba06b6c6cfc40256621d16a29fd62ff848a7de6eaecacc1939a899921919831bd0745528dec7b2845734c594490e76227ad789af95795e96bb84dad472606bbd50ae12179fd561f5e7488cb82419d0529887ce06aa8fa48e3221047f72cb3ab0c3db2413925344efd56e4ee57d2b0f3ef65a0b72d9298d4ad8f48395729ca41380b89d159787d28051b20425632a278866f3e70b8f04b0c24d7da24f310083d67759fe7978e92fca706d57d62a8e0820ecc6461e972005770ac2e30c36ac87471b168b0e962b9b3df0890494533361d1ccc55b25afb224c8208cfbbb72be6c0c0e9a5c89bcbcdb4e2dea3ae3ea2531ed19b8a40a8352be749c0074fa48551dfe52c041d4bb14e019c15027471e60d88b1e7eb69e3c2fb231f7f4a02d72a9cfde2fb463178b88c84510f458087d53ad193fc63191a9f7940b7754b0082d7bb14fdb2b83dd64e8821d320bc2aabd93ad0733a4a9fb1c30d563825834270595459870d820c88089e55e3e0b8c8a43e39c9f7309f2765903c50e9aed11510e4b324dea1d27b60fc86385afa5b57e469ece2e36ea8aab0e6bd861f297d0dc62884bff0b7b6ac211f0c806b8a7a5d3dc43afe918799fda8e57f6367bbfee165d82a36ec1e21ab313bfb8166b85c4734244f07bde3fc79f5bb085a7232c0ac2723390a41058e50b0f89aab4fdd68f771a925e42ba2c1b03621c8b075bb4d9ef72d95f840fc7015fff0ec78939a08daf33e7f7d12c09d9731e5123919b6f4ebe408a3eca36a17d067c5d172507d08f0cdaa33e54b05db42c06a873179f4834be726ca75c310d129df4ecea23fa8b74648360f0e4a82397141ad48e1f550024c87233cadb406b5ed43cd1fe1e457b5d423f4b5806d0daa9232f5826161387e104726812d84eabe64be491278db03530c9e882b15e3272dfb7e2fe5f158ca238bf7234d4b131d1b5388835eca05312f2e64595fd55a28c0892a319a3b6ed96055f41fb68168f0df554374d82a35b6db4aed6302dee9f3ac2dbc04f2d9739f7834f72468a032f2716b8d5d2c2bfd8bc9a1ff23da0c1ee0c07b69a0c5222371e622d723140f678ad566554ee8291777501ad97208a0440ae73f8f94a82f087a92be27271fba680ce46d2e4e6f06448cbb8aa87994e1e3dfdb5fa68af5eefef3d4aa54c764d476f3a38fb0b8aeae1b1afb713072a7c9b1ad8b0ff8cb9a1ca459e77ba722efc868b8c54b8eedbb2082137b5c131966a9afeebf37abde97e109ce2bf8972457d946131591fe352eae87a952671d8efd8f52869a4e59b0cd049071cc0b072621977ae656c5fd310c36f1624be775f2e3ad9afc0fbd215bbd3f8d7308b280762ab63ab5e7cc7271d6a34a1b37101c9cfbb650ed30e33d0bb14b11387b9387258c28f9b1e9c148b1ecb17b4a81b758cf227fbca8b0088af1e8385b94c603b7235661116defbd2d0689d61a23fe980ec53b9fa3779e316885edab61da3c29572a4302d2f1ba7d72538ba5291ba9c69bc1ecceb6a51d8a86f3275c05bb9df815546e71cf75da219daa39a76605c44d6d536a8041c8bc43488ba79576c63f3fe482017fa6a8613e6c4205f4f756ef1a3e4fc45cc0d4d7e7d024f463f959c258d1cb13f6aa3a23ad8430cc8fa94c130a64db17e2a657c711e7af99855c40892b072dbe8a50e81197e3dd566ea36fa9ea5e0644bd64633bdd7687dcea85410eec25272e00cf1a1ef1893e918830e5fc97b8f331fbd3eacb3a505c2a17d4a50571c725ae998ea498d6316e77cf317a876b81010de4616046d8d43dcbcee95088f861cb620dca50b8d26c7138c1114c4680937402c06dfa8e6479f63fe2623fb9cb65022ca818a00c5a62c1915752674721256f310257df634dcb8a30a94caad5eb060a6b7f578d1d4f14e0c718392bc90b0cf80ad176eb69a4fe8ea5c873a1436d6632f2fbbf0fa4a8b8c1470b6b20571f85eb1dd98d8f3cc4f97e8d05fef3f4197726ddd1dd5471e2f7a5c0e601d6f59555326f635634fe84938daa5b58011dc5d1e6ab5b32ef5d652e6458e0048c15e2eb0b95edcdbd9ae51d021df7d897565a85ac99e04fb06cbb3ac8b858e0909fc1f5cd33af601788ac475e59daf7e89d884648714060456e0eb4d5bb83da8350e0321d51c40f34129b9535f87bb02493c98721fecf88c5448fcfd6f7b4c2b80d4b8badb804dcafa37fba0cbe6c4d2ec119063dabaca96ea0301d8b71983e1bfe66894147671ed9ecceec9bd2a585cad0b1772a836410f7fa197e076f30f6f65a876ae7734abf100c0ef75d89111bd4f60437287ff75e1e1c6946a2ecfd1a044f05e7acb9bd35bf488a50fb6eb2d5a7eb4917295a5c606873838e5555283479d9eef62a2dfdc510b6aa29e24e0515795ba187266de92d50e6ae8e70472117f5e6891ea6aaf9e7721947c93d51e6b5aca7a7872ce27ed00b5676fdae841334f2d5e37cb07a4e8ddef39597cd6f7ba5d92d86172d0911042c50b6e3970f295495b6c764014afb9bf37004dbf4fe4c732edb59338a5952ac3626fd686441d4f9143214da9ddb73133b7d7bea2299a2c144753f15e19ad092b44934d96ac68b67e9e5aa1ed8a69569ec6b970722d506ba827e0487253cc709d03ae30e577ed620261c2091ad09fe945b7f40e16389a146a0866f67218a29df6edd19fa1deb11465ac41a91757869abf01ad15a2f2ac65793dcba07291645acbcf82d713e84f59d4390d9d03c0d304e2b6cc61465de7b64e67405372e70d931b1998284b8db1d1652e8d0037a15f60d73a53663785f90b77c66ec87230d7c4a98bed1773884387c524c522839afbe5779f82fd6c326cd538cd3ec5722262a12fddbaa153475115ad40ab64d4d08b02610c28ad8718565936ae8bb0727378312e023922dff75fe28029da3210e826b93e32ccd47ecd432030b20bf063b21e918c6bf64c3665f2d4a3658cd04f84d07f3408445c5eefc9e6fa76dc1a438c8145a7c2ba364baeb753eb725027c37600a672495139f4c4b47f959f3e0317a6c89fce29ba6ad073934fa2499f27d62fb1713254e4d24123149e16c283ee6e7b01a9b00821d98a2fdc64aeaa90facd55de177fe137ed48f6ac33ddeee4bf697687816e31f00b42eb4677d03f4a146c2096b250868ca6f408541f868dc22f72e706dfa5d0cb37f4d53ed88cc340201248613665bcc4b56f76ec9b078076725ae42fa9da490e6fab3d82487873c33c37ba7ac20ec01b8674c61d90fbc9c56472d40a82805235af499a1f9c2b1f3bb891e1a73d47dfb28a9e5f062caf64a5a372fa93b45e67e1a32b1a5a99e6026201be6dfa440673c7243e90f871aca9dfe83c143e6eb3ad0b367c94297aace419f9600b3506e45c7d43b2aafc609f69e9104c9b2434a48c6eb35aebee05013e7c415c72cb6fc77f0f11f39d49b012c488c472701e2619dc002d31c3bdf93086b8f27d595615ce015bc471f920a1640dafd12c253214789cdbc1cf5b2f135743584dfcb602c04ec2119b4cc1d657e5a0215572a7eeba869c4cbc6a635f1456eda34cabcebef0749a13c0eb9c2a1065f59de172937502d8f29743b4c10b84f4560b6c99fcfdb8cabe5b445c2734579f8d348c72e16d856e99181b15abfa44d99012014f8f433c0e587725ae7edd88dfaf7de82f2447430aa21652b8481a25d02bd5ce244123eb9f775407ce34e0d065e5cd7d7239ba885e73fc4daf0a2d3a9cdefad0c633d8f6d88d3ec509aad24ba2a3349a5ed2ff079c113ba8ad7fa7810eafec395b6edb314206bfb2243ec5b104a255c15cf7899e66412e462a1a3da3f21630bb329f2c39c726679c72186520f376852364680b8ffef421021d9670963cd8087753f45d6e957747315e874c4fc75f9456725e24c53a5d1a299287615e684b152037a6223c56be30a40471a8d142d1c7dc0526e9bd4d64b3ab653d6585ef33dde1fc886e6ef5f5f66b5f572c177665cad872d3b89bdbaa881296124fbe5e0b171ab954cea169bcf78c433a12d03531fc1f2021b7fbb13ea9f377b212fb5d264987452af891719c42bd6494db872cd93e87723603bd433940f0b2e5f77f1570024424962949d967a7804b367a2fb7b7ee39727fba21c740de08247c3e743c52e18e265ceaa5a62451b60e77c29a8958e9ba6354416f0223f98e0b5b8ecb83e31b7a8a56b703f2dbded105e67cadf021d15a5fca24982d7f2c64188140891adf47ff875c33a06231e3bec4050fac92c3459a55d41b8677a44dda172bd63d8119c4155eae35a732244c1e22d784654ea2f644526c0e49ba3730f572837d78e59568e9917b3add618985b6718607c3c7f51876094899921ed577e7f0ca09c020274e73dbbe6fa6af0aaabafb7ccd7b494a49bf72694473ddc04ac6aeeef9db2ef453773ab7b8886361825eaaefe344b488233d724b7aca023a65fafe9bccbfa231df7c256dffae78c292cd7055baa17382125e3327b30122adb79fcb5ae0115ff2affa0f224eb70d39502cd3a4e08bfe970561728c90adcbc9e5c60f562e32f2b70b68c8e41e0f78377757f37b00b9980faff2726f78451b050ee162000320c817e41058ae8f006265b6d1602904b0420d02230d515efd0ebf7cfc3c9d9c658d7a0ed51921f71286fadd16b5562444c270941b72535c665d58292d3ef26b861ef96abaff6199bcc6d6aff6dfacbe25a608f154722f873e5917c31091a707c79736c300e2c4e9bcb83b4c7c37903694761897d33c322fdf7a5fcef250819f335ee5f1cf092de579820864e99709d6b3370b1ca840edff4aaa338880d7698b65e86d4d6fcaf74d9152aed4b244783acd678f2d2072f007507ec1272706e39b1725e09e7964e059989e0f4dceaafbe03af00b8e12608cbd0064209189ef85ea02f4baf347ec99f05805895c5fa39599e4b454fccd1e1f4a77a006be0a846fbde670f1c7e81dda869dfde2c377851bc73b5bb58031722b16144f7d6ad2ceeca1298e76058a1126d37e4aa028da672524c9801d6cc436854132ca696ec581ef96eec34e8f597b791ae7a4e8c9e69f5d3c90e04cb60272547c1dfd5fb3d99f1da04d596e40e9453d6162d3ff2fd91215e8aafcf79d21720fa015eca24ee44b21622749af3858d5dd303c1ec5e94908c27e486328fc074445a660f87dbad04ef94ba185254c8bc3bdf8e5d346aef18a447c4df9eec3a672347b5a81f7674ca8658cee9479a921b9a55fcc94d8770837458f4c5d41cc6772a73028dcf0511c2e4efbfbc0747997c86b726827924fb1ef0679e768af5b4472b89e0fd52da7c4453d35cec71b275455fecea042720db3ea20b15a8d176ccc72a7329d5c152ed7cf28d08adfda5970b2fccdacdac95d51d49b01d9d3a4147d72145e9b9eaca13fa931c0ece268fb8aa709a2e9c79ad8c253c41f7077dd373372f860826f5a1fa40c0b37ce6e04aa87fc7580d30e8f2ddfa9994a7f043ef75f72cd0a7761d851f430d894e63ab18c13985388e865c60abeff19cd572ec99dd9293ee892791bb6e286da930e68d4d7edc67bee9864adffdc80ca703502747f31628854eda853ea9227db85c471275051c5ce681a655f46ba4b324b418ca0451472db323dcfd9fcaa3cb95ce5d0642f13ea60045116275b99c080a0685c9ff31b72410c2f7d3d9dbc34b8ca4dd6e8289f065bf1a73fbea59c5939127a671625967203197c04d8c4be33041bcbce73f17b4cb2a7538b85c21091579aafd0b2f67b334d58df77ad2801746707f04922000f66bd05fd0f03e7623d1fa60ba97377ea26a526c7a0e7c8deb3f327619c9c0022b9ec81df6475753ab549256eb7aae7653f88cafa0763d4b55d81d30bd8cc33837919ada886b2f835835cf3a05a12f74072553cb6996b4da1fa219e58800a8de40cb5d43eb49d8c0619ad782cc36cdf5e3a3adcfe8bb930dcc1cdb05fcfc59eb586ffab49bcfc87e9869e5124fc00073d633ada60134058fe0098a06b17b69645858e7bc586c01a509a5a4c2c9f37ce56325dd78fe91e0d3d2d841cb4cd86186a54cf9ed0abb40cb257757297534f018d677d8b0c50b8e43bac9d519f380a056ba67828d141347d8ad6d08bd6f1fc71df4f31f8c7ae40c74f4b4e1afb0c0acec5c51be5bed6a2d01829517a7419a90afe7204cca6e5af1736f1e0c7c5fa11a0c5d04e3704b45b0bb088060b4e01d345ad7263fc2e3c8d0ee64ae5b9b15bc47c97b9a1ad1b31fd5f154104b6d11423b01d72e639ef6c81fa87a896744bd2587c5bd14f9694f41e043b64c849e8aee2560672943c3ac22e345f64d9bc65e6c800a98d5f022f897308440a59ef4c30b825ca72ebfca802269caa448f38845b917b182b219b5c21917aabb337be15a552171f72fb0f48446c8922c98aecbe3199c131c1f1c920e29322560978e02a3102e724726b20d6c374c34fb088afd30a272da04148b159b810deef1d6878bb2636809072470276da116e71cfc9e5ee3ac27e80324a1aa124e6a4c06baea00594ed2a4330c2767482411dbf0c7d6d8e1e30ceb69c52dab4c372c17a041f3c100a4fe3db66b821f7b6789fa40f1bfb62d3ffb1f1bf4ac91edad66a31f441d5ad1a8318b93209015e1502574620536aa1d030902949a5d8735e673c34fab44d5e18dcb33b50516a2bf69208747b94b701bd569f23c9050e9d92ca7f5b5b55bfa621e06c7347f981453bea2a5005e836161ac886c5693d4320d813cf9b4340e2df13874b4d073d7cba9b75031d07cb0b4e038be15ccfd5f44bca754fd68e49c9026156d7f80c149d3b0b7f346f33e045b8e92122d0a29ccc96ab9dca24184bc36bcf7e2b7772cb02c77fa95d06dbb1640427712463d64f2870fed5eba4baa756cb9b19a8c93f3f88a4dc06ca4041c7b93c8fc652c35d4aa2521c730c14c1a56a5825a928ae7296633f3018c95163eeb9809ce8d2b58d9038c4f948001f4ad288e615e479e05ef588f2170bc2a7d4a492025588820e6199bdaa7b3f6a8fb9493f9511e9f59a7250cd9f0c77c926f0bfea7fc6a46188a8011e5f7e9ef9d36e33f9c6a5d14ac359365b448a66e08d84328732fb0761d8695b6af2dfe36f1d3212fe70d74f2c7e06d6aa6c00343438cc3e3c4de0a0c1b045c8852443b69447c5939716e3965db50b257fc829018367760cc240ab721ce6bc3b205bb673576790d38d46f037cd176da37c4e27ff9565657c2632bdbf3e1badc6c33181874beec64e3d7177193a5772ca9d49a09e97ccea2fc608ce59cc2e46b197b07aae7bd8ab0e5cdc513a29670960f199b084294dcbcf485f49462b2c14222ead7ea4f5152be3c7cd2a8d1ce572291c1a48c4cb7597b10fc535c8dd2025a7054b756f74ee83e06847cb2a4aef581f41cc70b04f01b94f710f204be86725475187f703f27958d628cb44a30fa3435636430abf038c05e31d03a679b23dc3e80d336498ed31d099086e0da8afe9724cc9147eb18f8c0e2955755027f7a1aaa56c7f72f4f2166a40f7bad01f54d32573b598bbea5d1c87cb5c40c4fcd234272e973c9ef6647bd540e2254fe13a6972cdd863f22a9c6235ed4a210f6119157d72e8aef3a3f9d5c2c7f19cf65470c272aec664cfc88715bf5aa65ad57c6f4f229fd8d73b1a16eb888f67756dab1d8b29e5a30a3aeef832e1800e7095f1896b82975d23b05b6fc519371446b23bb18f72dff56f1a8ce4640d268b1570e42cc01b3fdaedf09ff1c91595a33744ff886c2452f3ce4253f341fb6e32987ec134b5e93c3774091a5970431df2cbbffb59f3722195999b2dc201edeca0981dc19491c09c0892c0123bae2246baf0bb85b12772bb1279a7489982f0939bd30728f03887a4730d0e24082a388ece064de34001720aee700e7b3f993af5c7c7195c5762a5292a59cb7ab5984550f480bef002ee7252dba3386f83cde1c403e3db715b8fe54ff84bd5c5f9ba3046061786c6955a72fb330cbc2c6b7dedf8f19beb7e6c0cab3978440754449925627ca1ddde5c4b723bf770e711b93edc10d5b783bbb826a4dcdc5ccdd8d61d6ca3c8115d0639c172817646a45868a102daec7e46c3cf3d6245f9db29a3c0bb81bafae7e2f54eba624a32083c4b2be60bd5fc526f68aefb469b678f0365475953164be1d27885fc09283e6e20d135d69fc95939351308f2ab4e486275ec2c612e4452200d29e03252e8e17d6c740bd80512245743d7fd8b68ff82f7b356e94015e2a5c6735b39e34643dc5f27764d3fe37b02d2ed8d3faadd546d726f54507bd75f7b2a9d9622640e1ce3b02476573729e1acaaa53d9ea9699bb19b3d051fa798f88710c2e66d6032ddcb029f1b3ffae18fe3de3cf1c5c896359fa70768aa0b11a9d587b421dc627288950c44bb704331c6dc41a3e7ae53a4ed94f211c7195b53c6b23841bd34337264962137880def55273bbdf43d7b82ef152067a1585160039f4a6df25dc4675208a145da573612143fca1036e2949ddee58717cb751464798ed01e9438afcf725bdc170ebb9d0c89e9add4224f50e1b948d2ad502b7fee212b0a14eac3545722e435107158dbb0367964c952fc83e5844317e0c27234af735f39ec85190e0272849bc28b2fd2c2d3cd10a55332989ed1a135811acad3bfdd90c373da5e4d60725be984ba42c14856020ead8c8e55ab2f414b18c66066c86f7429f9bb8e856f48bb7e1aebc27a3639425ccb883d727c3fba2a4671f036c0de7055611f6df5c6724cd8bbcaa718aaff170f5b642601880eedf4b8e43441248a55508e5503cf3c21cea37dbca2620a2386d7a7bf8393a91f6d10f95a354c9476b3ecd248fe85bb24b76bbc787b45cc52958d33c4c6f477184d413fce3d15bdfb330905f402f24572b9f62ad70572a3c013d73326c9b4ad1e76a361844fb43021ef374451fdf97229ab63a1cb78891866a762eaf1fef022d812acf5f4b5794f9f390d2458c35df34601a367f601d576ffc9c2bb38e36961770aca9a5da145395c400c360f7a679b723a79e1ffe02b97e9d3206ab24e07ba7aed5c427798620b4176cd624a1784150b32066e34f62c34e626e6027f10c6443fab470b1450984911090c6bd4d7c64b724aa870d9367abf6c9d14e5c57f1dbea5358d9bcacb9a482c9e03b3b023b01372d2a5576d091d8909aba52aa1e7def340a7bb869294b5631234b84c8698125a229d3c63d6ab695c943c933d4f58c68e26838c009ce97e42aff9aa95a514f8c1724feb570c7b4b093af1a1dc6c7e68445fa334d85d048edc22e0803534d221c94fbc3e96bd543d1e2eaf6f16709b501e85e9433f8156d3b02a483cd166bd501947bf20d9d640e07a466781552501e333ae2d22f843980963494e5944e448f1647233b873f6d03ea516aff029a5faf2ef2ded82d4c9eda7aad53807c541bf496c588d02681b26cc020707c51aecd7b28b57449d1710128e17756c467e27b101ce724b2120626c12680fe0bc23575df80900c4686490c9d1aa6686f391bfa1c42e08f1c3581c855ac503471618bf91ffa39cd317be64b49422c0658075e14984cd725d4a688fd745fcfd2534b960864c73901065b503fc221957d6a09bfbc8b2cd72ec5dad58648b5eec23b15348d814316e03f97a0c36df73c5b474cd31c42154722db30a3925a5570553ac0c2fb28ac296e2c9491b3874c73f39524077c734850affe00da5480fab81585cabdd9d38bcbb965aa3df98e8c9b94fd36c6ca75eae72a1d755fac7d3cdacae472fc581447c41eeaf247f74562a6eb20b4b282267402716d54dccd76596c103676102b90bf5aa852cef75aba95378d2bc526c793e6772a9706381020fa11111e5e44c0eaf2c552351f375f15229d3b5ca67237e05d472a30e5b43722cc75b0147569c08aaef63d3604b3751da9666427c83bf94ae61721c413be9273f00b53b4f3ae3044afa465a1dc9bd755e40616e78a40ca74e423a0279dc0c456b38e1c9675d489dba6c6bd232c360864e022c78e9a4799aced6727a4a3d21dcde63c79fcab153d8f05f834968d75166cb2fbb74422d44a7b0d9725ce58d5d6efe236c0ac468a0ed802b70542d1e666ab6b42d8f89d43b38c1b24351546916fe8bd2cf832f4c4bb473e9920ac39e62c4244135530f021f5ce67b33f5f9e0272a9a2173e3218b00e1ab23fdcb50c9496be6a1d8420ae852bdb2ba7234fd539a04d1f2626761e9e77e40fae20d6eaca2377c2d56953335c6b0089172c9bc4998fc0efbb00c4b6716292558e69098a32cbfd808d07d5844fc0253bd72786ac036947d7d6789a0755ad5f664cdb9cc257010869fe427960e34f86d01455791e351f5aa0eca21a740c1196960070b6eecf1a6b42ee211248f16236b2b4a7250cd4e50e52d0a7344e30597c8dd3a5b115bee1c6a07b37321cc9566133772e7e550632f2bb4a1b7dce6367312053d96d82d00e97a87ec8ff5a312df844c72922144d2b8bb0434c2fd75e75ec62be14a8a8136388a345670f5f3d554289c72fd3c90fac095806631dd05cf390f6a5346796888a8586f54be7bfbe16b05e972643d865fd78d37f14338d205d3115982393af7d341439960629e71f72190796d6c1bb47f3312c22d90692b43b67ceddeedb7287f9be800a0f2d7553439687f24a45729f9865f37475f65b0f5277537a94b1845a3b8718e4f4c043d33b0f59b4f174551ea5637c87075932a67c03ecf6b2123eb507e9305c0b6970f2d37cbf172981095d89298c44d024202dff612d68cf20738d2d4248b23195b3f8823dfd672e68c470761c72b96230b7ad8132e2c23acbafc2893c5eeeffc10b8eeb160db729be81e90d64cb9610699b90eedc09f4709c34349ad1eee52edad50a4aeb9725ce1ed7c39ed71b8df5abba626da22dc0fe569a0cbcdab0ec4552b7955de37d936fd4eadc61b70f430d7bbde9cf6d227b0d902d5c5d5d9fba9e889907b8e646272d1b8f5508f48d543323aa5b09db25dffa2d58b2a44dfdfaefc1862ffe7ca8e722d174e82401adda656ac5e47aafb56f52e7f6213a2edc35d122b2841268c187260674d594590b5425e393fcdb24384cafad9074e6ff2d115b93b527b90aaad729cdee2d0a7323d23c7f674eabcba538ef50bf760b700ade2abbc37b71475227277cb6f1f47d56028128e62d51e73ead43d44fa6752f030188a3ccd6cba24e3532e915dfcdceb196f88326f4e94f9d44ca2a68a558dbdacca22afcc5737d5006e7cd10a15787c438344f94cd9dfe1d494322efb0b48346de3bd844696f7eb1b729317529c971e7481336ca4f914040f4283da1e66ccea3b8b3fc40ac13f2be6671eb76c90b46ae35b09f78644dde1fb0c2b04a4e41f0004adef8b0d62f258b433b8187f00648875fcd81575aeb89c604ed1903a8e2f8983ee0293fce2b47eeb435f27f55a6e7b448786f27b52db9856c46181725e9846756f5db03798c2d9fe16546b7972fb4b1544b37d07766ed01cea36fb1e33d841b3226f43a2f066d3fe7295277d190365f6d5b38555ce895738f41af7710dedb4e76c95777138f917ca03a21b7c28a7f72dcb37191ccd2a81bce427d09e0f138c3c7be873886e4bba817116070dd4b9f6537669035a63c0e805fe78a1ed73afaadc2210be85b418b16353d3d865cfe41ff1e8ed5cc3b6faf2a03c163bfa48068831d1e297c17cb5d8714a0807ef1abfa6a26e33cf35274f3f922cb4af69b73179f2d5943d5b584d7a6454e593f63f2e8e3774cf2447f228e4ad0ac84c5f2082df941ebd43fc7e837204105e4eed57ede64ded45729b3f100aa543b7cbb0c40f8bd08e8e5eaf9878dc4c668896500e644a938d6466bfa8f4a849c9d182495764295f473e461977c8d8b0723b0df6ba5fc8ae15ebccb71a8fe05dca3f4f4b127d5c3693b0dc56847b1bfb72b09fb018408dc6d9a33623d7d7b3d6659c7ad4d804883a4644f8ecde2a1bcc25eac9b0c02806122546652865146c60be943e2203e99093a4883535b4f40d1e7259337fe0131f20fbf627dab9ab3847cd5e2f956031dadc0a3563b3477199ac062e754e307d2cad3354cb4efbd4d8cc0c91cb56fc6174b8a9dc87c100247d1771b54750bd5bfb58b3f0d19ca02c914bd8a7b253b35ec9c93b726d131baf5a94729b31518ab57ec4b3fc7032edeffdf2b0b10421afc1d5e7083dee557075c2a52528643ea1ee521fd1325e1aba256a60bedec176aea1ad7cdbcc2843faec66b772213e140a8f07cfd33960e96453090253627f591b2fe7a2c970cfa6d72475ed5e45d262bdc8e02ffa255a047072245cd780c6e977dc552f518fff2a75e596a7664ff9e620fa508ce1d76ea0d0811cee6e4b33c8538951fd5920cb66f8e5db3b725818ac3f106c3bd8ea01bee1fecdb805b7ce0f62d84bcb313e4c53f94852dc72db22dc6d7d64d318fe56bfdceb23b0225a7892ddf6f87cc8a8ac3e5452c6bb511f9fc44e74f57476d95459f95d2943bff1f69f338c7d377eb5446bc7ee0945727e16e34a8a5bd77a607d51ff455c24e8d715efe4b0f5539960b99d0b95ba3b727864e484c29bf0ea82e8665f60a44cdd784e8886adea942f473d59074615d072bc38828de5c6d05b52a59beda25634b8f62f332af409b62016d2949dd9692a31c8084b5bae20bb81c19359b47eac9583d20947d335340c9c0a62f0a32af06f724af0a94bc9bb25c5039587f44e3652fb675a194de63b24b5092da9dc2f9bf6726cf05ec1be23ca5efd81d182d601782c93c7855d36a4977c70864d60e582257298c20f11ec55fad14821628aa0f303d1ffe347ae8b295303fe3af08a0a4d847217ff845b8cd87690d8bd807a28733435498aac4713d1210cd57ae0b403b79f725233257c2f3046f1776fd3d70339c50e80a3cf1e5a434bd6a6717506cb133d72f47e4f2c4f0c1b95aa0b55d1b4e8f0758d713e5fe7985364391bdfedbf664b72063721331f9763aab5f1865953541f69f9bbc1dea829b7d9a56da0f0f4c0440fc1d217775b0317b37358079d6994190fb973bcf61b2c7bc4d927e76727d2316438d0340fb15bbe4d5bf1b11644e453f61e98e45215bac479ac0738a88308ac3aaa5c8f3888fe88ba84661fd8dcbba495480f60820e11f9bbc30d061f92892463f96778c716c9ce3491cafc5bdfadfc254e5d58dd5051c70dbbb47d2f9b6d5b65bb6ef209c04574c0dc3d5457f7eb27dc6fe118461d9cd6865b6de98861161572e89ab03db4e53cad32b0b2f93e60645d7958871ab6ddb1ba1a4429b24b2c7b726c935b438cad35f906eed67a662e3c1190fd6099a46d0423ba710dfead42c2156033d8864ba22bcfed78f0a533530be8c54bbc9006dca003804c78ae3d97847223f32dbc47c0bf789ab08f63f8fa4d5f34059af4b9aaf0ca509623eef3064072971a242465a2e79456b7e61dd11469218fc6f722fd15102b88f9759f3f163d7273310e846fd6e6ae193490ec8da9b01664f741579b0fe19397576999a7877017415babe91d967e6c73c1463dca7582fe8aa1e19f5e0e3ade0dd8f9046cf4cf4eb827d6f03be693c5160b0c100fa5d8431519b7cc31012793578295a0126ef972f1dd3fcf1c10d7197f4408dfde21d0f8ea5b9b13c8aedb991b1bc05cd1d7636686b22dbd91b54a70eb781d51c51b247f9ef2bfb251ddbe2015246c976abc8172fc6c8cfe28fc1539ae9f523cb467c9a61935038c16ba5f79e8bfe640e2fa1e6a94022b1b2e7a0c761b240e4563fbd9c947868f8fd4548480c127335e6888e272b4abfcb338633c1ff9b87cab8e08ceb788c2aa2a4554218be2ed12f108e05372c71be5675ccfeb72adf50ce3666012436da33a7b840b67557b43d802dafa8272dee31e5bb32fa361704385bfe9488d81a98dd6e4263e450ca0f86a81ebd5177262258fb2d68a3cfe292c01207a0cac26e4b1becd57f8ed2df6d797a23b97d5722a5004579c15dc912e49cf1c64f67cef8dd6947827c621770f78fbb8ac247b72d97aa4b34f1bb0755fdfcd684c42699ed59c8072b70058c38066f9f87ad8023c38b9b7c913c871c5cbe74340d45b4fabc04bced1a7a71f890aba472a6b49527220f515bc1063072fb11cce11998f65ea09d24265730a19dec8ec9a574ea19d729677f6d1ce25a3224717095874ff8dbbcdbf69375df62acbc09e190cb61645337956bce6117f8dd69f4f204aaa016d39281fdd2ddcc0ecbcbf5d5bb7a7f735728a72dcebe5edc9465c146892adea3fc0b9f7a74fe531cb22a305f9039f120a19019aec34fa8992f24a1d2d21df6ef14cf72df358bcb7945883edbfd698cde972807f88d0dccd4110c78fe2a51da2d6cc44683d0f9339a21a9b7f7140fa506d718d84d35e971d788c060c09ba1195ee0b03ec5f6b6049b805d04599d5ca1835003d13732d865aaaa2d6362f15c16b11cd357387526a7774aa72b7a456559a2d722616506c1a34b63332056e841966e7e57c00fdcd69ebd54e7ba8025fbcb2da6ff3e094f30a932fb1c37e6e4033e56fd681db14fa26952c2ad4a31eaff1690865e3d93dc09bc79ec44de9f59429c5b49826bfb88bdf3f187719c6621d2c2d2d4f5a64dc48a1284df208b98d4be1e7fbe4776c0f0a0e761fd6b5afc9eb0f42d8720d9ed4e830e267eb62b8923f21ebb599e65bf5ee892ef7927a6f16e9787c6c72f50da718ceb68529c26e83560dc56c5c0b3df62dd66e0164e1570e7a51939a729bc78ebb5fbbad260b856ea03050a5648233d0871a522cbbca87ee4fd2050b450f0b52c0fc6b06baee84f8567655db0aca188d87bc3a8303b13f05065e392d721cd17ec966884ee0da019cd9e5d09bab5c2f7d01c3979cc2b8dcf8340fa78c72ae7f1195836e82560f37885d3c3d8e0e8b2afee47a80eaaa7126efecced1af57879ba553b4dc5b89e2c2f6b9ded2b2ba0e31dd0b31425b97b128e5fc11d2bc310bbce48071823329afa470b6a74298a50d7a1f03c8ac1621bdb0d5afdacbc4460b31579b3478666eaabc86503fbd7ba802879e3a530f91eb6687a195ec143c2279a0d40e4dc0701e07be75463a9b19a09dc50bc910c047adac133a5dcb8d3772a79f1f42ad8119ab28d5527c0f24e6f9589b57071a3578f52d042a40206a58720e412c10094214d9fafeaf6be6bea868141a008875b4b113d415282e15b54572cb4ee611289eae12482052f925f8cfa8f8890356eb99b644f9fb9ba55a255a724d3413a1ee06f63791275d408ecd67f7d8194dc815d72fed858cf43c88c308729ae4c3b1f949b9dab8849492fbbfc642e45601e872843af7356a6225a44b6e72a9fd2c7ab7b0b0fec058260e3e265007276c53baea045e0f009429408b4ee672d96ef8a244d96ca21af9c702a875174a49c39b147b1e9e7b8afe2fb4f4167c728513bbbe13609a61fe996ccccbf04363b2af406a513aadad61f576631b0f7b0acf1a0f2c21e6660a7b54e86aa1bf3f53305188da28970bd6ab01a9e805ad8823b7fb479a3af167f6d6323b2d415c1f10fec0e0504673b25994e60bb79e54d272b3342578f76c70a6770d34c50ec344e8afa22672f5a5542707c427c98816ae72a1584ca8aa80d80ac4c9343a52414e18a0d0572d70607871ca1e72cb516f753e5e3e76809d24d155ef68d837967e6b80a72e3b13848329155f7db1057db66a729b6459e25dfc8e70776cc43005a67f00af8d9319c6b02c165b75b144c62f571ee7afa97235847a0f2796e1e1b3bd9ba6c9a28744cba833e695761cef9b14191b0aa9c1e47ce065bea5ee9ba17ccd5accb3d3764063d4f3d5b4f79e71e3bbbb335833598cc745f4b5fb911dfb5cc6b390d46547656faae417f015d17c67b1524feb559e4fffe658d836fb3a73b2213b01c4c61cf6c1f6ccd851b9eac4bee8b14a9cd283a47f890bc3ab7d10afe2fc9779f9ae044c75542944d88644d1c79935614743f9a7837e89270f05439d102c13adc239d3baea12d99b8943c2c83417ff6a9c684fcd5550b736a67b1bdac381d6f0114270029282915d8448eea48de4137204d245e8a9fffeb9efc8404262601cc4e4b79dec8b4b658d60f4efaefafc97720b72ea291890227407eb366ff9fffb453282beb1e8118e4bbbf3570c7a6a8237511749b5bcae5a05aa66d967703ee6aa73ee7e3ac5ef82be898c64ea8eaf1d72a7c6112c505394412cfc51bcbf8674986c289d921c55521dea3771c584160e727aca577626de675f7e77bd119a35b08c8c1554f97fb89543b5db607e89a8830500b4a59bce84772dd331ca72008c5f2b379181622952069655b5f4b1d7bbef21c8180352cb933ab0e8bc7eb62b5a87466fd754cac782d806c50d1dcd81f85b72055280115204c641053d41d6120b9121b6a0f6a69e1f3698dd4443b831fd833fa6a4a4133d034cff24f16a60415fbb0da03e9c5b2cd4a45938521baa7ac18c247019effb4a435b92d91c0f03d0ce00608c8ac4c9989705fd084a1922a5ed26523d8a873852c0e8a22a7862921dd854ac79bd505a5e3b919f2904b0cce17a5472f2766ad206e981c54237c1aa298fefc39e0dab9485a003c069776679e419e0725c1c3774ccdc7dd41d21a136004949a4278ce0df9ad8585c21c74ca78810ca720741cd59149abbe8a844d9a8d84d8adf81356506140f54b529e8d7559d11e30ae963cf9519c20e66dfa346fa5a73363bcd99fa321c66609307970e9b4c6d00720959816f665178512dafc58c5b6f5c39382bc83edab5b2a358ba8aefd4243b061592aa68d8fb73a616b8c90538d6f60216dcab6dc8a6da7a3489364884c8cb72692c7926affda7655f79ed918460ec3993cf7358a72a1efa6fdd58643d877f0a6e94d42326dec28684ee8bf15254714133226ec10481a0d8ee0626a870f6842d7cc9fdbebcb93b7d34c4781cb56d87c8ed74cab77e735b2572fa473cdec00572ed94bbce17ed1d6b80e3286e9e214b6fb31083c0b1a16b9a0d6ce4a2e2990f72b44ca70c08cc6d9378bdbce9aceb8cdc0022b2bb771ece3da5ff119d9ef8fe3ecbefd25dddf410bbea8519d78d6c123bda67fdff709ebf08ace273564788fb3add8ffda51bacd51748939d32fc5243c393f1dd5aea34ea0a688d04ce894331721ac280a8b08321ef4b68092173a4a3a02511e96ecbcbcff77aed356f77c35b3de4bbfc82a056f36455d678da500bbabb9234e3dc357308da500352c4da3c8f723a9972696e7ee2c2f7ae13b29b9b3c87244bc3b167955197feae0b6f15332172c72b0dadae86c6b5de5779fd445e2b7b156fac2bd210dfb49d9aa2a094cc9b720cb8be826e080feae40743f9be9bcb725b33e6a07670d5e465197ec6c3aeb77280680f221ce90b1ecaa9549c83e8e54ec35c01febb10f21f188be74343972135b5d3c58e6a94b0acb8cca44899e9718cc860f7aedad6e037ffb55e706079125ba568deb975dda96cef6fc681a3afec16a4d1248e6bc4a518c886cf761b83fd72fa5d7b41151235c68f60cc3b084a3c77f6b7680e04548640b192c647933f2a6f3e5aab67d5cb7377f27921e9cec443ed93f0b44a453029e230883f1516a13c23bf339e1f5f7f34680301f6f835ec89eabe8951e7708af1f9afcc5eb858356c72a5f65db1343968f268b9d07e4d145cdae0c1a85f9cc75e489a1dab37b78954723b890379453cc17104552ef60c59969242c00092e792461ad95ce3aaa1ff4739dd15bef6327b892ed2205da3da150558eb8c7aff910b7fa35d6306a23da62572685fa412847f54a7c63bb35f2482e35261f847623360618c15f89735ed7add722f19c1793c202f92732703c7dd574e02409f6eec353d9f45a1e5b621d42c6b7237e11179b43bfdb00d6ea18980a62121c34c137d6113c444096e09b938236f72e7e035523bc768f29999c4f4409c0e2750e8e842618d73e9905ce8fe20f2052b16cd9be156b3c054e2288a78ac3e896099c536663ff0eceb0e1bfa42239cdf217a344562832237c6fc33f17138071f4f75331aa0116592863fc353e1659c68154f34d31c6a0931532dd4d951e976b67880915c41059eea23dd65f66b6308d472b5e85bba9f37164f32b14230c68c81c57a1a824d6af71e354060abed70f45272756cb0ad33f26867a43738d443da2a9aba11b68528e9b466617e5f9a81130b4d8886d705d072cee0f808058614c05b859105e7dd15cdb7b205140af103d74972ff6a349f2b6e30f1c8cac06924b2d7c8acc97aa480efca1a0d519d8faeb686687868834d40b060bb4c90bf07ce929ca1a9fe1690238f8af5ce8c266405d05c69b63fb4cbf119286c963aaf30126892d9e469b31bb209ed6145eb6024020fa66367f89c1396596e7df71e2f95b5e7d12a1fb62e78171f2fb14ac9646ebadd3c1554ecc052ea45197010f7c49d93c228adeb6738b4ef7146faa88ef0774fc77872a7835b3e6e03f4fd0b12299ac7667f49cc5794bf1b04507fff9602a16994877251a8b373dc0b22c1e040050c8956b665f5091e2f055d2c1cb883f7405a161c53905473d52593a97681bf9bda9a0150d4edf92a85459b8f0ffbcef2e3ebd4657253ba3a6e3505e20e702eb8aefd14263c649e2d54c606c8e036dc2621bb137072495a6f0a7fbc99300fff99ed6acafb17a5832243d7369c47d7a9045bfea0ea4804cfe34976f79c9a7e57378e08b430c9e82d0cd344883708cfa6239590cc5372bba0f2db39cdc02f6e633388045eab2d2243df8646be12b79df88274792b912a0442f99a00af75fc4c07b04b0739bbfaff19c883a06384d8464836334150d521c720e9a386cc7b100be86b93dc157a91270d351a350dcbee56fd78212525f57255fc43118b6deb9e30e1f7044072f957c716b44f7598ef9dd40dd9b06a8b7e7264f849ea107c983b42314ac031c7a5a25d466a5d19571da9c27f9ce71f0e5b72bd0425162e499a770bf209c9ee8e5786ab4e19f7042ef2a0a00f1c4059ac146e860dfeb055d2a3b85197a36097b259185e02e7c565a3a9e553f301a017868d727abcca18b32d90469310efd654db6cf1d8fa114d7734ac9f3a13ce3c0e7bec723ec0849105b30de714013802b50c38390cc23b2959df96e18027fd5fb76a16722d559b13947c72c9692c0474ab3a05ce6e141c2785875892e892bebe6566b9728b054a7f1211198291ce4e3de783b2a166ec59e3938351994497d9798c07284d7f391060b0726ba0f4f3bc4886f74489af7e3e2e6babb7263d65e03c82359949e8decfe33ded713a1e921deb56e860b441b706650972f9b624f3fc0a1c9920721b44e38369993dce2b4c8bcb7b59abe1b4eeeb9d33466774de69f1abec993a516d7ba57632412638ebc79c16dc287bcd53c1941d75934c124e7af124e0381038dc1e643015501dcf6de259e7127adb3e51760502255b6c84aee24bd1b6efac72fcc521fc6ce8a964c6cdc94bb22a665e8ec70e93ceaf851df3fd2989fa0a1a639645d809e4a3a8867e758d71c7436900c6fc95b7eff145011fe0346012e7d672d057a193571743a0d847fccbc1bc80198e82fe77984fb3839fbcac48350bdb72e3583ea7250446e7ea2caf5548d6fd47113642341d7c6fc02301782635bef0255f6dd2489b3635015ec257cd2b685c3e74f6302e49a1bffebb8758a1c7031472b8408603ce9b0f3015484e2083261d1218969cc730afaeb3d8050030b173bb6d9df59965bb405329ece6c5420a5ea95705926d1d1f68b74315739e746f4c7272626bd2046feb7bea1eb199fdc7d7dc9a5c0178ee39523eb0200cf30d0248ca720ee0476e776df6e46ead7988851294001da6466c1d6792d6e27467fe14ad15722a9e124ef5c068082ea0a9f5b466b49ba9b7e1fa48a5c19a465c0f7b54262b7258ca7489c9c8ae6c6fea0f849c5806eff9eecee8991ae73e5e56bc4043541a726032473599b31c08eddc91a0ca57aff91608d373aaa646ccb84a6491bade16255a233b9ff986a5ffb480595d9fa74670f98b613aa370e6fa80bc09c2172bd5338a80a68659cac8bc6779ccdb84dca7f307428e208c577888e47604df036ea272616654221f83e46a6f17922b9eebb45604a234da9c5e0630345240376378b42c43cfd2de5df271a183792cb139ee3937800a9028e43f4edca87f05e223329d6c02fd70152e82ba3bfc399ca6aaf73d617a529a38ade2048ef7a562404c1e3966904d29e99c7164103383f806d4c99098c8baa626379b0021e9a08586d113a86e0cb7d74be7440dcb43e5c39dc7de5aa613c84eabf0303aa9645c4a1397c8a113bcedf43136f40f4243e07db6b8bc54f4f3c0dd896251ae8b3cdd25618c0593723b5d4a286c71c238487057bf881573a3420f0a00fa5f5bd0295f5dab0b55e072de12254ea4157a59f3f10a5792bd3580dbc3bdd4a46d13a8984a8f737903bf37ed0343d8cb2179b221ccc14912f0d3cba1eddb9970b700cbd1100e9c91a24b727ba547d8a48eb9884c453526c4e91263c2b5184f3c16439c0d5c660c054a900c0a445fe89ed0b5215c86ba38fb2149aff33260a1e2059fd99512d1a5e0191b722672c4f3a4b1ba992c5e61bffa5c1ea3eb991789eb0bd3a5c06587d5cb88827287b425981b3db7994cb3e77d1509bfd2439f0126f20421396b1d01fe77095443a6034ed59d72e3120bfb4a50a321b19d2838bd402212323dcb735bed1fe33647169b37c6eea04e56acdc7eb4ba59c4b23a494bd050dc480a189c837cdc360d724091980365a0ff755aca5539e1bbdd1b84048ecbb10cbe3c4f0f1efe59f7d46bd0b680e987ec2ce39a1fcb917f822ec7733fa023c490172c3a213ff44d4d6f39a3d575d40544d292c03a8583eb25c92843d2cc191578a83920c639a567d54e3c1b3d39c5055e3db59d2531d95b8f0e9d076e98852809011f941369264201847274e295b8ddbbe883d70a2ca57e48ebc6762d7c310e80b259b399155fede11572d96eb8028b3ead10177dc507d4aa30efac79348377465cd1c35fce116312af2ba1b4f8cf253dc8c6b7292e26658785339d48906bbd7f2c28e3353a882d152f1bdb923db79993bce891f90faa74c8fd135bc7449b886960d068720975d730412b6dfbf63e544f58c85d01e41c6487bda23a5e6f0145843f297ea061a818bf55729ef3be1a8f383653e5e2835ff787117dc96805c8e46b058a5a24847341611b727b99753865b9cef573a4ebcbbf03218e9948875aa1346261f52b7ce112b8897280e62ea4fc2bd3f93be79b34f13ca109943e3f1ada9ce4beb364542abf98711698045fbd1be9be559fa6396bde2c704ba4e6736569dc89ed3626579fa51c9f724b31f672d36aef974cc37c67c8a50f8b06f923f1478ecb93ff1b66c52a0e644663a1831c0c45b2ed8db81ab5cbebbe6082dbb6538a2309e63805741708b605552fed26d5391be0e4ee3e0ec2e8d8b5eb334df8294b7d0f9e17cfd5e3d536f46745d003d7fa6e2028327efffc2991754ce3c0d49ba586daeedcb108043420cd" + ] + }, + "shouldOverrideBuilder": false + } + } + } + ] + }, + { + "name": "engine_newPayloadV1", + "summary": "Runs execution payload validation", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_newpayloadv1" + }, + "params": [ + { + "name": "Execution payload", + "required": true, + "schema": { + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + } + } + ], + "result": { + "name": "Payload status", + "schema": { + "title": "Payload status object V1", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED", + "INVALID_BLOCK_HASH" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + } + }, + "examples": [ + { + "name": "engine_newPayloadV1 example", + "params": [ + { + "name": "Execution payload", + "value": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } + } + ], + "result": { + "name": "Payload status", + "value": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } + } + }, + { + "name": "engine_newPayloadV1 invalid example", + "params": [ + { + "name": "Execution payload", + "value": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockNumber": "0x1", + "gasLimit": "0x1c9c380", + "gasUsed": "0x0", + "timestamp": "0x5", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [] + } + } + ], + "result": { + "name": "Payload status", + "value": { + "status": "INVALID", + "latestValidHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "validationError": "New payload is invalid" + } + } + } + ] + }, + { + "name": "engine_newPayloadV2", + "summary": "Runs execution payload validation", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_newpayloadv2" + }, + "params": [ + { + "name": "Execution payload", + "required": true, + "schema": { + "oneOf": [ + { + "title": "Execution payload object V1", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + }, + { + "title": "Execution payload object V2", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + } + } + } + ] + } + } + ], + "result": { + "name": "Payload status", + "schema": { + "title": "Payload status object deprecating INVALID_BLOCK_HASH status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + } + }, + "errors": [ + { + "code": -32602, + "message": "Invalid params" + } + ], + "examples": [ + { + "name": "engine_newPayloadV2 example", + "params": [ + { + "name": "Execution payload", + "value": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "blockNumber": "0x112720f", + "gasLimit": "0x1c9c380", + "gasUsed": "0xbad2e8", + "timestamp": "0x64e7785b", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [ + "0x03f88f0780843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a0010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401401a0840650aa8f74d2b07f40067dc33b715078d73422f01da17abdbd11e02bbdfda9a04b2260f6022bf53eadb337b3e59514936f7317d872defb891a708ee279bdca90", + "0x03f88f0701843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001521d528ad0c760354a4f0496776cf14a92fe1fb5d50e959dcea1a489c7c83101a0a86c1fd8c2e74820686937f5c1bfe836e2fb622ac9fcbebdc4ab4357f2dbbc61a05c3b2b44ff8252f78d70aeb33f8ba09beaeadad1b376a57d34fa720bbc4a18ee", + "0x03f88f0702843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001453362c360fdd8832e3539d463e6d64b2ee320ac6a08885df6083644a063e701a037a728aec08aefffa702a2ca620db89caf3e46ab7f25f7646fc951510991badca065d846f046357af39bb739b161233fce73ddfe0bb87f2d28ef60dfe6dbb0128d" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ] + } + } + ], + "result": { + "name": "Payload status", + "value": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } + } + } + ] + }, + { + "name": "engine_newPayloadV3", + "summary": "Runs execution payload validation", + "externalDocs": { + "description": "Method specification", + "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/cancun.md#engine_newpayloadv3" + }, + "params": [ + { + "name": "Execution payload", + "required": true, + "schema": { + "title": "Execution payload object V3", + "type": "object", + "required": [ + "parentHash", + "feeRecipient", + "stateRoot", + "receiptsRoot", + "logsBloom", + "prevRandao", + "blockNumber", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "baseFeePerGas", + "blockHash", + "transactions", + "withdrawals", + "blobGasUsed", + "excessBlobGas" + ], + "properties": { + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "feeRecipient": { + "title": "Recipient of transaction priority fees", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "prevRandao": { + "title": "Previous randao value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "blockHash": { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactions": { + "title": "Transactions", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "title": "Withdrawal object V1", + "type": "object", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "properties": { + "index": { + "title": "Withdrawal index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "Validator index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "Withdrawal address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "Withdrawal amount", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + } + } + } + }, + { + "name": "Expected blob versioned hashes", + "required": true, + "schema": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + }, + { + "name": "Root of the parent beacon block", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "Payload status", + "schema": { + "title": "Payload status object deprecating INVALID_BLOCK_HASH status", + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "title": "Payload validation status", + "type": "string", + "enum": [ + "VALID", + "INVALID", + "SYNCING", + "ACCEPTED" + ] + }, + "latestValidHash": { + "title": "The hash of the most recent valid block", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "validationError": { + "title": "Validation error message", + "type": "string" + } + } + } + }, + "errors": [ + { + "code": -32602, + "message": "Invalid params" + }, + { + "code": -38005, + "message": "Unsupported fork" + } + ], + "examples": [ + { + "name": "engine_newPayloadV3 example", + "params": [ + { + "name": "Execution payload", + "value": { + "parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a", + "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "stateRoot": "0xca3149fa9e37db08d1cd49c9061db1002ef1cd58db2210f2115c8c989b2bdf45", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14", + "blockNumber": "0x112720f", + "gasLimit": "0x1c9c380", + "gasUsed": "0xbad2e8", + "timestamp": "0x64e7785b", + "extraData": "0x", + "baseFeePerGas": "0x7", + "blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "transactions": [ + "0x03f88f0780843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a0010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401401a0840650aa8f74d2b07f40067dc33b715078d73422f01da17abdbd11e02bbdfda9a04b2260f6022bf53eadb337b3e59514936f7317d872defb891a708ee279bdca90", + "0x03f88f0701843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001521d528ad0c760354a4f0496776cf14a92fe1fb5d50e959dcea1a489c7c83101a0a86c1fd8c2e74820686937f5c1bfe836e2fb622ac9fcbebdc4ab4357f2dbbc61a05c3b2b44ff8252f78d70aeb33f8ba09beaeadad1b376a57d34fa720bbc4a18ee", + "0x03f88f0702843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001453362c360fdd8832e3539d463e6d64b2ee320ac6a08885df6083644a063e701a037a728aec08aefffa702a2ca620db89caf3e46ab7f25f7646fc951510991badca065d846f046357af39bb739b161233fce73ddfe0bb87f2d28ef60dfe6dbb0128d" + ], + "withdrawals": [ + { + "index": "0xf0", + "validatorIndex": "0xf0", + "address": "0x00000000000000000000000000000000000010f0", + "amount": "0x1" + }, + { + "index": "0xf1", + "validatorIndex": "0xf1", + "address": "0x00000000000000000000000000000000000010f1", + "amount": "0x1" + } + ], + "blobGasUsed": "0x0", + "excessBlobGas": "0x0" + } + }, + { + "name": "Expected blob versioned hashes", + "value": [ + "0x000657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014" + ] + }, + { + "name": "Root of the parent beacon block", + "value": "0x169630f535b4a41330164c6e5c92b1224c0c407f582d407d0ac3d206cd32fd52" + } + ], + "result": { + "name": "Payload status", + "value": { + "status": "VALID", + "latestValidHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858", + "validationError": null + } + } + } + ] + }, + { + "name": "eth_accounts", + "summary": "Returns a list of addresses owned by client.", + "params": [], + "result": { + "name": "Accounts", + "schema": { + "title": "Accounts", + "type": "array", + "items": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + } + } + }, + { + "name": "eth_blockNumber", + "summary": "Returns the number of most recent block.", + "params": [], + "result": { + "name": "Block number", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_call", + "summary": "Executes a new message call immediately without creating a transaction on the block chain.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "type": "object", + "title": "Transaction object generic to all types", + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "blobs": { + "title": "blobs", + "description": "Raw blob data.", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + } + } + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Return data", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + }, + { + "name": "eth_chainId", + "summary": "Returns the chain ID of the current network.", + "params": [], + "result": { + "name": "Chain ID", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_coinbase", + "summary": "Returns the client coinbase address.", + "params": [], + "result": { + "name": "Coinbase address", + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + } + }, + { + "name": "eth_createAccessList", + "summary": "Generates an access list for a transaction.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "type": "object", + "title": "Transaction object generic to all types", + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "blobs": { + "title": "blobs", + "description": "Raw blob data.", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + } + } + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Gas used", + "schema": { + "title": "Access list result", + "type": "object", + "additionalProperties": false, + "properties": { + "accessList": { + "title": "accessList", + "type": "array", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "error": { + "title": "error", + "type": "string" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + }, + { + "name": "eth_estimateGas", + "summary": "Generates and returns an estimate of how much gas is necessary to allow the transaction to complete.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "type": "object", + "title": "Transaction object generic to all types", + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "blobs": { + "title": "blobs", + "description": "Raw blob data.", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + } + } + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Gas used", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_feeHistory", + "summary": "Transaction fee history", + "description": "Returns transaction base fee per gas and effective priority fee per gas for the requested/supported block range.", + "params": [ + { + "name": "blockCount", + "description": "Requested range of blocks. Clients will return less than the requested range if not all blocks are available.", + "required": true, + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + }, + { + "name": "newestBlock", + "description": "Highest block of the requested range.", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + }, + { + "name": "rewardPercentiles", + "description": "A monotonically increasing list of percentile values. For each block in the requested range, the transactions will be sorted in ascending order by effective tip per gas and the coresponding effective tip for the percentile will be determined, accounting for gas consumed.", + "required": true, + "schema": { + "title": "rewardPercentiles", + "type": "array", + "items": { + "title": "rewardPercentile", + "description": "Floating point value between 0 and 100.", + "type": "number" + } + } + } + ], + "result": { + "name": "feeHistoryResult", + "description": "Fee history for the returned block range. This can be a subsection of the requested range if not all blocks are available.", + "schema": { + "title": "feeHistoryResults", + "description": "Fee history results.", + "type": "object", + "required": [ + "oldestBlock", + "baseFeePerGas", + "gasUsedRatio" + ], + "additionalProperties": false, + "properties": { + "oldestBlock": { + "title": "oldestBlock", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Lowest number block of returned range." + }, + "baseFeePerGas": { + "title": "baseFeePerGasArray", + "description": "An array of block base fees per gas. This includes the next block after the newest of the returned range, because this value can be derived from the newest block. Zeroes are returned for pre-EIP-1559 blocks.", + "type": "array", + "items": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + }, + "gasUsedRatio": { + "title": "gasUsedRatio", + "description": "An array of block gas used ratios. These are calculated as the ratio of gasUsed and gasLimit.", + "type": "array", + "items": { + "title": "normalized ratio", + "type": "number", + "minimum": 0, + "maximum": 1 + } + }, + "reward": { + "title": "rewardArray", + "description": "A two-dimensional array of effective priority fees per gas at the requested block percentiles.", + "type": "array", + "items": { + "title": "rewardPercentile", + "description": "An array of effective priority fee per gas data points from a single block. All zeroes are returned if the block is empty.", + "type": "array", + "items": { + "title": "rewardPercentile", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "A given percentile sample of effective priority fees per gas from a single block in ascending order, weighted by gas used. Zeroes are returned if the block is empty." + } + } + } + } + } + } + }, + { + "name": "eth_gasPrice", + "summary": "Returns the current price per gas in wei.", + "params": [], + "result": { + "name": "Gas price", + "schema": { + "title": "Gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_getBalance", + "summary": "Returns the balance of the account of given address.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Balance", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_getBlockByHash", + "summary": "Returns information about a block by hash.", + "params": [ + { + "name": "Block hash", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "name": "Hydrated transactions", + "required": true, + "schema": { + "title": "hydrated", + "type": "boolean" + } + } + ], + "result": { + "name": "Block information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Block object", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + ] + } + } + }, + { + "name": "eth_getBlockByNumber", + "summary": "Returns information about a block by number.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + }, + { + "name": "Hydrated transactions", + "required": true, + "schema": { + "title": "hydrated", + "type": "boolean" + } + } + ], + "result": { + "name": "Block information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Block object", + "type": "object", + "required": [ + "hash", + "parentHash", + "sha3Uncles", + "miner", + "stateRoot", + "transactionsRoot", + "receiptsRoot", + "logsBloom", + "number", + "gasLimit", + "gasUsed", + "timestamp", + "extraData", + "mixHash", + "nonce", + "size", + "transactions", + "uncles" + ], + "additionalProperties": false, + "properties": { + "hash": { + "title": "Hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "parentHash": { + "title": "Parent block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "sha3Uncles": { + "title": "Ommers hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "miner": { + "title": "Coinbase", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "stateRoot": { + "title": "State root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionsRoot": { + "title": "Transactions root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "receiptsRoot": { + "title": "Receipts root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "logsBloom": { + "title": "Bloom filter", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "difficulty": { + "title": "Difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "number": { + "title": "Number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasLimit": { + "title": "Gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "gasUsed": { + "title": "Gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "timestamp": { + "title": "Timestamp", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "extraData": { + "title": "Extra data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "mixHash": { + "title": "Mix hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "Nonce", + "type": "string", + "pattern": "^0x[0-9a-f]{16}$" + }, + "totalDifficulty": { + "title": "Total difficulty", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "baseFeePerGas": { + "title": "Base fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "withdrawalsRoot": { + "title": "Withdrawals root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blobGasUsed": { + "title": "Blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "excessBlobGas": { + "title": "Excess blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "parentBeaconBlockRoot": { + "title": "Parent Beacon Block Root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "size": { + "title": "Block size", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactions": { + "anyOf": [ + { + "title": "Transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "Full transactions", + "type": "array", + "items": { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + } + ] + }, + "withdrawals": { + "title": "Withdrawals", + "type": "array", + "items": { + "type": "object", + "title": "Validator withdrawal", + "required": [ + "index", + "validatorIndex", + "address", + "amount" + ], + "additionalProperties": false, + "properties": { + "index": { + "title": "index of withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "validatorIndex": { + "title": "index of validator that generated withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "address": { + "title": "recipient address for withdrawal value", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "amount": { + "title": "value contained in withdrawal", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + } + } + }, + "uncles": { + "title": "Uncles", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + ] + } + } + }, + { + "name": "eth_getBlockReceipts", + "summary": "Returns the receipts of a block by number or hash.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Receipts information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Receipts information", + "type": "array", + "items": { + "type": "object", + "title": "Receipt information", + "required": [ + "blockHash", + "blockNumber", + "from", + "cumulativeGasUsed", + "gasUsed", + "logs", + "logsBloom", + "transactionHash", + "transactionIndex", + "effectiveGasPrice" + ], + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "to": { + "title": "to", + "description": "Address of the receiver or null in a contract creation transaction.", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Recipient Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "cumulativeGasUsed": { + "title": "cumulative gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The sum of gas used by this transaction and all preceding transactions in the same block." + }, + "gasUsed": { + "title": "gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of gas used for this specific transaction alone." + }, + "blobGasUsed": { + "title": "blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of blob gas used for this specific transaction. Only specified for blob transactions as defined by EIP-4844." + }, + "contractAddress": { + "title": "contract address", + "description": "The contract address created, if the transaction was a contract creation, otherwise null.", + "oneOf": [ + { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "name": null, + "type": "null" + } + ] + }, + "logs": { + "title": "logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "logsBloom": { + "title": "logs bloom", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "root": { + "title": "state root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$", + "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." + }, + "status": { + "title": "status", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." + }, + "effectiveGasPrice": { + "title": "effective gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." + }, + "blobGasPrice": { + "title": "blob gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account for blob gas. Only specified for blob transactions as defined by EIP-4844." + } + } + } + } + ] + } + } + }, + { + "name": "eth_getBlockTransactionCountByHash", + "summary": "Returns the number of transactions in a block from a block matching the given block hash.", + "params": [ + { + "name": "Block hash", + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "Transaction count", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Transaction count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] + } + } + }, + { + "name": "eth_getBlockTransactionCountByNumber", + "summary": "Returns the number of transactions in a block matching the given block number.", + "params": [ + { + "name": "Block", + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Transaction count", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Transaction count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] + } + } + }, + { + "name": "eth_getCode", + "summary": "Returns code at a given address.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Bytecode", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + }, + { + "name": "eth_getFilterChanges", + "summary": "Polling method for a filter, which returns an array of logs which occurred since last poll.", + "params": [ + { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + ], + "result": { + "name": "Log objects", + "schema": { + "title": "Filter results", + "oneOf": [ + { + "title": "new block hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + } + ] + } + } + }, + { + "name": "eth_getFilterLogs", + "summary": "Returns an array of all logs matching filter with given id.", + "params": [ + { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + ], + "result": { + "name": "Log objects", + "schema": { + "title": "Filter results", + "oneOf": [ + { + "title": "new block hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + } + ] + } + } + }, + { + "name": "eth_getLogs", + "summary": "Returns an array of all logs matching filter with given id.", + "params": [ + { + "name": "Filter", + "schema": { + "title": "filter", + "type": "object", + "additionalProperties": false, + "properties": { + "fromBlock": { + "title": "from block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "toBlock": { + "title": "to block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "Address(es)", + "oneOf": [ + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "title": "Addresses", + "type": "array", + "items": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + } + ] + }, + "topics": { + "title": "Topics", + "type": "array", + "items": { + "title": "Filter Topic List Entry", + "oneOf": [ + { + "title": "Any Topic Match", + "type": "null" + }, + { + "title": "Single Topic Match", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + { + "title": "Multiple Topic Match", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ] + } + } + } + } + } + ], + "result": { + "name": "Log objects", + "schema": { + "title": "Filter results", + "oneOf": [ + { + "title": "new block hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new transaction hashes", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "title": "new logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + } + ] + } + } + }, + { + "name": "eth_getProof", + "summary": "Returns the merkle proof for a given account and optionally some storage keys.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "StorageKeys", + "required": true, + "schema": { + "title": "Storage keys", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + } + } + }, + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Account", + "schema": { + "title": "Account proof", + "type": "object", + "required": [ + "address", + "accountProof", + "balance", + "codeHash", + "nonce", + "storageHash", + "storageProof" + ], + "additionalProperties": false, + "properties": { + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "accountProof": { + "title": "accountProof", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "balance": { + "title": "balance", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "codeHash": { + "title": "codeHash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" + }, + "storageHash": { + "title": "storageHash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "storageProof": { + "title": "Storage proofs", + "type": "array", + "items": { + "title": "Storage proof", + "type": "object", + "required": [ + "key", + "value", + "proof" + ], + "additionalProperties": false, + "properties": { + "key": { + "title": "key", + "type": "string", + "pattern": "^0x[0-9a-f]{0,64}$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + }, + "proof": { + "title": "proof", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + } + } + } + } + } + } + }, + { + "name": "eth_getStorageAt", + "summary": "Returns the value from a storage position at a given address.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "Storage slot", + "required": true, + "schema": { + "title": "hex encoded 256 bit unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Value", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + }, + { + "name": "eth_getTransactionByBlockHashAndIndex", + "summary": "Returns information about a transaction by block hash and transaction index position.", + "params": [ + { + "name": "Block hash", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + { + "name": "Transaction index", + "required": true, + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + ], + "result": { + "name": "Transaction information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] + } + } + }, + { + "name": "eth_getTransactionByBlockNumberAndIndex", + "summary": "Returns information about a transaction by block number and transaction index position.", + "params": [ + { + "name": "Block", + "required": true, + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + }, + { + "name": "Transaction index", + "required": true, + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + ], + "result": { + "name": "Transaction information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] + } + } + }, + { + "name": "eth_getTransactionByHash", + "summary": "Returns the information about a transaction requested by transaction hash.", + "params": [ + { + "name": "Transaction hash", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "Transaction information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Transaction information", + "required": [ + "blockHash", + "blockNumber", + "from", + "hash", + "transactionIndex" + ], + "unevaluatedProperties": false, + "oneOf": [ + { + "title": "Signed 4844 Transaction", + "type": "object", + "required": [ + "accessList", + "blobVersionedHashes", + "chainId", + "gas", + "input", + "maxFeePerBlobGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "to", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 1559 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "maxFeePerGas", + "maxPriorityFeePerGas", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x2$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The effective gas price paid by the sender in wei. For transactions not yet included in a block, this value should be set equal to the max fee per gas. This field is DEPRECATED, please transition to using effectiveGasPrice in the receipt object going forward." + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed 2930 Transaction", + "type": "object", + "required": [ + "accessList", + "chainId", + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "value", + "yParity" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x1$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "yParity": { + "title": "yParity", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "For backwards compatibility, `v` is optionally provided as an alternative to `yParity`. This field is DEPRECATED and all use of it should migrate to `yParity`." + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Signed Legacy Transaction", + "type": "object", + "required": [ + "gas", + "gasPrice", + "input", + "nonce", + "r", + "s", + "type", + "v", + "value" + ], + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x0$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + }, + "v": { + "title": "v", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "r": { + "title": "r", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "s": { + "title": "s", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ], + "properties": { + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "hash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + } + ] + } + } + }, + { + "name": "eth_getTransactionCount", + "summary": "Returns the number of transactions sent from an address.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "Block", + "required": false, + "schema": { + "title": "Block number, tag, or block hash", + "anyOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + }, + { + "title": "Block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + ] + } + } + ], + "result": { + "name": "Transaction count", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_getTransactionReceipt", + "summary": "Returns the receipt of a transaction by transaction hash.", + "params": [ + { + "name": "Transaction hash", + "required": true, + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "Receipt information", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "type": "object", + "title": "Receipt information", + "required": [ + "blockHash", + "blockNumber", + "from", + "cumulativeGasUsed", + "gasUsed", + "logs", + "logsBloom", + "transactionHash", + "transactionIndex", + "effectiveGasPrice" + ], + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "from": { + "title": "from", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "to": { + "title": "to", + "description": "Address of the receiver or null in a contract creation transaction.", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Recipient Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "cumulativeGasUsed": { + "title": "cumulative gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The sum of gas used by this transaction and all preceding transactions in the same block." + }, + "gasUsed": { + "title": "gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of gas used for this specific transaction alone." + }, + "blobGasUsed": { + "title": "blob gas used", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The amount of blob gas used for this specific transaction. Only specified for blob transactions as defined by EIP-4844." + }, + "contractAddress": { + "title": "contract address", + "description": "The contract address created, if the transaction was a contract creation, otherwise null.", + "oneOf": [ + { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "name": null, + "type": "null" + } + ] + }, + "logs": { + "title": "logs", + "type": "array", + "items": { + "title": "log", + "type": "object", + "required": [ + "transactionHash" + ], + "additionalProperties": false, + "properties": { + "removed": { + "title": "removed", + "type": "boolean" + }, + "logIndex": { + "title": "log index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionIndex": { + "title": "transaction index", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "transactionHash": { + "title": "transaction hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockHash": { + "title": "block hash", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + "blockNumber": { + "title": "block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "data": { + "title": "data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "topics": { + "title": "topics", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "logsBloom": { + "title": "logs bloom", + "type": "string", + "pattern": "^0x[0-9a-f]{512}$" + }, + "root": { + "title": "state root", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$", + "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." + }, + "status": { + "title": "status", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." + }, + "effectiveGasPrice": { + "title": "effective gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." + }, + "blobGasPrice": { + "title": "blob gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The actual value per gas deducted from the sender's account for blob gas. Only specified for blob transactions as defined by EIP-4844." + } + } + } + ] + } + } + }, + { + "name": "eth_getUncleCountByBlockHash", + "summary": "Returns the number of uncles in a block from a block matching the given block hash.", + "params": [ + { + "name": "Block hash", + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ], + "result": { + "name": "Uncle count", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Uncle count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] + } + } + }, + { + "name": "eth_getUncleCountByBlockNumber", + "summary": "Returns the number of transactions in a block matching the given block number.", + "params": [ + { + "name": "Block", + "schema": { + "title": "Block number or tag", + "oneOf": [ + { + "title": "Block number", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + { + "title": "Block tag", + "type": "string", + "enum": [ + "earliest", + "finalized", + "safe", + "latest", + "pending" + ], + "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" + } + ] + } + } + ], + "result": { + "name": "Uncle count", + "schema": { + "oneOf": [ + { + "title": "Not Found (null)", + "type": "null" + }, + { + "title": "Uncle count", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + ] + } + } + }, + { + "name": "eth_maxPriorityFeePerGas", + "summary": "Returns the current maxPriorityFeePerGas per gas in wei.", + "params": [], + "result": { + "name": "Max priority fee per gas", + "schema": { + "title": "Max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_newBlockFilter", + "summary": "Creates a filter in the node, to notify when a new block arrives.", + "params": [], + "result": { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_newFilter", + "summary": "Creates a filter object, based on filter options, to notify when the state changes (logs).", + "params": [ + { + "name": "Filter", + "schema": { + "title": "filter", + "type": "object", + "additionalProperties": false, + "properties": { + "fromBlock": { + "title": "from block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "toBlock": { + "title": "to block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "address": { + "title": "Address(es)", + "oneOf": [ + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + { + "title": "Addresses", + "type": "array", + "items": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + } + ] + }, + "topics": { + "title": "Topics", + "type": "array", + "items": { + "title": "Filter Topic List Entry", + "oneOf": [ + { + "title": "Any Topic Match", + "type": "null" + }, + { + "title": "Single Topic Match", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + }, + { + "title": "Multiple Topic Match", + "type": "array", + "items": { + "title": "32 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + ] + } + } + } + } + } + ], + "result": { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_newPendingTransactionFilter", + "summary": "Creates a filter in the node, to notify when new pending transactions arrive.", + "params": [], + "result": { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "name": "eth_sendRawTransaction", + "summary": "Submits a raw transaction. For EIP-4844 transactions, the raw form must be the network form. This means it includes the blobs, KZG commitments, and KZG proofs.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + ], + "result": { + "name": "Transaction hash", + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + }, + { + "name": "eth_sendTransaction", + "summary": "Signs and submits a transaction.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "type": "object", + "title": "Transaction object generic to all types", + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "blobs": { + "title": "blobs", + "description": "Raw blob data.", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + } + } + } + } + ], + "result": { + "name": "Transaction hash", + "schema": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + }, + { + "name": "eth_sign", + "summary": "Returns an EIP-191 signature over the provided data.", + "params": [ + { + "name": "Address", + "required": true, + "schema": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + }, + { + "name": "Message", + "required": true, + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + ], + "result": { + "name": "Signature", + "schema": { + "title": "65 hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]{130}$" + } + } + }, + { + "name": "eth_signTransaction", + "summary": "Returns an RLP encoded transaction signed by the specified account.", + "params": [ + { + "name": "Transaction", + "required": true, + "schema": { + "type": "object", + "title": "Transaction object generic to all types", + "additionalProperties": false, + "properties": { + "type": { + "title": "type", + "type": "string", + "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" + }, + "nonce": { + "title": "nonce", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "to": { + "title": "to address", + "oneOf": [ + { + "title": "Contract Creation (null)", + "type": "null" + }, + { + "title": "Address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + } + ] + }, + "from": { + "title": "from address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "gas": { + "title": "gas limit", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "value": { + "title": "value", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "input": { + "title": "input data", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + }, + "gasPrice": { + "title": "gas price", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The gas price willing to be paid by the sender in wei" + }, + "maxPriorityFeePerGas": { + "title": "max priority fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Maximum fee per gas the sender is willing to pay to miners in wei" + }, + "maxFeePerGas": { + "title": "max fee per gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" + }, + "maxFeePerBlobGas": { + "title": "max fee per blob gas", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "The maximum total fee per gas the sender is willing to pay for blob gas in wei" + }, + "accessList": { + "title": "accessList", + "type": "array", + "description": "EIP-2930 access list", + "items": { + "title": "Access list entry", + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "hex encoded address", + "type": "string", + "pattern": "^0x[0-9,a-f,A-F]{40}$" + }, + "storageKeys": { + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + } + } + } + }, + "blobVersionedHashes": { + "title": "blobVersionedHashes", + "description": "List of versioned blob hashes associated with the transaction's EIP-4844 data blobs.", + "type": "array", + "items": { + "title": "32 byte hex value", + "type": "string", + "pattern": "^0x[0-9a-f]{64}$" + } + }, + "blobs": { + "title": "blobs", + "description": "Raw blob data.", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + }, + "chainId": { + "title": "chainId", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", + "description": "Chain ID that this transaction is valid on." + } + } + } + } + ], + "result": { + "name": "Encoded transaction", + "schema": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } + } + }, + { + "name": "eth_syncing", + "summary": "Returns an object with data about the sync status or false.", + "params": [], + "result": { + "name": "Syncing status", + "schema": { + "title": "Syncing status", + "oneOf": [ + { + "title": "Syncing progress", + "type": "object", + "additionalProperties": false, + "properties": { + "startingBlock": { + "title": "Starting block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "currentBlock": { + "title": "Current block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + }, + "highestBlock": { + "title": "Highest block", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + }, + { + "title": "Not syncing", + "description": "Should always return false if not syncing.", + "type": "boolean" + } + ] + } + } + }, + { + "name": "eth_uninstallFilter", + "summary": "Uninstalls a filter with given id.", + "params": [ + { + "name": "Filter Identifier", + "schema": { + "title": "hex encoded unsigned integer", + "type": "string", + "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" + } + } + ], + "result": { + "name": "Success", + "schema": { + "type": "boolean" + } + } + } + ], + "components": {} +} \ No newline at end of file diff --git a/rpctypes/schemas/rpcschemadebugblock.json b/rpctypes/jsonschemas/rpcschemadebugblock.json similarity index 100% rename from rpctypes/schemas/rpcschemadebugblock.json rename to rpctypes/jsonschemas/rpcschemadebugblock.json diff --git a/rpctypes/schemas/rpcschemadebugtrace.json b/rpctypes/jsonschemas/rpcschemadebugtrace.json similarity index 100% rename from rpctypes/schemas/rpcschemadebugtrace.json rename to rpctypes/jsonschemas/rpcschemadebugtrace.json diff --git a/rpctypes/jsonschemas/rpcschemahexarray.json b/rpctypes/jsonschemas/rpcschemahexarray.json new file mode 100644 index 00000000..6f8ca23f --- /dev/null +++ b/rpctypes/jsonschemas/rpcschemahexarray.json @@ -0,0 +1,9 @@ +{ + "title": "Receipt array", + "type": "array", + "items": { + "title": "hex encoded bytes", + "type": "string", + "pattern": "^0x[0-9a-f]*$" + } +} diff --git a/rpctypes/schemas/rpcschemasigntxresponse.json b/rpctypes/jsonschemas/rpcschemasigntxresponse.json similarity index 100% rename from rpctypes/schemas/rpcschemasigntxresponse.json rename to rpctypes/jsonschemas/rpcschemasigntxresponse.json diff --git a/rpctypes/schemas.go b/rpctypes/schemas.go index 44821279..75d704a9 100644 --- a/rpctypes/schemas.go +++ b/rpctypes/schemas.go @@ -4,44 +4,44 @@ import ( _ "embed" ) -//go:embed schemas/rpcschemaethsyncing.json +//go:embed jsonschemas/eth_syncing.json var RPCSchemaEthSyncing string -//go:embed schemas/rpcschemaethblock.json +//go:embed jsonschemas/eth_getBlockByNumber.json var RPCSchemaEthBlock string -//go:embed schemas/rpcschemaaccountlist.json +//go:embed jsonschemas/eth_accounts.json var RPCSchemaAccountList string -//go:embed schemas/rpcschemasigntxresponse.json +//go:embed jsonschemas/rpcschemasigntxresponse.json var RPCSchemaSignTxResponse string -//go:embed schemas/rpcschemaethtransaction.json +//go:embed jsonschemas/eth_getTransactionByHash.json var RPCSchemaEthTransaction string -//go:embed schemas/rpcschemaethreceipt.json +//go:embed jsonschemas/eth_getTransactionReceipt.json var RPCSchemaEthReceipt string -//go:embed schemas/rpcschemafilterchanges.json +//go:embed jsonschemas/eth_getFilterChanges.json var RPCSchemaEthFilter string -//go:embed schemas/rpcschemaethfeehistory.json +//go:embed jsonschemas/eth_feeHistory.json var RPCSchemaEthFeeHistory string -//go:embed schemas/rpcschemaethaccesslist.json +//go:embed jsonschemas/eth_createAccessList.json var RPCSchemaEthAccessList string -//go:embed schemas/rpcschemaethproof.json +//go:embed jsonschemas/eth_getProof.json var RPCSchemaEthProof string -//go:embed schemas/rpcschemadebugtrace.json +//go:embed jsonschemas/rpcschemadebugtrace.json var RPCSchemaDebugTrace string -//go:embed schemas/rpcschemahexarray.json +//go:embed jsonschemas/rpcschemahexarray.json var RPCSchemaHexArray string -//go:embed schemas/rpcschemabadblocks.json +//go:embed jsonschemas/debug_getBadBlocks.json var RPCSchemaBadBlocks string -//go:embed schemas/rpcschemadebugblock.json +//go:embed jsonschemas/rpcschemadebugblock.json var RPCSchemaDebugTraceBlock string diff --git a/rpctypes/schemas/openrpc.json b/rpctypes/schemas/openrpc.json deleted file mode 100644 index 4448c260..00000000 --- a/rpctypes/schemas/openrpc.json +++ /dev/null @@ -1,5873 +0,0 @@ -{ - "openrpc": "1.2.4", - "info": { - "title": "Ethereum JSON-RPC Specification", - "description": "A specification of the standard interface for Ethereum clients.", - "license": { - "name": "CC0-1.0", - "url": "https://creativecommons.org/publicdomain/zero/1.0/legalcode" - }, - "version": "0.0.0" - }, - "methods": [ - { - "name": "eth_getBlockByHash", - "summary": "Returns information about a block by hash.", - "params": [ - { - "name": "Block hash", - "required": true, - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "name": "Hydrated transactions", - "required": true, - "schema": { - "title": "hydrated", - "type": "boolean" - } - } - ], - "result": { - "name": "Block information", - "schema": { - "title": "Block object", - "type": "object", - "required": [ - "parentHash", - "sha3Uncles", - "miner", - "stateRoot", - "transactionsRoot", - "receiptsRoot", - "logsBloom", - "number", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "mixHash", - "nonce", - "size", - "transactions", - "uncles" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "sha3Uncles": { - "title": "Ommers hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "miner": { - "title": "Coinbase", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionsRoot": { - "title": "Transactions root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "difficulty": { - "title": "Difficulty", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "number": { - "title": "Number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "mixHash": { - "title": "Mix hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "nonce": { - "title": "Nonce", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - }, - "totalDifficulty": { - "title": "Total difficulty", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "withdrawalsRoot": { - "title": "Withdrawals root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "size": { - "title": "Block size", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactions": { - "anyOf": [ - { - "title": "Transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "Full transactions", - "type": "array", - "items": { - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ] - } - } - ] - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "type": "object", - "title": "Validator withdrawal", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "index of withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "index of validator that generated withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "recipient address for withdrawal value", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "value contained in withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - } - } - } - }, - "uncles": { - "title": "Uncles", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - } - }, - { - "name": "eth_getBlockByNumber", - "summary": "Returns information about a block by number.", - "params": [ - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - }, - { - "name": "Hydrated transactions", - "required": true, - "schema": { - "title": "hydrated", - "type": "boolean" - } - } - ], - "result": { - "name": "Block information", - "schema": { - "title": "Block object", - "type": "object", - "required": [ - "parentHash", - "sha3Uncles", - "miner", - "stateRoot", - "transactionsRoot", - "receiptsRoot", - "logsBloom", - "number", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "mixHash", - "nonce", - "size", - "transactions", - "uncles" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "sha3Uncles": { - "title": "Ommers hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "miner": { - "title": "Coinbase", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionsRoot": { - "title": "Transactions root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "difficulty": { - "title": "Difficulty", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "number": { - "title": "Number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "mixHash": { - "title": "Mix hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "nonce": { - "title": "Nonce", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - }, - "totalDifficulty": { - "title": "Total difficulty", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "withdrawalsRoot": { - "title": "Withdrawals root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "size": { - "title": "Block size", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactions": { - "anyOf": [ - { - "title": "Transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "Full transactions", - "type": "array", - "items": { - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ] - } - } - ] - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "type": "object", - "title": "Validator withdrawal", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "index of withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "index of validator that generated withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "recipient address for withdrawal value", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "value contained in withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - } - } - } - }, - "uncles": { - "title": "Uncles", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - } - }, - { - "name": "eth_getBlockTransactionCountByHash", - "summary": "Returns the number of transactions in a block from a block matching the given block hash.", - "params": [ - { - "name": "Block hash", - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Transaction count", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getBlockTransactionCountByNumber", - "summary": "Returns the number of transactions in a block matching the given block number.", - "params": [ - { - "name": "Block", - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Transaction count", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getUncleCountByBlockHash", - "summary": "Returns the number of uncles in a block from a block matching the given block hash.", - "params": [ - { - "name": "Block hash", - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Uncle count", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getUncleCountByBlockNumber", - "summary": "Returns the number of transactions in a block matching the given block number.", - "params": [ - { - "name": "Block", - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Uncle count", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_chainId", - "summary": "Returns the chain ID of the current network.", - "params": [], - "result": { - "name": "Chain ID", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_syncing", - "summary": "Returns an object with data about the sync status or false.", - "params": [], - "result": { - "name": "Syncing status", - "schema": { - "title": "Syncing status", - "oneOf": [ - { - "title": "Syncing progress", - "type": "object", - "properties": { - "startingBlock": { - "title": "Starting block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "currentBlock": { - "title": "Current block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "highestBlock": { - "title": "Highest block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Not syncing", - "description": "Should always return false if not syncing.", - "type": "boolean" - } - ] - } - } - }, - { - "name": "eth_coinbase", - "summary": "Returns the client coinbase address.", - "params": [], - "result": { - "name": "Coinbase address", - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - } - }, - { - "name": "eth_accounts", - "summary": "Returns a list of addresses owned by client.", - "params": [], - "result": { - "name": "Accounts", - "schema": { - "title": "Accounts", - "type": "array", - "items": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - } - } - }, - { - "name": "eth_blockNumber", - "summary": "Returns the number of most recent block.", - "params": [], - "result": { - "name": "Block number", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_call", - "summary": "Executes a new message call immediately without creating a transaction on the block chain.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "type": "object", - "title": "Transaction object generic to all types", - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - } - } - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Return data", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "eth_estimateGas", - "summary": "Generates and returns an estimate of how much gas is necessary to allow the transaction to complete.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "type": "object", - "title": "Transaction object generic to all types", - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - } - } - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Gas used", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_createAccessList", - "summary": "Generates an access list for a transaction.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "type": "object", - "title": "Transaction object generic to all types", - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - } - } - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Gas used", - "schema": { - "title": "Access list result", - "type": "object", - "properties": { - "accessList": { - "title": "accessList", - "type": "array", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "error": { - "title": "error", - "type": "string" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - } - }, - { - "name": "eth_gasPrice", - "summary": "Returns the current price per gas in wei.", - "params": [], - "result": { - "name": "Gas price", - "schema": { - "title": "Gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_maxPriorityFeePerGas", - "summary": "Returns the current maxPriorityFeePerGas per gas in wei.", - "params": [], - "result": { - "name": "Max priority fee per gas", - "schema": { - "title": "Max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_feeHistory", - "summary": "Transaction fee history", - "description": "Returns transaction base fee per gas and effective priority fee per gas for the requested/supported block range.", - "params": [ - { - "name": "blockCount", - "description": "Requested range of blocks. Clients will return less than the requested range if not all blocks are available.", - "required": true, - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - }, - { - "name": "newestBlock", - "description": "Highest block of the requested range.", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - }, - { - "name": "rewardPercentiles", - "description": "A monotonically increasing list of percentile values. For each block in the requested range, the transactions will be sorted in ascending order by effective tip per gas and the corresponding effective tip for the percentile will be determined, accounting for gas consumed.", - "required": true, - "schema": { - "title": "rewardPercentiles", - "type": "array", - "items": { - "title": "rewardPercentile", - "description": "Floating point value between 0 and 100.", - "type": "number" - } - } - } - ], - "result": { - "name": "feeHistoryResult", - "description": "Fee history for the returned block range. This can be a subsection of the requested range if not all blocks are available.", - "schema": { - "title": "feeHistoryResults", - "description": "Fee history results.", - "type": "object", - "required": [ - "oldestBlock", - "baseFeePerGas", - "gasUsedRatio" - ], - "properties": { - "oldestBlock": { - "title": "oldestBlock", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Lowest number block of returned range." - }, - "baseFeePerGas": { - "title": "baseFeePerGasArray", - "description": "An array of block base fees per gas. This includes the next block after the newest of the returned range, because this value can be derived from the newest block. Zeroes are returned for pre-EIP-1559 blocks.", - "type": "array", - "items": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - }, - "reward": { - "title": "rewardArray", - "description": "A two-dimensional array of effective priority fees per gas at the requested block percentiles.", - "type": "array", - "items": { - "title": "rewardPercentile", - "description": "An array of effective priority fee per gas data points from a single block. All zeroes are returned if the block is empty.", - "type": "array", - "items": { - "title": "rewardPercentile", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "A given percentile sample of effective priority fees per gas from a single block in ascending order, weighted by gas used. Zeroes are returned if the block is empty." - } - } - } - } - } - } - }, - { - "name": "eth_newFilter", - "summary": "Creates a filter object, based on filter options, to notify when the state changes (logs).", - "params": [ - { - "name": "Filter", - "schema": { - "title": "filter", - "type": "object", - "properties": { - "fromBlock": { - "title": "from block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "toBlock": { - "title": "to block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "Address(es)", - "oneOf": [ - { - "title": "Address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - { - "title": "Addresses", - "type": "array", - "items": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - } - ] - }, - "topics": { - "title": "Topics", - "type": "array", - "items": { - "title": "Filter Topic List Entry", - "oneOf": [ - { - "title": "Any Topic Match", - "type": "null" - }, - { - "title": "Single Topic Match", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - { - "title": "Multiple Topic Match", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ] - } - } - } - } - } - ], - "result": { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_newBlockFilter", - "summary": "Creates a filter in the node, to notify when a new block arrives.", - "params": [], - "result": { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_newPendingTransactionFilter", - "summary": "Creates a filter in the node, to notify when new pending transactions arrive.", - "params": [], - "result": { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_uninstallFilter", - "summary": "Uninstalls a filter with given id.", - "params": [ - { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - ], - "result": { - "name": "Success", - "schema": { - "type": "boolean" - } - } - }, - { - "name": "eth_getFilterChanges", - "summary": "Polling method for a filter, which returns an array of logs which occurred since last poll.", - "params": [ - { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - ], - "result": { - "name": "Log objects", - "schema": { - "title": "Filter results", - "oneOf": [ - { - "title": "new block hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new logs", - "type": "array", - "items": { - "title": "log", - "type": "object", - "required": [ - "transactionHash" - ], - "properties": { - "removed": { - "title": "removed", - "type": "boolean" - }, - "logIndex": { - "title": "log index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "data": { - "title": "data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "topics": { - "title": "topics", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - } - ] - } - } - }, - { - "name": "eth_getFilterLogs", - "summary": "Returns an array of all logs matching filter with given id.", - "params": [ - { - "name": "Filter Identifier", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - ], - "result": { - "name": "Log objects", - "schema": { - "title": "Filter results", - "oneOf": [ - { - "title": "new block hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new logs", - "type": "array", - "items": { - "title": "log", - "type": "object", - "required": [ - "transactionHash" - ], - "properties": { - "removed": { - "title": "removed", - "type": "boolean" - }, - "logIndex": { - "title": "log index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "data": { - "title": "data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "topics": { - "title": "topics", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - } - ] - } - } - }, - { - "name": "eth_getLogs", - "summary": "Returns an array of all logs matching filter with given id.", - "params": [ - { - "name": "Filter", - "schema": { - "title": "filter", - "type": "object", - "properties": { - "fromBlock": { - "title": "from block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "toBlock": { - "title": "to block", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "Address(es)", - "oneOf": [ - { - "title": "Address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - { - "title": "Addresses", - "type": "array", - "items": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - } - ] - }, - "topics": { - "title": "Topics", - "type": "array", - "items": { - "title": "Filter Topic List Entry", - "oneOf": [ - { - "title": "Any Topic Match", - "type": "null" - }, - { - "title": "Single Topic Match", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - { - "title": "Multiple Topic Match", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ] - } - } - } - } - } - ], - "result": { - "name": "Log objects", - "schema": { - "title": "Filter results", - "oneOf": [ - { - "title": "new block hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "new logs", - "type": "array", - "items": { - "title": "log", - "type": "object", - "required": [ - "transactionHash" - ], - "properties": { - "removed": { - "title": "removed", - "type": "boolean" - }, - "logIndex": { - "title": "log index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "data": { - "title": "data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "topics": { - "title": "topics", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - } - ] - } - } - }, - { - "name": "eth_mining", - "summary": "Returns whether the client is actively mining new blocks.", - "params": [], - "result": { - "name": "Mining status", - "schema": { - "title": "miningStatus", - "type": "boolean" - } - } - }, - { - "name": "eth_hashrate", - "summary": "Returns the number of hashes per second that the node is mining with.", - "params": [], - "result": { - "name": "Mining status", - "schema": { - "title": "Hashrate", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getWork", - "summary": "Returns the hash of the current block, the seedHash, and the boundary condition to be met (“target”).", - "params": [], - "result": { - "name": "Current work", - "schema": { - "type": "array", - "items": [ - { - "title": "Proof-of-work hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - { - "title": "seed hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - { - "title": "difficulty", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - }, - { - "name": "eth_submitWork", - "summary": "Used for submitting a proof-of-work solution.", - "params": [ - { - "name": "nonce", - "required": true, - "schema": { - "title": "8 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - } - }, - { - "name": "hash", - "required": true, - "schema": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "name": "digest", - "required": true, - "schema": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Success", - "schema": { - "type": "boolean" - } - } - }, - { - "name": "eth_submitHashrate", - "summary": "Used for submitting mining hashrate.", - "params": [ - { - "name": "Hashrate", - "required": true, - "schema": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "name": "ID", - "required": true, - "schema": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Success", - "schema": { - "type": "boolean" - } - } - }, - { - "name": "eth_sign", - "summary": "Returns an EIP-191 signature over the provided data.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "Message", - "required": true, - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - ], - "result": { - "name": "Signature", - "schema": { - "title": "65 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{65}$" - } - } - }, - { - "name": "eth_signTransaction", - "summary": "Returns an RLP encoded transaction signed by the specified account.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "type": "object", - "title": "Transaction object generic to all types", - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - } - } - } - } - ], - "result": { - "name": "Encoded transaction", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "eth_getBalance", - "summary": "Returns the balance of the account of given address.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Balance", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getStorageAt", - "summary": "Returns the value from a storage position at a given address.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "Storage slot", - "required": true, - "schema": { - "title": "hex encoded 256 bit unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Value", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "eth_getTransactionCount", - "summary": "Returns the number of transactions sent from an address.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Transaction count", - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "name": "eth_getCode", - "summary": "Returns code at a given address.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "Block", - "required": false, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Bytecode", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "eth_getProof", - "summary": "Returns the merkle proof for a given account and optionally some storage keys.", - "params": [ - { - "name": "Address", - "required": true, - "schema": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - }, - { - "name": "StorageKeys", - "required": true, - "schema": { - "title": "Storage keys", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - } - } - }, - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number, tag, or block hash", - "anyOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - }, - { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - ] - } - } - ], - "result": { - "name": "Account", - "schema": { - "title": "Account proof", - "type": "object", - "required": [ - "address", - "accountProof", - "balance", - "codeHash", - "nonce", - "storageHash", - "storageProof" - ], - "properties": { - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "accountProof": { - "title": "accountProof", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - }, - "balance": { - "title": "balance", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "codeHash": { - "title": "codeHash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "storageHash": { - "title": "storageHash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "storageProof": { - "title": "Storage proofs", - "type": "array", - "items": { - "title": "Storage proof", - "type": "object", - "required": [ - "key", - "value", - "proof" - ], - "properties": { - "key": { - "title": "key", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "proof": { - "title": "proof", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - } - } - } - } - } - }, - { - "name": "eth_sendTransaction", - "summary": "Signs and submits a transaction.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "type": "object", - "title": "Transaction object generic to all types", - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - } - } - } - } - ], - "result": { - "name": "Transaction hash", - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - }, - { - "name": "eth_sendRawTransaction", - "summary": "Submits a raw transaction.", - "params": [ - { - "name": "Transaction", - "required": true, - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - ], - "result": { - "name": "Transaction hash", - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - }, - { - "name": "eth_getTransactionByHash", - "summary": "Returns the information about a transaction requested by transaction hash.", - "params": [ - { - "name": "Transaction hash", - "required": true, - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Transaction information", - "schema": { - "type": "object", - "title": "Transaction information", - "required": [ - "blockHash", - "blockNumber", - "from", - "hash", - "transactionIndex" - ], - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ], - "properties": { - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "hash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - } - }, - { - "name": "eth_getTransactionByBlockHashAndIndex", - "summary": "Returns information about a transaction by block hash and transaction index position.", - "params": [ - { - "name": "Block hash", - "required": true, - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "name": "Transaction index", - "required": true, - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - ], - "result": { - "name": "Transaction information", - "schema": { - "type": "object", - "title": "Transaction information", - "required": [ - "blockHash", - "blockNumber", - "from", - "hash", - "transactionIndex" - ], - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ], - "properties": { - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "hash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - } - }, - { - "name": "eth_getTransactionByBlockNumberAndIndex", - "summary": "Returns information about a transaction by block number and transaction index position.", - "params": [ - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - }, - { - "name": "Transaction index", - "required": true, - "schema": { - "title": "hex encoded unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - ], - "result": { - "name": "Transaction information", - "schema": { - "type": "object", - "title": "Transaction information", - "required": [ - "blockHash", - "blockNumber", - "from", - "hash", - "transactionIndex" - ], - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ], - "properties": { - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "hash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - } - }, - { - "name": "eth_getTransactionReceipt", - "summary": "Returns the receipt of a transaction by transaction hash.", - "params": [ - { - "name": "Transaction hash", - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "Receipt Information", - "schema": { - "type": "object", - "title": "Receipt info", - "required": [ - "blockHash", - "blockNumber", - "from", - "cumulativeGasUsed", - "gasUsed", - "logs", - "logsBloom", - "transactionHash", - "transactionIndex", - "effectiveGasPrice" - ], - "properties": { - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "to": { - "title": "to", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$", - "description": "Address of the receiver or null in a contract creation transaction." - }, - "cumulativeGasUsed": { - "title": "cumulative gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The sum of gas used by this transaction and all preceding transactions in the same block." - }, - "gasUsed": { - "title": "gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The amount of gas used for this specific transaction alone." - }, - "contractAddress": { - "title": "contract address", - "description": "The contract address created, if the transaction was a contract creation, otherwise null.", - "oneOf": [ - { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - { - "name": null, - "type": "null" - } - ] - }, - "logs": { - "title": "logs", - "type": "array", - "items": { - "title": "log", - "type": "object", - "required": [ - "transactionHash" - ], - "properties": { - "removed": { - "title": "removed", - "type": "boolean" - }, - "logIndex": { - "title": "log index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "data": { - "title": "data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "topics": { - "title": "topics", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "logsBloom": { - "title": "logs bloom", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "root": { - "title": "state root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$", - "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." - }, - "status": { - "title": "status", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." - }, - "effectiveGasPrice": { - "title": "effective gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The actual value per gas deducted from the senders account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." - } - } - } - } - }, - { - "name": "debug_getRawHeader", - "summary": "Returns an RLP-encoded header.", - "params": [ - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Header RLP", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "debug_getRawBlock", - "summary": "Returns an RLP-encoded block.", - "params": [ - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Block RLP", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "debug_getRawTransaction", - "summary": "Returns an array of EIP-2718 binary-encoded transactions.", - "params": [ - { - "name": "Transaction hash", - "required": true, - "schema": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - ], - "result": { - "name": "EIP-2718 binary-encoded transaction", - "schema": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - }, - { - "name": "debug_getRawReceipts", - "summary": "Returns an array of EIP-2718 binary-encoded receipts.", - "params": [ - { - "name": "Block", - "required": true, - "schema": { - "title": "Block number or tag", - "oneOf": [ - { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - { - "title": "Block tag", - "type": "string", - "enum": [ - "earliest", - "finalized", - "safe", - "latest", - "pending" - ], - "description": "`earliest`: The lowest numbered block the client has available; `finalized`: The most recent crypto-economically secure block, cannot be re-orged outside of manual intervention driven by community coordination; `safe`: The most recent block that is safe from re-orgs under honest majority and certain synchronicity assumptions; `latest`: The most recent block in the canonical chain observed by the client, this block may be re-orged out of the canonical chain even under healthy/normal conditions; `pending`: A sample next block built by the client on top of `latest` and containing the set of transactions usually taken from local mempool. Before the merge transition is finalized, any call querying for `finalized` or `safe` block MUST be responded to with `-39001: Unknown block` error" - } - ] - } - } - ], - "result": { - "name": "Receipts", - "schema": { - "title": "Receipt array", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - }, - { - "name": "debug_getBadBlocks", - "summary": "Returns an array of recent bad blocks that the client has seen on the network.", - "params": [], - "result": { - "name": "Blocks", - "schema": { - "title": "Bad block array", - "type": "array", - "items": { - "title": "Bad block", - "type": "object", - "required": [ - "block", - "hash", - "rlp" - ], - "properties": { - "block": { - "title": "Block", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "hash": { - "title": "Hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "rlp": { - "title": "RLP", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - } - } - }, - { - "name": "engine_exchangeCapabilities", - "summary": "Exchanges list of supported Engine API methods", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md#engine_exchangecapabilities" - }, - "params": [ - { - "name": "Consensus client methods", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "result": { - "name": "Execution client methods", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - { - "name": "engine_forkchoiceUpdatedV1", - "summary": "Updates the forkchoice state", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_forkchoiceupdatedv1" - }, - "params": [ - { - "name": "Forkchoice state", - "required": true, - "schema": { - "title": "Forkchoice state object V1", - "type": "object", - "required": [ - "headBlockHash", - "safeBlockHash", - "finalizedBlockHash" - ], - "properties": { - "headBlockHash": { - "title": "Head block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "safeBlockHash": { - "title": "Safe block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "finalizedBlockHash": { - "title": "Finalized block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - }, - { - "name": "Payload attributes", - "required": false, - "schema": { - "title": "Payload attributes object V1", - "type": "object", - "required": [ - "timestamp", - "prevRandao", - "suggestedFeeRecipient" - ], - "properties": { - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "suggestedFeeRecipient": { - "title": "Suggested fee recipient", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - } - } - } - } - ], - "result": { - "name": "Response object", - "schema": { - "title": "Forkchoice updated response", - "type": "object", - "required": [ - "payloadStatus" - ], - "properties": { - "payloadStatus": { - "title": "Payload status", - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "title": "Payload validation status", - "type": "string", - "enum": [ - "VALID", - "INVALID", - "SYNCING" - ], - "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" - }, - "latestValidHash": { - "title": "The hash of the most recent valid block", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "validationError": { - "title": "Validation error message", - "type": "string" - } - } - }, - "payloadId": { - "title": "Payload id", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - } - } - } - }, - "errors": [ - { - "code": -38002, - "message": "Invalid forkchoice state" - }, - { - "code": -38003, - "message": "Invalid payload attributes" - } - ] - }, - { - "name": "engine_forkchoiceUpdatedV2", - "summary": "Updates the forkchoice state", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_forkchoiceupdatedv2" - }, - "params": [ - { - "name": "Forkchoice state", - "required": true, - "schema": { - "title": "Forkchoice state object V1", - "type": "object", - "required": [ - "headBlockHash", - "safeBlockHash", - "finalizedBlockHash" - ], - "properties": { - "headBlockHash": { - "title": "Head block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "safeBlockHash": { - "title": "Safe block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "finalizedBlockHash": { - "title": "Finalized block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - }, - { - "name": "Payload attributes", - "required": false, - "schema": { - "title": "Payload attributes object V2", - "type": "object", - "required": [ - "timestamp", - "prevRandao", - "suggestedFeeRecipient", - "withdrawals" - ], - "properties": { - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "suggestedFeeRecipient": { - "title": "Suggested fee recipient", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "title": "Withdrawal object V1", - "type": "object", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "Withdrawal index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "Validator index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "Withdrawal address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "Withdrawal amount", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - } - } - ], - "result": { - "name": "Response object", - "schema": { - "title": "Forkchoice updated response", - "type": "object", - "required": [ - "payloadStatus" - ], - "properties": { - "payloadStatus": { - "title": "Payload status", - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "title": "Payload validation status", - "type": "string", - "enum": [ - "VALID", - "INVALID", - "SYNCING" - ], - "description": "Set of possible values is restricted to VALID, INVALID, SYNCING" - }, - "latestValidHash": { - "title": "The hash of the most recent valid block", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "validationError": { - "title": "Validation error message", - "type": "string" - } - } - }, - "payloadId": { - "title": "Payload id", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - } - } - } - }, - "errors": [ - { - "code": -38002, - "message": "Invalid forkchoice state" - }, - { - "code": -38003, - "message": "Invalid payload attributes" - } - ] - }, - { - "name": "engine_newPayloadV1", - "summary": "Runs execution payload validation", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_newpayloadv1" - }, - "params": [ - { - "name": "Execution payload", - "required": true, - "schema": { - "title": "Execution payload object V1", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - } - } - ], - "result": { - "name": "Payload status", - "schema": { - "title": "Payload status object V1", - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "title": "Payload validation status", - "type": "string", - "enum": [ - "VALID", - "INVALID", - "SYNCING", - "ACCEPTED", - "INVALID_BLOCK_HASH" - ] - }, - "latestValidHash": { - "title": "The hash of the most recent valid block", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "validationError": { - "title": "Validation error message", - "type": "string" - } - } - } - } - }, - { - "name": "engine_newPayloadV2", - "summary": "Runs execution payload validation", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_newpayloadv2" - }, - "params": [ - { - "name": "Execution payload", - "required": true, - "schema": { - "oneOf": [ - { - "title": "Execution payload object V1", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - }, - { - "title": "Execution payload object V2", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions", - "withdrawals" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "title": "Withdrawal object V1", - "type": "object", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "Withdrawal index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "Validator index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "Withdrawal address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "Withdrawal amount", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - } - ] - } - } - ], - "result": { - "name": "Payload status", - "schema": { - "title": "Payload status object deprecating INVALID_BLOCK_HASH status", - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "title": "Payload validation status", - "type": "string", - "enum": [ - "VALID", - "INVALID", - "SYNCING", - "ACCEPTED" - ] - }, - "latestValidHash": { - "title": "The hash of the most recent valid block", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "validationError": { - "title": "Validation error message", - "type": "string" - } - } - } - }, - "errors": [ - { - "code": -32602, - "message": "Invalid params" - } - ] - }, - { - "name": "engine_getPayloadV1", - "summary": "Obtains execution payload from payload build process", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_getpayloadv1" - }, - "params": [ - { - "name": "Payload id", - "required": true, - "schema": { - "title": "8 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - } - } - ], - "result": { - "name": "Execution payload", - "schema": { - "title": "Execution payload object V1", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - } - }, - "errors": [ - { - "code": -38001, - "message": "Unknown payload" - } - ] - }, - { - "name": "engine_getPayloadV2", - "summary": "Obtains execution payload from payload build process", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadv2" - }, - "params": [ - { - "name": "Payload id", - "required": true, - "schema": { - "title": "8 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - } - } - ], - "result": { - "name": "Response object", - "schema": { - "type": "object", - "required": [ - "executionPayload", - "blockValue" - ], - "properties": { - "executionPayload": { - "title": "Execution payload", - "oneOf": [ - { - "title": "Execution payload object V1", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } - }, - { - "title": "Execution payload object V2", - "type": "object", - "required": [ - "parentHash", - "feeRecipient", - "stateRoot", - "receiptsRoot", - "logsBloom", - "prevRandao", - "blockNumber", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "baseFeePerGas", - "blockHash", - "transactions", - "withdrawals" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "feeRecipient": { - "title": "Recipient of transaction priority fees", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "prevRandao": { - "title": "Previous randao value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "Block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]{0,64}$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "blockHash": { - "title": "Block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "title": "Withdrawal object V1", - "type": "object", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "Withdrawal index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "Validator index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "Withdrawal address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "Withdrawal amount", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - } - ] - }, - "blockValue": { - "title": "Expected fee value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - } - } - } - }, - "errors": [ - { - "code": -38001, - "message": "Unknown payload" - } - ] - }, - { - "name": "engine_getPayloadBodiesByHashV1", - "summary": "Given block hashes returns bodies of the corresponding execution payloads", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadbodiesbyhashv1" - }, - "params": [ - { - "name": "Array of block hashes", - "required": true, - "schema": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - ], - "result": { - "name": "Execution payload bodies", - "schema": { - "type": "array", - "items": { - "title": "Execution payload body object V1", - "type": "object", - "required": [ - "transactions" - ], - "properties": { - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - }, - "withdrawals": { - "title": "Withdrawals", - "type": [ - "array", - "null" - ], - "items": { - "title": "Withdrawal object V1", - "type": "object", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "Withdrawal index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "Validator index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "Withdrawal address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "Withdrawal amount", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - } - } - }, - "errors": [ - { - "code": -38004, - "message": "Too large request" - } - ] - }, - { - "name": "engine_getPayloadBodiesByRangeV1", - "summary": "Given a range of block numbers returns bodies of the corresponding execution payloads", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/shanghai.md#engine_getpayloadbodiesbyrangev1" - }, - "params": [ - { - "name": "Starting block number", - "required": true, - "schema": { - "title": "hex encoded 64 bit unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - }, - { - "name": "Number of blocks to return", - "required": true, - "schema": { - "title": "hex encoded 64 bit unsigned integer", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - ], - "result": { - "name": "Execution payload bodies", - "schema": { - "type": "array", - "items": { - "title": "Execution payload body object V1", - "type": "object", - "required": [ - "transactions" - ], - "properties": { - "transactions": { - "title": "Transactions", - "type": "array", - "items": { - "title": "hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - }, - "withdrawals": { - "title": "Withdrawals", - "type": [ - "array", - "null" - ], - "items": { - "title": "Withdrawal object V1", - "type": "object", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "Withdrawal index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "Validator index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "Withdrawal address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "Withdrawal amount", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - } - } - }, - "errors": [ - { - "code": -38004, - "message": "Too large request" - } - ] - }, - { - "name": "engine_exchangeTransitionConfigurationV1", - "summary": "Exchanges transition configuration", - "externalDocs": { - "description": "Method specification", - "url": "https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#engine_exchangetransitionconfigurationv1" - }, - "params": [ - { - "name": "Consensus client configuration", - "required": true, - "schema": { - "title": "Transition configuration object", - "type": "object", - "required": [ - "terminalTotalDifficulty", - "terminalBlockHash", - "terminalBlockNumber" - ], - "properties": { - "terminalTotalDifficulty": { - "title": "Terminal total difficulty", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "terminalBlockHash": { - "title": "Terminal block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "terminalBlockNumber": { - "title": "Terminal block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - ], - "result": { - "name": "Execution client configuration", - "schema": { - "title": "Transition configuration object", - "type": "object", - "required": [ - "terminalTotalDifficulty", - "terminalBlockHash", - "terminalBlockNumber" - ], - "properties": { - "terminalTotalDifficulty": { - "title": "Terminal total difficulty", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - }, - "terminalBlockHash": { - "title": "Terminal block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "terminalBlockNumber": { - "title": "Terminal block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - } - } - } - } - } - ], - "components": {} -} \ No newline at end of file diff --git a/rpctypes/schemas/rpcschemabadblocks.json b/rpctypes/schemas/rpcschemabadblocks.json deleted file mode 100644 index 3059b207..00000000 --- a/rpctypes/schemas/rpcschemabadblocks.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "title": "Bad block array", - "type": "array", - "items": { - "title": "Bad block", - "type": "object", - "required": [ - "block", - "hash", - "rlp" - ], - "properties": { - "block": { - "title": "Block", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "hash": { - "title": "Hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "rlp": { - "title": "RLP", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - } - } - } -} diff --git a/rpctypes/schemas/rpcschemaethblock.json b/rpctypes/schemas/rpcschemaethblock.json deleted file mode 100644 index bb7d3765..00000000 --- a/rpctypes/schemas/rpcschemaethblock.json +++ /dev/null @@ -1,469 +0,0 @@ -{ - "title": "Block object", - "type": "object", - "required": [ - "parentHash", - "sha3Uncles", - "miner", - "stateRoot", - "transactionsRoot", - "receiptsRoot", - "logsBloom", - "number", - "gasLimit", - "gasUsed", - "timestamp", - "extraData", - "mixHash", - "nonce", - "size", - "transactions", - "uncles" - ], - "properties": { - "parentHash": { - "title": "Parent block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "sha3Uncles": { - "title": "Ommers hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "miner": { - "title": "Coinbase", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "stateRoot": { - "title": "State root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionsRoot": { - "title": "Transactions root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "receiptsRoot": { - "title": "Receipts root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "logsBloom": { - "title": "Bloom filter", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "difficulty": { - "title": "Difficulty", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "number": { - "title": "Number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasLimit": { - "title": "Gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "gasUsed": { - "title": "Gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "timestamp": { - "title": "Timestamp", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "extraData": { - "title": "Extra data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "mixHash": { - "title": "Mix hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "nonce": { - "title": "Nonce", - "type": "string", - "pattern": "^0x[0-9a-f]{16}$" - }, - "totalDifficulty": { - "title": "Total difficulty", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "baseFeePerGas": { - "title": "Base fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "withdrawalsRoot": { - "title": "Withdrawals root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "size": { - "title": "Block size", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactions": { - "anyOf": [ - { - "title": "Transaction hashes", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - }, - { - "title": "Full transactions", - "type": "array", - "items": { - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ] - } - } - ] - }, - "withdrawals": { - "title": "Withdrawals", - "type": "array", - "items": { - "type": "object", - "title": "Validator withdrawal", - "required": [ - "index", - "validatorIndex", - "address", - "amount" - ], - "properties": { - "index": { - "title": "index of withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "validatorIndex": { - "title": "index of validator that generated withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,15})|0$" - }, - "address": { - "title": "recipient address for withdrawal value", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "amount": { - "title": "value contained in withdrawal", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]{0,31})|0$" - } - } - } - }, - "uncles": { - "title": "Uncles", - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } -} diff --git a/rpctypes/schemas/rpcschemaethreceipt.json b/rpctypes/schemas/rpcschemaethreceipt.json deleted file mode 100644 index 089f0c4e..00000000 --- a/rpctypes/schemas/rpcschemaethreceipt.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "type": "object", - "title": "Receipt info", - "required": [ - "blockHash", - "blockNumber", - "from", - "cumulativeGasUsed", - "gasUsed", - "logs", - "logsBloom", - "transactionHash", - "transactionIndex", - "effectiveGasPrice" - ], - "properties": { - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "to": { - "title": "to", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$", - "description": "Address of the receiver or null in a contract creation transaction." - }, - "cumulativeGasUsed": { - "title": "cumulative gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The sum of gas used by this transaction and all preceding transactions in the same block." - }, - "gasUsed": { - "title": "gas used", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The amount of gas used for this specific transaction alone." - }, - "contractAddress": { - "title": "contract address", - "description": "The contract address created, if the transaction was a contract creation, otherwise null.", - "oneOf": [ - { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - { - "name": null, - "type": "null" - } - ] - }, - "logs": { - "title": "logs", - "type": "array", - "items": { - "title": "log", - "type": "object", - "required": [ - "transactionHash" - ], - "properties": { - "removed": { - "title": "removed", - "type": "boolean" - }, - "logIndex": { - "title": "log index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "transactionHash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "address": { - "title": "address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "data": { - "title": "data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "topics": { - "title": "topics", - "type": "array", - "items": { - "title": "32 hex encoded bytes", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "logsBloom": { - "title": "logs bloom", - "type": "string", - "pattern": "^0x[0-9a-f]{512}$" - }, - "root": { - "title": "state root", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$", - "description": "The post-transaction state root. Only specified for transactions included before the Byzantium upgrade." - }, - "status": { - "title": "status", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Either 1 (success) or 0 (failure). Only specified for transactions included after the Byzantium upgrade." - }, - "effectiveGasPrice": { - "title": "effective gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The actual value per gas deducted from the senders account. Before EIP-1559, this is equal to the transaction's gas price. After, it is equal to baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)." - } - } -} diff --git a/rpctypes/schemas/rpcschemaethtransaction.json b/rpctypes/schemas/rpcschemaethtransaction.json deleted file mode 100644 index 78c3aa56..00000000 --- a/rpctypes/schemas/rpcschemaethtransaction.json +++ /dev/null @@ -1,323 +0,0 @@ -{ - "type": "object", - "title": "Transaction information", - "required": [ - "blockHash", - "blockNumber", - "from", - "hash", - "transactionIndex" - ], - "oneOf": [ - { - "title": "Signed 1559 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "input", - "maxFeePerGas", - "maxPriorityFeePerGas", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "maxPriorityFeePerGas": { - "title": "max priority fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Maximum fee per gas the sender is willing to pay to miners in wei" - }, - "maxFeePerGas": { - "title": "max fee per gas", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed 2930 Transaction", - "type": "object", - "required": [ - "accessList", - "chainId", - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "value", - "yParity" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "accessList": { - "title": "accessList", - "type": "array", - "description": "EIP-2930 access list", - "items": { - "title": "Access list entry", - "type": "object", - "properties": { - "address": { - "title": "hex encoded address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "storageKeys": { - "type": "array", - "items": { - "title": "32 byte hex value", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - } - } - } - } - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "yParity": { - "title": "yParity", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The parity (0 for even, 1 for odd) of the y-value of the secp256k1 signature." - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - }, - { - "title": "Signed Legacy Transaction", - "type": "object", - "required": [ - "gas", - "gasPrice", - "input", - "nonce", - "r", - "s", - "type", - "v", - "value" - ], - "properties": { - "type": { - "title": "type", - "type": "string", - "pattern": "^0x([0-9,a-f,A-F]?){1,2}$" - }, - "nonce": { - "title": "nonce", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "to": { - "title": "to address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "gas": { - "title": "gas limit", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "value": { - "title": "value", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "input": { - "title": "input data", - "type": "string", - "pattern": "^0x[0-9a-f]*$" - }, - "gasPrice": { - "title": "gas price", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "The gas price willing to be paid by the sender in wei" - }, - "chainId": { - "title": "chainId", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$", - "description": "Chain ID that this transaction is valid on." - }, - "v": { - "title": "v", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "r": { - "title": "r", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "s": { - "title": "s", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } - } - ], - "properties": { - "blockHash": { - "title": "block hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "blockNumber": { - "title": "block number", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - }, - "from": { - "title": "from address", - "type": "string", - "pattern": "^0x[0-9,a-f,A-F]{40}$" - }, - "hash": { - "title": "transaction hash", - "type": "string", - "pattern": "^0x[0-9a-f]{64}$" - }, - "transactionIndex": { - "title": "transaction index", - "type": "string", - "pattern": "^0x([1-9a-f]+[0-9a-f]*|0)$" - } - } -} diff --git a/scripts/rpctypes.sh b/scripts/rpctypes.sh new file mode 100755 index 00000000..6bd9293f --- /dev/null +++ b/scripts/rpctypes.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# This script takes an argument of the dest directory for the rpc types json file +# Usage: ./rpctypes.sh rpctypes/schemas/ +readonly url=https://github.com/ethereum/execution-apis.git +readonly dest=tmp/execution-apis +readonly schema_dest=schemas + +git clone --depth=1 $url $dest + +pushd $dest +npm install +npm run build + +methods=($(cat openrpc.json | jq -r '.methods[].name' | sort)) + +mkdir $schema_dest +echo "Methods:" +for method in "${methods[@]}"; do + echo "Generating schemas for: $method" + cat openrpc.json | jq --arg methodName $method '.methods[] | select(.name == $methodName) | .result.schema' > "$schema_dest/$method.json" +done + +popd + +if [ ! -d $1 ] ; then + mkdir $1 +fi + +echo "copying schemas to $1..." +cp -r $dest/$schema_dest/ $1 From 96089ed4b355c4b265513ec91fb0b970f25e7ab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Vincent?= <28714795+leovct@users.noreply.github.com> Date: Mon, 20 Nov 2023 17:08:14 +0100 Subject: [PATCH 3/5] chore: transform `contracts` repository into `forge` repository and fix the `ERC20` bytecode deployment issue (#162) * feat: init `forge` repository * chore: update job * chore: refactor and move go bindings to `bindings` pkg * ci: update job to make sure go bindings are up to date * ci: install `solc` and `abigen` * ci: fix job and only run when files under `contracts/` are modified * chore: nit * test: modify file under `bindings` * fix: path issue * fix: issue with concurrent workflows * chore: clean up * chore: clean up * ci: install abigen using another method * chore: rename jobs * chore: show diffs when there is a problem * chore: nit * chore: clean up * chore: install specific version of solc * chore: remove solc installation as foundry handles it * chore: bump solc version * chore: generate new bindings --- .github/workflows/ci.yml | 14 +- .github/workflows/go-bindings.yml | 52 + .gitmodules | 6 + Makefile | 5 +- bindings/tester/ConformanceTester.abi | 78 + bindings/tester/ConformanceTester.bin | 1 + bindings/tester/LoadTester.abi | 1422 +++++++++++++++++ bindings/tester/LoadTester.bin | 1 + .../tester/conformanceTester.go | 4 +- .../contracts.go => bindings/tester/helper.go | 17 +- .../tester/loadTester.go | 4 +- .../tester/precompiles.go | 4 +- bindings/tokens/ERC20.abi | 290 ++++ bindings/tokens/ERC20.bin | 1 + {contracts => bindings}/tokens/ERC20.go | 151 +- bindings/tokens/ERC721.abi | 368 +++++ bindings/tokens/ERC721.bin | 1 + {contracts => bindings}/tokens/ERC721.go | 358 +++-- .../uniswapv3/IUniswapV3Pool.abi | 0 .../uniswapv3/IUniswapV3Pool.go | 0 .../uniswapv3/IUniswapV3Pool.json | 0 .../uniswapv3/NFTDescriptor.abi | 0 .../uniswapv3/NFTDescriptor.bin | 0 .../uniswapv3/NFTDescriptor.go | 0 .../uniswapv3/NFTDescriptor.json | 0 .../uniswapv3/NonfungiblePositionManager.abi | 0 .../uniswapv3/NonfungiblePositionManager.bin | 0 .../uniswapv3/NonfungiblePositionManager.go | 0 .../uniswapv3/NonfungiblePositionManager.json | 0 .../NonfungibleTokenPositionDescriptor.abi | 0 .../NonfungibleTokenPositionDescriptor.bin | 0 .../NonfungibleTokenPositionDescriptor.go | 0 .../NonfungibleTokenPositionDescriptor.json | 0 .../uniswapv3/ProxyAdmin.abi | 0 .../uniswapv3/ProxyAdmin.bin | 0 .../uniswapv3/ProxyAdmin.go | 0 .../uniswapv3/ProxyAdmin.json | 0 .../uniswapv3/QuoterV2.abi | 0 .../uniswapv3/QuoterV2.bin | 0 {contracts => bindings}/uniswapv3/QuoterV2.go | 0 .../uniswapv3/QuoterV2.json | 0 {contracts => bindings}/uniswapv3/README.org | 0 .../uniswapv3/SwapRouter02.abi | 0 .../uniswapv3/SwapRouter02.bin | 0 .../uniswapv3/SwapRouter02.go | 0 .../uniswapv3/SwapRouter02.json | 0 {contracts => bindings}/uniswapv3/Swapper.abi | 0 {contracts => bindings}/uniswapv3/Swapper.bin | 0 {contracts => bindings}/uniswapv3/Swapper.go | 0 .../uniswapv3/Swapper.json | 0 {contracts => bindings}/uniswapv3/Swapper.sol | 0 .../uniswapv3/TickLens.abi | 0 .../uniswapv3/TickLens.bin | 0 {contracts => bindings}/uniswapv3/TickLens.go | 0 .../uniswapv3/TickLens.json | 0 .../uniswapv3/TransparentUpgradeableProxy.abi | 0 .../uniswapv3/TransparentUpgradeableProxy.bin | 0 .../uniswapv3/TransparentUpgradeableProxy.go | 0 .../TransparentUpgradeableProxy.json | 0 .../uniswapv3/UniswapInterfaceMulticall.abi | 0 .../uniswapv3/UniswapInterfaceMulticall.bin | 0 .../uniswapv3/UniswapInterfaceMulticall.go | 0 .../uniswapv3/UniswapInterfaceMulticall.json | 0 .../uniswapv3/UniswapV3Factory.abi | 0 .../uniswapv3/UniswapV3Factory.bin | 0 .../uniswapv3/UniswapV3Factory.go | 0 .../uniswapv3/UniswapV3Factory.json | 0 .../uniswapv3/UniswapV3Staker.abi | 0 .../uniswapv3/UniswapV3Staker.bin | 0 .../uniswapv3/UniswapV3Staker.go | 0 .../uniswapv3/UniswapV3Staker.json | 0 .../uniswapv3/V3Migrator.abi | 0 .../uniswapv3/V3Migrator.bin | 0 .../uniswapv3/V3Migrator.go | 0 .../uniswapv3/V3Migrator.json | 0 {contracts => bindings}/uniswapv3/WETH9.abi | 0 {contracts => bindings}/uniswapv3/WETH9.bin | 0 {contracts => bindings}/uniswapv3/WETH9.go | 0 {contracts => bindings}/uniswapv3/WETH9.json | 0 cmd/loadtest/loadtest.go | 62 +- cmd/loadtest/uniswapv3.go | 2 +- cmd/loadtest/uniswapv3/deploy.go | 8 +- cmd/loadtest/uniswapv3/pool.go | 10 +- cmd/loadtest/uniswapv3/swap.go | 2 +- cmd/loadtest/uniswapv3/swapper.go | 8 +- cmd/rpcfuzz/rpcfuzz.go | 7 +- contracts/.gitignore | 14 + contracts/Makefile | 40 + contracts/README.md | 51 + .../conformancetester/ConformanceTester.abi | 1 - .../conformancetester/ConformanceTester.bin | 1 - contracts/foundry.toml | 13 + contracts/lib/forge-std | 1 + contracts/lib/openzeppelin-contracts | 1 + contracts/loadtester/LoadTester.abi | 1 - contracts/loadtester/LoadTester.bin | 1 - contracts/{ => src}/asm/README.md | 0 .../{ => src}/asm/blockhash-gas-loop.easm | 0 .../{ => src}/asm/delegate-call-loop.easm | 0 contracts/{ => src}/asm/deploy-call-loop.easm | 0 contracts/{ => src}/asm/deploy-header.easm | 0 contracts/{ => src}/asm/deploy.easm | 0 contracts/{ => src}/asm/fib-nostore.easm | 0 contracts/{ => src}/asm/fib.easm | 0 contracts/{ => src}/asm/noop-loop.easm | 0 contracts/{ => src}/asm/sstore-loop.easm | 0 .../tester}/ConformanceTester.sol | 4 +- .../{loadtester => src/tester}/LoadTester.sol | 2 +- contracts/src/tokens/ERC20.sol | 14 + contracts/src/tokens/ERC721.sol | 19 + contracts/{ => src/yul}/test.yul | 0 contracts/tokens/ERC20/ERC20.abi | 1 - contracts/tokens/ERC20/ERC20.bin | 1 - contracts/tokens/ERC20/ERC20.sol | 83 - contracts/tokens/ERC20/IERC20.abi | 1 - contracts/tokens/ERC20/IERC20.bin | 0 contracts/tokens/ERC721/ERC721.abi | 1 - contracts/tokens/ERC721/ERC721.bin | 1 - contracts/tokens/ERC721/ERC721.sol | 210 --- contracts/tokens/ERC721/IERC165.abi | 1 - contracts/tokens/ERC721/IERC165.bin | 0 contracts/tokens/ERC721/IERC721.abi | 1 - contracts/tokens/ERC721/IERC721.bin | 0 contracts/tokens/ERC721/IERC721Receiver.abi | 1 - contracts/tokens/ERC721/IERC721Receiver.bin | 0 contracts/types.go | 11 - go.sum | 2 - 127 files changed, 2732 insertions(+), 621 deletions(-) create mode 100644 .github/workflows/go-bindings.yml create mode 100644 .gitmodules create mode 100644 bindings/tester/ConformanceTester.abi create mode 100644 bindings/tester/ConformanceTester.bin create mode 100644 bindings/tester/LoadTester.abi create mode 100644 bindings/tester/LoadTester.bin rename contracts/conformancetester/ConformanceTester.go => bindings/tester/conformanceTester.go (74%) rename contracts/contracts.go => bindings/tester/helper.go (94%) rename contracts/loadtester.go => bindings/tester/loadTester.go (80%) rename contracts/precompiledContracts.go => bindings/tester/precompiles.go (98%) create mode 100644 bindings/tokens/ERC20.abi create mode 100644 bindings/tokens/ERC20.bin rename {contracts => bindings}/tokens/ERC20.go (58%) create mode 100644 bindings/tokens/ERC721.abi create mode 100644 bindings/tokens/ERC721.bin rename {contracts => bindings}/tokens/ERC721.go (50%) rename {contracts => bindings}/uniswapv3/IUniswapV3Pool.abi (100%) rename {contracts => bindings}/uniswapv3/IUniswapV3Pool.go (100%) rename {contracts => bindings}/uniswapv3/IUniswapV3Pool.json (100%) rename {contracts => bindings}/uniswapv3/NFTDescriptor.abi (100%) rename {contracts => bindings}/uniswapv3/NFTDescriptor.bin (100%) rename {contracts => bindings}/uniswapv3/NFTDescriptor.go (100%) rename {contracts => bindings}/uniswapv3/NFTDescriptor.json (100%) rename {contracts => bindings}/uniswapv3/NonfungiblePositionManager.abi (100%) rename {contracts => bindings}/uniswapv3/NonfungiblePositionManager.bin (100%) rename {contracts => bindings}/uniswapv3/NonfungiblePositionManager.go (100%) rename {contracts => bindings}/uniswapv3/NonfungiblePositionManager.json (100%) rename {contracts => bindings}/uniswapv3/NonfungibleTokenPositionDescriptor.abi (100%) rename {contracts => bindings}/uniswapv3/NonfungibleTokenPositionDescriptor.bin (100%) rename {contracts => bindings}/uniswapv3/NonfungibleTokenPositionDescriptor.go (100%) rename {contracts => bindings}/uniswapv3/NonfungibleTokenPositionDescriptor.json (100%) rename {contracts => bindings}/uniswapv3/ProxyAdmin.abi (100%) rename {contracts => bindings}/uniswapv3/ProxyAdmin.bin (100%) rename {contracts => bindings}/uniswapv3/ProxyAdmin.go (100%) rename {contracts => bindings}/uniswapv3/ProxyAdmin.json (100%) rename {contracts => bindings}/uniswapv3/QuoterV2.abi (100%) rename {contracts => bindings}/uniswapv3/QuoterV2.bin (100%) rename {contracts => bindings}/uniswapv3/QuoterV2.go (100%) rename {contracts => bindings}/uniswapv3/QuoterV2.json (100%) rename {contracts => bindings}/uniswapv3/README.org (100%) rename {contracts => bindings}/uniswapv3/SwapRouter02.abi (100%) rename {contracts => bindings}/uniswapv3/SwapRouter02.bin (100%) rename {contracts => bindings}/uniswapv3/SwapRouter02.go (100%) rename {contracts => bindings}/uniswapv3/SwapRouter02.json (100%) rename {contracts => bindings}/uniswapv3/Swapper.abi (100%) rename {contracts => bindings}/uniswapv3/Swapper.bin (100%) rename {contracts => bindings}/uniswapv3/Swapper.go (100%) rename {contracts => bindings}/uniswapv3/Swapper.json (100%) rename {contracts => bindings}/uniswapv3/Swapper.sol (100%) rename {contracts => bindings}/uniswapv3/TickLens.abi (100%) rename {contracts => bindings}/uniswapv3/TickLens.bin (100%) rename {contracts => bindings}/uniswapv3/TickLens.go (100%) rename {contracts => bindings}/uniswapv3/TickLens.json (100%) rename {contracts => bindings}/uniswapv3/TransparentUpgradeableProxy.abi (100%) rename {contracts => bindings}/uniswapv3/TransparentUpgradeableProxy.bin (100%) rename {contracts => bindings}/uniswapv3/TransparentUpgradeableProxy.go (100%) rename {contracts => bindings}/uniswapv3/TransparentUpgradeableProxy.json (100%) rename {contracts => bindings}/uniswapv3/UniswapInterfaceMulticall.abi (100%) rename {contracts => bindings}/uniswapv3/UniswapInterfaceMulticall.bin (100%) rename {contracts => bindings}/uniswapv3/UniswapInterfaceMulticall.go (100%) rename {contracts => bindings}/uniswapv3/UniswapInterfaceMulticall.json (100%) rename {contracts => bindings}/uniswapv3/UniswapV3Factory.abi (100%) rename {contracts => bindings}/uniswapv3/UniswapV3Factory.bin (100%) rename {contracts => bindings}/uniswapv3/UniswapV3Factory.go (100%) rename {contracts => bindings}/uniswapv3/UniswapV3Factory.json (100%) rename {contracts => bindings}/uniswapv3/UniswapV3Staker.abi (100%) rename {contracts => bindings}/uniswapv3/UniswapV3Staker.bin (100%) rename {contracts => bindings}/uniswapv3/UniswapV3Staker.go (100%) rename {contracts => bindings}/uniswapv3/UniswapV3Staker.json (100%) rename {contracts => bindings}/uniswapv3/V3Migrator.abi (100%) rename {contracts => bindings}/uniswapv3/V3Migrator.bin (100%) rename {contracts => bindings}/uniswapv3/V3Migrator.go (100%) rename {contracts => bindings}/uniswapv3/V3Migrator.json (100%) rename {contracts => bindings}/uniswapv3/WETH9.abi (100%) rename {contracts => bindings}/uniswapv3/WETH9.bin (100%) rename {contracts => bindings}/uniswapv3/WETH9.go (100%) rename {contracts => bindings}/uniswapv3/WETH9.json (100%) create mode 100644 contracts/.gitignore create mode 100644 contracts/Makefile create mode 100644 contracts/README.md delete mode 100644 contracts/conformancetester/ConformanceTester.abi delete mode 100644 contracts/conformancetester/ConformanceTester.bin create mode 100644 contracts/foundry.toml create mode 160000 contracts/lib/forge-std create mode 160000 contracts/lib/openzeppelin-contracts delete mode 100644 contracts/loadtester/LoadTester.abi delete mode 100644 contracts/loadtester/LoadTester.bin rename contracts/{ => src}/asm/README.md (100%) rename contracts/{ => src}/asm/blockhash-gas-loop.easm (100%) rename contracts/{ => src}/asm/delegate-call-loop.easm (100%) rename contracts/{ => src}/asm/deploy-call-loop.easm (100%) rename contracts/{ => src}/asm/deploy-header.easm (100%) rename contracts/{ => src}/asm/deploy.easm (100%) rename contracts/{ => src}/asm/fib-nostore.easm (100%) rename contracts/{ => src}/asm/fib.easm (100%) rename contracts/{ => src}/asm/noop-loop.easm (100%) rename contracts/{ => src}/asm/sstore-loop.easm (100%) rename contracts/{conformancetester => src/tester}/ConformanceTester.sol (91%) rename contracts/{loadtester => src/tester}/LoadTester.sol (99%) create mode 100644 contracts/src/tokens/ERC20.sol create mode 100644 contracts/src/tokens/ERC721.sol rename contracts/{ => src/yul}/test.yul (100%) delete mode 100644 contracts/tokens/ERC20/ERC20.abi delete mode 100644 contracts/tokens/ERC20/ERC20.bin delete mode 100644 contracts/tokens/ERC20/ERC20.sol delete mode 100644 contracts/tokens/ERC20/IERC20.abi delete mode 100644 contracts/tokens/ERC20/IERC20.bin delete mode 100644 contracts/tokens/ERC721/ERC721.abi delete mode 100644 contracts/tokens/ERC721/ERC721.bin delete mode 100644 contracts/tokens/ERC721/ERC721.sol delete mode 100644 contracts/tokens/ERC721/IERC165.abi delete mode 100644 contracts/tokens/ERC721/IERC165.bin delete mode 100644 contracts/tokens/ERC721/IERC721.abi delete mode 100644 contracts/tokens/ERC721/IERC721.bin delete mode 100644 contracts/tokens/ERC721/IERC721Receiver.abi delete mode 100644 contracts/tokens/ERC721/IERC721Receiver.bin delete mode 100644 contracts/types.go diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c7aba86..eccd78e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,16 +1,9 @@ name: ci -on: - push: - branches: - - "main" - pull_request: - branches: - - "**" - types: [opened, synchronize] +on: push concurrency: - group: build-${{ github.event.pull_request.number || github.ref }} + group: ci-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true env: @@ -34,7 +27,7 @@ jobs: run: make lint doc: - name: Doc + name: Check documentation runs-on: ubuntu-latest if: (github.event.action != 'closed' || github.event.pull_request.merged == true) steps: @@ -48,6 +41,7 @@ jobs: run: | if [[ -n $(git status --porcelain) ]]; then echo "❌ Error: Documentation is not up to date. Please run \`make gen-doc\`." + git diff exit 1 else echo "✅ The documentation is up to date." diff --git a/.github/workflows/go-bindings.yml b/.github/workflows/go-bindings.yml new file mode 100644 index 00000000..e1405a4f --- /dev/null +++ b/.github/workflows/go-bindings.yml @@ -0,0 +1,52 @@ +name: go-bindings + +on: + push: + # Only run when files under `bindings/` or `contracts/` folders are modified. + paths: + - '.github/workflows/go-bindings.yml' + - 'contracts/**' + - 'bindings/**' + +concurrency: + group: go-bindings-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + SOLC_VERSION: "0.8.21" + +jobs: + go-bindings: + name: Check go bindings + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - name: Install abigen + run: | + sudo add-apt-repository ppa:ethereum/ethereum + sudo apt-get update + sudo apt-get install ethereum + abigen --version + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + - name: Install dependencies + working-directory: contracts + run: forge install + + - name: Generate go bindings + run: make gen-go-bindings + - name: Check if the go bindings are up to date + run: | + if [[ -n $(git status --porcelain) ]]; then + echo "❌ Error: Go bindings are not up to date. Please run \`make gen-go-bindings\`." + git diff + exit 1 + else + echo "✅ Go bindings are up to date." + fi \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..5c7d5d6c --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "contracts/lib/forge-std"] + path = contracts/lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "contracts/lib/openzeppelin-contracts"] + path = contracts/lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/Makefile b/Makefile index 1cced855..86627592 100644 --- a/Makefile +++ b/Makefile @@ -88,10 +88,7 @@ gen-loadtest-modes: ## Generate loadtest modes strings. .PHONY: gen-go-bindings gen-go-bindings: ## Generate go bindings for smart contracts. - $(call gen_go_binding,contracts/tokens/ERC20,ERC20,tokens,contracts/tokens) - $(call gen_go_binding,contracts/tokens/ERC721,ERC721,tokens,contracts/tokens) - $(call gen_go_binding,contracts/loadtester,LoadTester,contracts,contracts) - $(call gen_go_binding,contracts/conformancetester,ConformanceTester,conformancetester,contracts/conformancetester) + cd contracts && make gen-go-bindings .PHONY: gen-json-rpctypes gen-json-rpctypes: ## Generate go bindings for smart contracts. diff --git a/bindings/tester/ConformanceTester.abi b/bindings/tester/ConformanceTester.abi new file mode 100644 index 00000000..a1468958 --- /dev/null +++ b/bindings/tester/ConformanceTester.abi @@ -0,0 +1,78 @@ +[ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "RevertErrorMessage", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "testRevert", + "outputs": [], + "stateMutability": "pure", + "type": "function" + } +] diff --git a/bindings/tester/ConformanceTester.bin b/bindings/tester/ConformanceTester.bin new file mode 100644 index 00000000..2b46c10c --- /dev/null +++ b/bindings/tester/ConformanceTester.bin @@ -0,0 +1 @@ +0x608060405234801561001057600080fd5b506040516106ff3803806106ff83398101604081905261002f9161015b565b600061003b8282610281565b5050610344565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b038211171561007d5761007d610042565b6040525050565b600061008f60405190565b905061009b8282610058565b919050565b60006001600160401b038211156100b9576100b9610042565b601f19601f83011660200192915050565b60005b838110156100e55781810151838201526020016100cd565b50506000910152565b60006101016100fc846100a0565b610084565b90508281526020810184848401111561011c5761011c600080fd5b6101278482856100ca565b509392505050565b600082601f83011261014357610143600080fd5b81516101538482602086016100ee565b949350505050565b60006020828403121561017057610170600080fd5b81516001600160401b0381111561018957610189600080fd5b6101538482850161012f565b634e487b7160e01b600052602260045260246000fd5b6002810460018216806101bf57607f821691505b6020821081036101d1576101d1610195565b50919050565b60006101e66101e38381565b90565b92915050565b6101f5836101d7565b815460001960089490940293841b1916921b91909117905550565b600061021d8184846101ec565b505050565b8181101561023d57610235600082610210565b600101610222565b5050565b601f82111561021d576000818152602090206020601f850104810160208510156102685750805b61027a6020601f860104830182610222565b5050505050565b81516001600160401b0381111561029a5761029a610042565b6102a482546101ab565b6102af828285610241565b6020601f8311600181146102e357600084156102cb5750858201515b600019600886021c198116600286021786555061033c565b600085815260208120601f198616915b8281101561031357888501518255602094850194600190920191016102f3565b8683101561032f5784890151600019601f89166008021c191682555b6001600288020188555050505b505050505050565b6103ac806103536000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806306fdde031461005c578063242e7fa11461007a57806327e235e3146100b2578063a26388bb146100df578063b6b55f25146100e9575b600080fd5b6100646100fc565b6040516100719190610257565b60405180910390f35b610064604051806040016040528060198152602001785465737420526576657274204572726f72204d65737361676560381b81525081565b6100d26100c03660046102a4565b60016020526000908152604090205481565b60405161007191906102cd565b6100e761018a565b005b6100e76100f73660046102ea565b6101da565b6000805461010990610321565b80601f016020809104026020016040519081016040528092919081815260200182805461013590610321565b80156101825780601f1061015757610100808354040283529160200191610182565b820191906000526020600020905b81548152906001019060200180831161016557829003601f168201915b505050505081565b60408051808201825260198152785465737420526576657274204572726f72204d65737361676560381b6020820152905162461bcd60e51b81526101d19190600401610257565b60405180910390fd5b33600090815260016020526040812080548392906101f9908490610363565b909155505050565b60005b8381101561021c578181015183820152602001610204565b50506000910152565b600061022f825190565b808452602084019350610246818560208601610201565b601f01601f19169290920192915050565b602080825281016102688184610225565b9392505050565b60006001600160a01b0382165b92915050565b61028b8161026f565b811461029657600080fd5b50565b803561027c81610282565b6000602082840312156102b9576102b9600080fd5b60006102c58484610299565b949350505050565b8181526020810161027c565b8061028b565b803561027c816102d9565b6000602082840312156102ff576102ff600080fd5b60006102c584846102df565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061033557607f821691505b6020821081036103475761034761030b565b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561027c5761027c61034d56fea2646970667358221220cb58571a678e4a04b84ef57d328d854bedb20916a4a95a84ccc3bae10d9cc02e64736f6c63430008170033 diff --git a/bindings/tester/LoadTester.abi b/bindings/tester/LoadTester.abi new file mode 100644 index 00000000..5d7d5543 --- /dev/null +++ b/bindings/tester/LoadTester.abi @@ -0,0 +1,1422 @@ +[ + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "dumpster", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCallCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inc", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "loopBlockHashUntilLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "loopUntilLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "trash", + "type": "bytes" + } + ], + "name": "store", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testADD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testADDMOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testADDRESS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testAND", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testBALANCE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testBASEFEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testBLOCKHASH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testBYTE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "inputData", + "type": "bytes" + } + ], + "name": "testBlake2f", + "outputs": [ + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testCALLDATACOPY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testCALLDATALOAD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testCALLDATASIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testCALLER", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testCALLVALUE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testCHAINID", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testCODECOPY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testCODESIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testCOINBASE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testDIFFICULTY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testDIV", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "inputData", + "type": "bytes" + } + ], + "name": "testECAdd", + "outputs": [ + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "inputData", + "type": "bytes" + } + ], + "name": "testECMul", + "outputs": [ + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "inputData", + "type": "bytes" + } + ], + "name": "testECPairing", + "outputs": [ + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "inputData", + "type": "bytes" + } + ], + "name": "testECRecover", + "outputs": [ + { + "internalType": "address", + "name": "result", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testEQ", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testEXP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testEXTCODESIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testGAS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testGASLIMIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testGASPRICE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testGT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testISZERO", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "inputData", + "type": "bytes" + } + ], + "name": "testIdentity", + "outputs": [ + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testLOG0", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testLOG1", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testLOG2", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testLOG3", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testLOG4", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testLT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testMLOAD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testMOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testMSIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testMSTORE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testMSTORE8", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testMUL", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testMULMOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "inputData", + "type": "bytes" + } + ], + "name": "testModExp", + "outputs": [ + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testNOT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testNUMBER", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testOR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testORIGIN", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testRETURNDATACOPY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testRETURNDATASIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "inputData", + "type": "bytes" + } + ], + "name": "testRipemd160", + "outputs": [ + { + "internalType": "bytes20", + "name": "result", + "type": "bytes20" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSAR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSDIV", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSELFBALANCE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSGT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "inputData", + "type": "bytes" + } + ], + "name": "testSHA256", + "outputs": [ + { + "internalType": "bytes32", + "name": "result", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSHA3", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSHL", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSHR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSIGNEXTEND", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSLOAD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSLT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSMOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSSTORE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testSUB", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testTIMESTAMP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + } + ], + "name": "testXOR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/bindings/tester/LoadTester.bin b/bindings/tester/LoadTester.bin new file mode 100644 index 00000000..d2b04bcd --- /dev/null +++ b/bindings/tester/LoadTester.bin @@ -0,0 +1 @@ +0x608060405234801561001057600080fd5b50611d1e806100206000396000f3fe608060405234801561001057600080fd5b50600436106104545760003560e01c806380947f8011610241578063bf529ca11161013b578063dd9bef60116100c3578063f279ca8111610087578063f279ca811461098f578063f4d1fc61146109a2578063f58fc36a146109b5578063f6b0bbf7146109c8578063fde7721c146109e857600080fd5b8063dd9bef6014610930578063de97a36314610943578063e9f9b3f214610956578063ea5141e614610969578063edf003cf1461097c57600080fd5b8063ce3cf4ef1161010a578063ce3cf4ef146108d1578063d117320b146108e4578063d51e7b5b146108f7578063d53ff3fd1461090a578063d93cd5581461091d57600080fd5b8063bf529ca114610885578063c360aba614610898578063c420eb61146108ab578063c4bd65d5146108be57600080fd5b8063a18683cb116101c9578063b374012b1161018d578063b374012b14610826578063b3d847f214610839578063b7b862071461084c578063b81c14841461085f578063bdc875fc1461087257600080fd5b8063a18683cb146107c5578063a271b721146107e5578063a60a1087146107ed578063a645c9c214610800578063acaebdf61461081357600080fd5b8063962e4dc211610210578063962e4dc21461077957806398456f3e1461078c5780639a2b7c811461079f5780639cce7cf9146107b2578063a040aec6146104a857600080fd5b806380947f801461072d578063880eff3914610740578063918a5fcd1461075357806391e7b2771461076657600080fd5b80633430ec061161035257806360e13cde116102da5780636f099c8d1161029e5780636f099c8d146106ce57806371d91d28146106e15780637b6e0b0e146106f45780637c191d20146107075780637de8c6f81461071a57600080fd5b806360e13cde1461067a578063613d0a821461068d57806363138d4f146106a0578063659bbb4f146106b35780636e7f1fe7146106bb57600080fd5b806340fe26621161032157806340fe26621461061b57806344cf3bc71461062e5780634a61af1f146106415780634d2c74b3146106545780635590c2d91461066757600080fd5b80633430ec06146105da578063371303c0146105ed5780633a411f12146105f55780633a425dfc1461060857600080fd5b806318093b46116103e0578063219cddeb116103a4578063219cddeb1461057b5780632294fc7f1461058e5780632871ef85146105a15780632b21ef44146105b45780632d34e798146105c757600080fd5b806318093b461461051c57806319b621d61461052f5780631aba07ea146105425780631de2f343146105555780632007332e1461056857600080fd5b80630ba8a73b116104275780630ba8a73b146104c85780631287a68c146104db578063135d52f7146104e35780631581cf19146104f6578063165821501461050957600080fd5b8063034aef7114610459578063050082f814610482578063087b4e84146104955780630b3b996a146104a8575b600080fd5b61046c610467366004611786565b6109fb565b60405161047991906117b7565b60405180910390f35b61046c610490366004611786565b610a2d565b61046c6104a3366004611786565b610a56565b6104bb6104b63660046118bc565b610a87565b6040516104799190611953565b61046c6104d6366004611786565b610aaa565b60005461046c565b61046c6104f1366004611786565b610acf565b61046c610504366004611786565b610af1565b61046c610517366004611786565b610b1a565b61046c61052a366004611786565b610b46565b61046c61053d366004611786565b610b71565b61046c610550366004611786565b610bdd565b61046c610563366004611786565b610c13565b61046c610576366004611786565b610c40565b61046c610589366004611786565b610c62565b61046c61059c366004611786565b610c8b565b61046c6105af366004611786565b610cc0565b61046c6105c2366004611786565b610ce9565b61046c6105d5366004611786565b610d12565b6104bb6105e8366004611786565b610d3b565b61046c610de4565b61046c610603366004611786565b610dfd565b61046c610616366004611786565b610e1f565b61046c610629366004611786565b610e4a565b61046c61063c366004611786565b610e79565b61046c61064f366004611786565b610ea2565b61046c610662366004611786565b610ecf565b61046c610675366004611786565b610ef8565b61046c610688366004611786565b610f2e565b6104bb61069b3660046118bc565b610f5a565b61046c6106ae3660046118bc565b610f85565b61046c610fae565b61046c6106c9366004611786565b610fe8565b61046c6106dc366004611786565b611013565b61046c6106ef366004611786565b61103c565b61046c610702366004611786565b611067565b61046c610715366004611786565b611092565b61046c610728366004611786565b6110bb565b61046c61073b366004611786565b6110dd565b61046c61074e366004611786565b61110b565b61046c610761366004611786565b611138565b61046c610774366004611786565b611161565b6104bb6107873660046118bc565b61119f565b61046c61079a366004611786565b6111f0565b61046c6107ad366004611786565b611220565b6104bb6107c03660046118bc565b611242565b6107d86107d33660046118bc565b611262565b6040516104799190611985565b61046c6112bc565b61046c6107fb366004611786565b6112fd565b61046c61080e366004611786565b611326565b61046c610821366004611786565b611348565b61046c6108343660046119e5565b611373565b61046c610847366004611786565b6113a2565b61046c61085a366004611786565b6113cb565b61046c61086d366004611786565b6113f4565b61046c610880366004611786565b61141d565b61046c610893366004611786565b611446565b61046c6108a6366004611786565b61147a565b61046c6108b9366004611786565b61149c565b61046c6108cc366004611786565b6114c5565b61046c6108df366004611786565b6114eb565b61046c6108f2366004611786565b611516565b61046c610905366004611786565b611540565b61046c610918366004611786565b611562565b61046c61092b366004611786565b611584565b61046c61093e366004611786565b6115b0565b61046c610951366004611786565b6115e2565b61046c610964366004611786565b61160c565b61046c610977366004611786565b611635565b6104bb61098a3660046118bc565b611664565b61046c61099d366004611786565b6116a3565b61046c6109b0366004611786565b6116cd565b61046c6109c3366004611786565b6116f8565b6109db6109d63660046118bc565b611723565b6040516104799190611a42565b61046c6109f6366004611786565b611751565b6000610a05610de4565b5065deadbeef00366000805b84811015610a2457369150600101610a11565b50909392505050565b6000610a37610de4565b5065deadbeef00326000805b84811015610a2457329150600101610a43565b6000610a60610de4565b5065deadbeef005260005b83811015610a80576000829052600101610a6b565b5092915050565b606060086040828451602086016000855af180610aa357600080fd5b5050919050565b6000610ab4610de4565b5065deadbeef000160005b83811015610a8057600101610abf565b6000610ad9610de4565b5065deadbeef001760008315610a8057600101610abf565b6000610afb610de4565b5065deadbeef00346000805b84811015610a2457349150600101610b07565b6000610b24610de4565b5065deadbeef000660005b83811015610a805760001990910690600101610b2f565b6000610b50610de4565b5065deadbeef00136000805b84811015610a24576001808413925001610b5c565b6000610b7b610de4565b506001600160e01b0319600090815265deadbeef002090805b84811015610bab5760046000209150600101610b94565b507f29045a592007d0c246ef02c2223570da9522d0cf0f73282c79a1bc8f0bb2c2388114610a80575060009392505050565b6000610be7610de4565b5065deadbeef00a4601081905260005b83811015610a80576004600360028360066010a4600101610bf7565b6000610c1d610de4565b5065deadbeef001a6000805b84811015610a2457600083901a9150600101610c29565b6000610c4a610de4565b5065deadbeef001b60008315610a8057600101610abf565b6000610c6c610de4565b5065deadbeef00426000805b84811015610a2457429150600101610c78565b6000610c95610de4565b5065deadbeef0031600030815b85811015610cb65781319250600101610ca2565b5091949350505050565b6000610cca610de4565b5065deadbeef00486000805b84811015610a2457489150600101610cd6565b6000610cf3610de4565b5065deadbeef003d6000805b84811015610a24573d9150600101610cff565b6000610d1c610de4565b5065deadbeef00436000805b84811015610a2457439150600101610d28565b60028181548110610d4b57600080fd5b906000526020600020018054909150610d6390611a66565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8f90611a66565b8015610ddc5780601f10610db157610100808354040283529160200191610ddc565b820191906000526020600020905b815481529060010190602001808311610dbf57829003601f168201915b505050505081565b60008054610df3906001611aa8565b6000819055919050565b6000610e07610de4565b5065deadbeef000460008315610a8057600101610abf565b6000610e29610de4565b5065deadbeef003760005b83811015610a8057602060008037600101610e34565b6000610e54610de4565b5065deadbeef00a0601081905260005b83811015610a805760066010a0600101610e64565b6000610e83610de4565b5065deadbeef00336000805b84811015610a2457339150600101610e8f565b6000610eac610de4565b5065deadbeef005360005b83811015610a805763deadbeef600052600101610eb7565b6000610ed9610de4565b5065deadbeef003a6000805b84811015610a24573a9150600101610ee5565b6000610f02610de4565b5065deadbeef00516000818152805b84811015610f26576000519150600101610f11565b509392505050565b6000610f38610de4565b5065deadbeef001d60005b83811015610a805760009190911d90600101610f43565b6060600560208301835160405160208183856000885af180610f7b57600080fd5b5095945050505050565b600060026020830183518360208183856000885af180610fa457600080fd5b5050505050919050565b6000610fb8610de4565b505b6103e85a1115610fe1576001806000828254610fd69190611aa8565b90915550610fba9050565b5060015490565b6000610ff2610de4565b5065deadbeef00106000805b84811015610a24576001838110925001610ffe565b600061101d610de4565b5065deadbeef00446000805b84811015610a2457449150600101611029565b6000611046610de4565b5065deadbeef00116000805b84811015610a24576001808411925001611052565b6000611071610de4565b5065deadbeef003e60005b83811015610a805760206000803e60010161107c565b600061109c610de4565b5065deadbeef00456000805b84811015610a24574591506001016110a8565b60006110c5610de4565b5065deadbeef000260008315610a8057600101610abf565b60006110e7610de4565b5065deadbeef000860005b83811015610a80576000196000830891506001016110f2565b6000611115610de4565b5065deadbeef005460008181555b83811015610a80576000549150600101611123565b6000611142610de4565b5065deadbeef005a6000805b84811015610a24575a915060010161114e565b600061116b610de4565b5065deadbeef001960005b8381101561118957901990600101611176565b5065deadbeef0019811461119957195b92915050565b606081516060146111cb5760405162461bcd60e51b81526004016111c290611ae9565b60405180910390fd5b600760208301835160408482846000875af1806111e757600080fd5b50505050919050565b60006111fa610de4565b5065deadbeef00a1601081905260005b83811015610a80578060066010a160010161120a565b600061122a610de4565b5065deadbeef001660008315610a8057600101610abf565b60606004602083018351604051818183856000885af180610f7b57600080fd5b600081516080146112855760405162461bcd60e51b81526004016111c290611b2d565b6001602083016040840151601f1a602082015260206040516080836000865af1806112af57600080fd5b6040515195945050505050565b60006112c6610de4565b505b6103e85a1115610fe15760018060008282546112e49190611aa8565b90915550506001546112f7904390611b53565b506112c8565b6000611307610de4565b5065deadbeef00466000805b84811015610a2457469150600101611313565b6000611330610de4565b5065deadbeef000560008315610a8057600101610abf565b6000611352610de4565b5065deadbeef003960005b83811015610a805760206000803960010161135d565b60028054600181018255600091825283908390602084200191611397919083611c17565b505060025492915050565b60006113ac610de4565b5065deadbeef00596000805b84811015610a24575991506001016113b8565b60006113d5610de4565b5065deadbeef00386000805b84811015610a24573891506001016113e1565b60006113fe610de4565b5065deadbeef00416000805b84811015610a245741915060010161140a565b6000611427610de4565b5065deadbeef00306000805b84811015610a2457309150600101611433565b6000611450610de4565b5065deadbeef00a3601081905260005b83811015610a8057600360028260066010a3600101611460565b6000611484610de4565b5065deadbeef000b60008315610a8057600101610abf565b60006114a6610de4565b5065deadbeef00476000805b84811015610a24574791506001016114b2565b60006114cf610de4565b5065deadbeef001c6000805b84811015610a24576001016114db565b60006114f5610de4565b5065deadbeef00356000805b84811015610a24576000359150600101611501565b6000611520610de4565b5065deadbeef005560005b83811015610a8057600082905560010161152b565b600061154a610de4565b5065deadbeef001860008315610a8057600101610abf565b600061156c610de4565b5065deadbeef000360008315610a8057600101610abf565b600061158e610de4565b5065deadbeef000760005b83811015610a805760001990910790600101611599565b60006115ba610de4565b5065deadbeef00a2601081905260005b83811015610a805760028160066010a26001016115ca565b60006115ec610de4565b5065deadbeef000a60005b83811015610a805760019182900a91016115f7565b6000611616610de4565b5065deadbeef00146000805b84811015610a2457600191508101611622565b600061163f610de4565b5065deadbeef004060006000194301815b85811015610cb65781409250600101611650565b606081516080146116875760405162461bcd60e51b81526004016111c290611ae9565b600660208301835160408482846000875af1806111e757600080fd5b60006116ad610de4565b5065deadbeef00156000805b84811015610a2457821591506001016116b9565b60006116d7610de4565b5065deadbeef00126000805b84811015610a245760018381129250016116e3565b6000611702610de4565b5065deadbeef003b600030815b85811015610cb657813b925060010161170f565b6000600360208301835160405160148183856000885af18061174457600080fd5b8151979650505050505050565b600061175b610de4565b5065deadbeef000960005b83811015610a8057600019600183099150600101611766565b8035611199565b60006020828403121561179b5761179b600080fd5b60006117a7848461177f565b949350505050565b805b82525050565b6020810161119982846117af565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715611801576118016117c5565b6040525050565b60006118176000604051905090565b905061182382826117db565b919050565b600067ffffffffffffffff821115611842576118426117c5565b601f19601f83011660200192915050565b82818337506000910152565b600061187261186d84611828565b611808565b90508281526020810184848401111561188d5761188d600080fd5b610f26848285611853565b600082601f8301126118ac576118ac600080fd5b81356117a784826020860161185f565b6000602082840312156118d1576118d1600080fd5b813567ffffffffffffffff8111156118eb576118eb600080fd5b6117a784828501611898565b60005b838110156119125780820151838201526020016118fa565b50506000910152565b600061192b826000815192915050565b8084526020840193506119428185602086016118f7565b601f01601f19169290920192915050565b60208082528101611964818461191b565b9392505050565b60006001600160a01b038216611199565b6117b18161196b565b60208101611199828461197c565b60008083601f8401126119a8576119a8600080fd5b50813567ffffffffffffffff8111156119c3576119c3600080fd5b6020830191508360018202830111156119de576119de600080fd5b9250929050565b600080602083850312156119fb576119fb600080fd5b823567ffffffffffffffff811115611a1557611a15600080fd5b611a2185828601611993565b92509250509250929050565b6bffffffffffffffffffffffff1981166117b1565b602081016111998284611a2d565b634e487b7160e01b600052602260045260246000fd5b600281046001821680611a7a57607f821691505b602082108103611a8c57611a8c611a50565b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561119957611199611a92565b6014815260006020820173092dcecc2d8d2c840d2dce0eae840d8cadccee8d60631b815291505b5060200190565b6020808252810161119981611abb565b601a81526000602082017f496e76616c696420696e7075742064617461206c656e6774682e00000000000081529150611ae2565b6020808252810161119981611af9565b634e487b7160e01b600052601260045260246000fd5b600082611b6257611b62611b3d565b500690565b6000611199611b738381565b90565b611b7f83611b67565b815460001960089490940293841b1916921b91909117905550565b6000611ba7818484611b76565b505050565b81811015611bc757611bbf600082611b9a565b600101611bac565b5050565b601f821115611ba757611be981600081815281906020902092915050565b6020601f85010481016020851015611bfe5750805b611c106020601f860104830182611bac565b5050505050565b8267ffffffffffffffff811115611c3057611c306117c5565b611c3a8254611a66565b611c45828285611bcb565b6000601f831160018114611c795760008415611c615750858201355b600019600886021c1981166002860217865550611cdf565b601f198416611c9386600081815281906020902092915050565b60005b82811015611cb65788850135825560209485019460019092019101611c96565b86831015611cd257600019601f88166008021c19858a01351682555b6001600288020188555050505b5050505050505056fea2646970667358221220a1e32bfe0f6f40313e4cc2d9327c0f056f456f06f4491c30cda9acec4dc522a164736f6c63430008170033 diff --git a/contracts/conformancetester/ConformanceTester.go b/bindings/tester/conformanceTester.go similarity index 74% rename from contracts/conformancetester/ConformanceTester.go rename to bindings/tester/conformanceTester.go index 4668a15a..53d58528 100644 --- a/contracts/conformancetester/ConformanceTester.go +++ b/bindings/tester/conformanceTester.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package conformancetester +package tester import ( "errors" @@ -32,7 +32,7 @@ var ( // ConformanceTesterMetaData contains all meta data concerning the ConformanceTester contract. var ConformanceTesterMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"RevertErrorMessage\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"testRevert\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x60806040523480156200001157600080fd5b5060405162000ad638038062000ad68339818101604052810190620000379190620001e3565b80600090816200004891906200047f565b505062000566565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000b9826200006e565b810181811067ffffffffffffffff82111715620000db57620000da6200007f565b5b80604052505050565b6000620000f062000050565b9050620000fe8282620000ae565b919050565b600067ffffffffffffffff8211156200012157620001206200007f565b5b6200012c826200006e565b9050602081019050919050565b60005b83811015620001595780820151818401526020810190506200013c565b60008484015250505050565b60006200017c620001768462000103565b620000e4565b9050828152602081018484840111156200019b576200019a62000069565b5b620001a884828562000139565b509392505050565b600082601f830112620001c857620001c762000064565b5b8151620001da84826020860162000165565b91505092915050565b600060208284031215620001fc57620001fb6200005a565b5b600082015167ffffffffffffffff8111156200021d576200021c6200005f565b5b6200022b84828501620001b0565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028757607f821691505b6020821081036200029d576200029c6200023f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002c8565b620003138683620002c8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003606200035a62000354846200032b565b62000335565b6200032b565b9050919050565b6000819050919050565b6200037c836200033f565b620003946200038b8262000367565b848454620002d5565b825550505050565b600090565b620003ab6200039c565b620003b881848462000371565b505050565b5b81811015620003e057620003d4600082620003a1565b600181019050620003be565b5050565b601f8211156200042f57620003f981620002a3565b6200040484620002b8565b8101602085101562000414578190505b6200042c6200042385620002b8565b830182620003bd565b50505b505050565b600082821c905092915050565b6000620004546000198460080262000434565b1980831691505092915050565b60006200046f838362000441565b9150826002028217905092915050565b6200048a8262000234565b67ffffffffffffffff811115620004a657620004a56200007f565b5b620004b282546200026e565b620004bf828285620003e4565b600060209050601f831160018114620004f75760008415620004e2578287015190505b620004ee858262000461565b8655506200055e565b601f1984166200050786620002a3565b60005b8281101562000531578489015182556001820191506020850194506020810190506200050a565b868310156200055157848901516200054d601f89168262000441565b8355505b6001600288020188555050505b505050505050565b61056080620005766000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806306fdde031461005c578063242e7fa11461007a57806327e235e314610098578063a26388bb146100c8578063b6b55f25146100d2575b600080fd5b6100646100ee565b6040516100719190610328565b60405180910390f35b61008261017c565b60405161008f9190610328565b60405180910390f35b6100b260048036038101906100ad91906103ad565b6101b5565b6040516100bf91906103f3565b60405180910390f35b6100d06101cd565b005b6100ec60048036038101906100e7919061043a565b61023f565b005b600080546100fb90610496565b80601f016020809104026020016040519081016040528092919081815260200182805461012790610496565b80156101745780601f1061014957610100808354040283529160200191610174565b820191906000526020600020905b81548152906001019060200180831161015757829003601f168201915b505050505081565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d6573736167650000000000000081525081565b60016020528060005260406000206000915090505481565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d657373616765000000000000008152506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102369190610328565b60405180910390fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461028e91906104f6565b9250508190555050565b600081519050919050565b600082825260208201905092915050565b60005b838110156102d25780820151818401526020810190506102b7565b60008484015250505050565b6000601f19601f8301169050919050565b60006102fa82610298565b61030481856102a3565b93506103148185602086016102b4565b61031d816102de565b840191505092915050565b6000602082019050818103600083015261034281846102ef565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061037a8261034f565b9050919050565b61038a8161036f565b811461039557600080fd5b50565b6000813590506103a781610381565b92915050565b6000602082840312156103c3576103c261034a565b5b60006103d184828501610398565b91505092915050565b6000819050919050565b6103ed816103da565b82525050565b600060208201905061040860008301846103e4565b92915050565b610417816103da565b811461042257600080fd5b50565b6000813590506104348161040e565b92915050565b6000602082840312156104505761044f61034a565b5b600061045e84828501610425565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806104ae57607f821691505b6020821081036104c1576104c0610467565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610501826103da565b915061050c836103da565b9250828201905080821115610524576105236104c7565b5b9291505056fea264697066735822122097c56af386cdc27f1819acc9acc5fd56d14a42aeb926a842f69be51b4dc250ad64736f6c63430008150033", + Bin: "0x608060405234801561001057600080fd5b506040516106ff3803806106ff83398101604081905261002f9161015b565b600061003b8282610281565b5050610344565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b038211171561007d5761007d610042565b6040525050565b600061008f60405190565b905061009b8282610058565b919050565b60006001600160401b038211156100b9576100b9610042565b601f19601f83011660200192915050565b60005b838110156100e55781810151838201526020016100cd565b50506000910152565b60006101016100fc846100a0565b610084565b90508281526020810184848401111561011c5761011c600080fd5b6101278482856100ca565b509392505050565b600082601f83011261014357610143600080fd5b81516101538482602086016100ee565b949350505050565b60006020828403121561017057610170600080fd5b81516001600160401b0381111561018957610189600080fd5b6101538482850161012f565b634e487b7160e01b600052602260045260246000fd5b6002810460018216806101bf57607f821691505b6020821081036101d1576101d1610195565b50919050565b60006101e66101e38381565b90565b92915050565b6101f5836101d7565b815460001960089490940293841b1916921b91909117905550565b600061021d8184846101ec565b505050565b8181101561023d57610235600082610210565b600101610222565b5050565b601f82111561021d576000818152602090206020601f850104810160208510156102685750805b61027a6020601f860104830182610222565b5050505050565b81516001600160401b0381111561029a5761029a610042565b6102a482546101ab565b6102af828285610241565b6020601f8311600181146102e357600084156102cb5750858201515b600019600886021c198116600286021786555061033c565b600085815260208120601f198616915b8281101561031357888501518255602094850194600190920191016102f3565b8683101561032f5784890151600019601f89166008021c191682555b6001600288020188555050505b505050505050565b6103ac806103536000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806306fdde031461005c578063242e7fa11461007a57806327e235e3146100b2578063a26388bb146100df578063b6b55f25146100e9575b600080fd5b6100646100fc565b6040516100719190610257565b60405180910390f35b610064604051806040016040528060198152602001785465737420526576657274204572726f72204d65737361676560381b81525081565b6100d26100c03660046102a4565b60016020526000908152604090205481565b60405161007191906102cd565b6100e761018a565b005b6100e76100f73660046102ea565b6101da565b6000805461010990610321565b80601f016020809104026020016040519081016040528092919081815260200182805461013590610321565b80156101825780601f1061015757610100808354040283529160200191610182565b820191906000526020600020905b81548152906001019060200180831161016557829003601f168201915b505050505081565b60408051808201825260198152785465737420526576657274204572726f72204d65737361676560381b6020820152905162461bcd60e51b81526101d19190600401610257565b60405180910390fd5b33600090815260016020526040812080548392906101f9908490610363565b909155505050565b60005b8381101561021c578181015183820152602001610204565b50506000910152565b600061022f825190565b808452602084019350610246818560208601610201565b601f01601f19169290920192915050565b602080825281016102688184610225565b9392505050565b60006001600160a01b0382165b92915050565b61028b8161026f565b811461029657600080fd5b50565b803561027c81610282565b6000602082840312156102b9576102b9600080fd5b60006102c58484610299565b949350505050565b8181526020810161027c565b8061028b565b803561027c816102d9565b6000602082840312156102ff576102ff600080fd5b60006102c584846102df565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061033557607f821691505b6020821081036103475761034761030b565b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561027c5761027c61034d56fea2646970667358221220cb58571a678e4a04b84ef57d328d854bedb20916a4a95a84ccc3bae10d9cc02e64736f6c63430008170033", } // ConformanceTesterABI is the input ABI used to generate the binding from. diff --git a/contracts/contracts.go b/bindings/tester/helper.go similarity index 94% rename from contracts/contracts.go rename to bindings/tester/helper.go index d6162d63..334c8c2c 100644 --- a/contracts/contracts.go +++ b/bindings/tester/helper.go @@ -1,4 +1,4 @@ -package contracts +package tester import ( "context" @@ -13,7 +13,6 @@ import ( ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" - "github.com/maticnetwork/polygon-cli/contracts/conformancetester" "github.com/rs/zerolog/log" "github.com/cenkalti/backoff/v4" @@ -26,10 +25,10 @@ import ( // From within `polygon-cli/contracts/loadtester` directory: // ~/code/go-ethereum/build/bin/abigen --abi LoadTester.abi --pkg contracts --type LoadTester --bin LoadTester.bin --out ../loadtester.go -//go:embed loadtester/LoadTester.bin +//go:embed LoadTester.bin var RawLoadTesterBin string -//go:embed loadtester/LoadTester.abi +//go:embed LoadTester.abi var RawLoadTesterABI string var randSrc *rand.Rand @@ -38,21 +37,25 @@ func GetLoadTesterBytes() ([]byte, error) { return hex.DecodeString(RawLoadTesterBin) } +// BlockUntilSuccessfulFn is designed to wait until a specified number of Ethereum blocks have been +// mined, periodically checking for the completion of a given function within each block interval. +type BlockUntilSuccessfulFn func(ctx context.Context, c *ethclient.Client, f func() error) error + func BlockUntilSuccessful(ctx context.Context, c *ethclient.Client, retryable func() error) error { // this function use to be very complicated (and not work). I'm dumbing this down to a basic time based retryable which should work 99% of the time b := backoff.WithContext(backoff.WithMaxRetries(backoff.NewConstantBackOff(5*time.Second), 24), ctx) return backoff.Retry(retryable, b) } -func DeployConformanceContract(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts) (conformanceContractAddr ethcommon.Address, conformanceContract *conformancetester.ConformanceTester, err error) { - conformanceContractAddr, _, _, err = conformancetester.DeployConformanceTester(tops, c, "ConformanceTesterContractName") +func DeployConformanceContract(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts) (conformanceContractAddr ethcommon.Address, conformanceContract *ConformanceTester, err error) { + conformanceContractAddr, _, _, err = DeployConformanceTester(tops, c, "ConformanceTesterContractName") if err != nil { log.Error().Err(err).Msg("Unable to deploy ConformanceTester contract") return } log.Info().Interface("conformanceContractAddr", conformanceContractAddr).Msg("Conformance contract deployed") - conformanceContract, err = conformancetester.NewConformanceTester(conformanceContractAddr, c) + conformanceContract, err = NewConformanceTester(conformanceContractAddr, c) if err != nil { log.Error().Err(err).Msg("Unable to instantiate new conformance contract") return diff --git a/contracts/loadtester.go b/bindings/tester/loadTester.go similarity index 80% rename from contracts/loadtester.go rename to bindings/tester/loadTester.go index f1bb37ad..f7346020 100644 --- a/contracts/loadtester.go +++ b/bindings/tester/loadTester.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package contracts +package tester import ( "errors" @@ -32,7 +32,7 @@ var ( // LoadTesterMetaData contains all meta data concerning the LoadTester contract. var LoadTesterMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"dumpster\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCallCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inc\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"loopBlockHashUntilLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"loopUntilLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"trash\",\"type\":\"bytes\"}],\"name\":\"store\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testADD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testADDMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testADDRESS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testAND\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBALANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBASEFEE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBLOCKHASH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testBYTE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testBlake2f\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLDATACOPY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLDATALOAD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLDATASIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCALLVALUE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCHAINID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCODECOPY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testCOINBASE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testDIFFICULTY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testDIV\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECAdd\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECMul\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECPairing\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testECRecover\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"result\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testEQ\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testEXP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testEXTCODESIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGASLIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGASPRICE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testGT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testISZERO\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testIdentity\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG0\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG1\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG2\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG3\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLOG4\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testLT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMLOAD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMSIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMSTORE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMSTORE8\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMUL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testMULMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testModExp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testNOT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testNUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testORIGIN\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testRETURNDATACOPY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testRETURNDATASIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testRipemd160\",\"outputs\":[{\"internalType\":\"bytes20\",\"name\":\"result\",\"type\":\"bytes20\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSAR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSDIV\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSELFBALANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSGT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"inputData\",\"type\":\"bytes\"}],\"name\":\"testSHA256\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"result\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSHA3\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSHL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSHR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSIGNEXTEND\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSLOAD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSLT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSMOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSSTORE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testSUB\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testTIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"testXOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b50612ef4806100206000396000f3fe608060405234801561001057600080fd5b50600436106104545760003560e01c806380947f8011610241578063bf529ca11161013b578063dd9bef60116100c3578063f279ca8111610087578063f279ca8114611161578063f4d1fc6114611191578063f58fc36a146111c1578063f6b0bbf7146111f1578063fde7721c1461122157610454565b8063dd9bef6014611071578063de97a363146110a1578063e9f9b3f2146110d1578063ea5141e614611101578063edf003cf1461113157610454565b8063ce3cf4ef1161010a578063ce3cf4ef14610f81578063d117320b14610fb1578063d51e7b5b14610fe1578063d53ff3fd14611011578063d93cd5581461104157610454565b8063bf529ca114610ec1578063c360aba614610ef1578063c420eb6114610f21578063c4bd65d514610f5157610454565b8063a18683cb116101c9578063b374012b1161018d578063b374012b14610dd1578063b3d847f214610e01578063b7b8620714610e31578063b81c148414610e61578063bdc875fc14610e9157610454565b8063a18683cb14610cf3578063a271b72114610d23578063a60a108714610d41578063a645c9c214610d71578063acaebdf614610da157610454565b8063962e4dc211610210578063962e4dc214610c0357806398456f3e14610c335780639a2b7c8114610c635780639cce7cf914610c93578063a040aec614610cc357610454565b806380947f8014610b43578063880eff3914610b73578063918a5fcd14610ba357806391e7b27714610bd357610454565b80633430ec061161035257806360e13cde116102da5780636f099c8d1161029e5780636f099c8d14610a5357806371d91d2814610a835780637b6e0b0e14610ab35780637c191d2014610ae35780637de8c6f814610b1357610454565b806360e13cde14610975578063613d0a82146109a557806363138d4f146109d5578063659bbb4f14610a055780636e7f1fe714610a2357610454565b806340fe26621161032157806340fe26621461088557806344cf3bc7146108b55780634a61af1f146108e55780634d2c74b3146109155780635590c2d91461094557610454565b80633430ec06146107d7578063371303c0146108075780633a411f12146108255780633a425dfc1461085557610454565b806318093b46116103e0578063219cddeb116103a4578063219cddeb146106e75780632294fc7f146107175780632871ef85146107475780632b21ef44146107775780632d34e798146107a757610454565b806318093b46146105f757806319b621d6146106275780631aba07ea146106575780631de2f343146106875780632007332e146106b757610454565b80630ba8a73b116104275780630ba8a73b146105195780631287a68c14610549578063135d52f7146105675780631581cf191461059757806316582150146105c757610454565b8063034aef7114610459578063050082f814610489578063087b4e84146104b95780630b3b996a146104e9575b600080fd5b610473600480360381019061046e9190612611565b611251565b604051610480919061264d565b60405180910390f35b6104a3600480360381019061049e9190612611565b61128c565b6040516104b0919061264d565b60405180910390f35b6104d360048036038101906104ce9190612611565b6112c7565b6040516104e0919061264d565b60405180910390f35b61050360048036038101906104fe91906127ae565b611301565b6040516105109190612876565b60405180910390f35b610533600480360381019061052e9190612611565b611328565b604051610540919061264d565b60405180910390f35b610551611364565b60405161055e919061264d565b60405180910390f35b610581600480360381019061057c9190612611565b61136d565b60405161058e919061264d565b60405180910390f35b6105b160048036038101906105ac9190612611565b6113a9565b6040516105be919061264d565b60405180910390f35b6105e160048036038101906105dc9190612611565b6113e4565b6040516105ee919061264d565b60405180910390f35b610611600480360381019061060c9190612611565b61143f565b60405161061e919061264d565b60405180910390f35b610641600480360381019061063c9190612611565b61147d565b60405161064e919061264d565b60405180910390f35b610671600480360381019061066c9190612611565b61150c565b60405161067e919061264d565b60405180910390f35b6106a1600480360381019061069c9190612611565b611552565b6040516106ae919061264d565b60405180910390f35b6106d160048036038101906106cc9190612611565b611590565b6040516106de919061264d565b60405180910390f35b61070160048036038101906106fc9190612611565b6115cc565b60405161070e919061264d565b60405180910390f35b610731600480360381019061072c9190612611565b611607565b60405161073e919061264d565b60405180910390f35b610761600480360381019061075c9190612611565b611646565b60405161076e919061264d565b60405180910390f35b610791600480360381019061078c9190612611565b611681565b60405161079e919061264d565b60405180910390f35b6107c160048036038101906107bc9190612611565b6116bc565b6040516107ce919061264d565b60405180910390f35b6107f160048036038101906107ec9190612611565b6116f7565b6040516107fe9190612876565b60405180910390f35b61080f6117a3565b60405161081c919061264d565b60405180910390f35b61083f600480360381019061083a9190612611565b6117c2565b60405161084c919061264d565b60405180910390f35b61086f600480360381019061086a9190612611565b6117fe565b60405161087c919061264d565b60405180910390f35b61089f600480360381019061089a9190612611565b61183a565b6040516108ac919061264d565b60405180910390f35b6108cf60048036038101906108ca9190612611565b611879565b6040516108dc919061264d565b60405180910390f35b6108ff60048036038101906108fa9190612611565b6118b4565b60405161090c919061264d565b60405180910390f35b61092f600480360381019061092a9190612611565b6118f2565b60405161093c919061264d565b60405180910390f35b61095f600480360381019061095a9190612611565b61192d565b60405161096c919061264d565b60405180910390f35b61098f600480360381019061098a9190612611565b611972565b60405161099c919061264d565b60405180910390f35b6109bf60048036038101906109ba91906127ae565b6119ae565b6040516109cc9190612876565b60405180910390f35b6109ef60048036038101906109ea91906127ae565b6119e0565b6040516109fc91906128b1565b60405180910390f35b610a0d611a0c565b604051610a1a919061264d565b60405180910390f35b610a3d6004803603810190610a389190612611565b611a48565b604051610a4a919061264d565b60405180910390f35b610a6d6004803603810190610a689190612611565b611a86565b604051610a7a919061264d565b60405180910390f35b610a9d6004803603810190610a989190612611565b611ac1565b604051610aaa919061264d565b60405180910390f35b610acd6004803603810190610ac89190612611565b611aff565b604051610ada919061264d565b60405180910390f35b610afd6004803603810190610af89190612611565b611b3b565b604051610b0a919061264d565b60405180910390f35b610b2d6004803603810190610b289190612611565b611b76565b604051610b3a919061264d565b60405180910390f35b610b5d6004803603810190610b589190612611565b611bb2565b604051610b6a919061264d565b60405180910390f35b610b8d6004803603810190610b889190612611565b611c0f565b604051610b9a919061264d565b60405180910390f35b610bbd6004803603810190610bb89190612611565b611c4e565b604051610bca919061264d565b60405180910390f35b610bed6004803603810190610be89190612611565b611c89565b604051610bfa919061264d565b60405180910390f35b610c1d6004803603810190610c1891906127ae565b611cd5565b604051610c2a9190612876565b60405180910390f35b610c4d6004803603810190610c489190612611565b611d43565b604051610c5a919061264d565b60405180910390f35b610c7d6004803603810190610c789190612611565b611d83565b604051610c8a919061264d565b60405180910390f35b610cad6004803603810190610ca891906127ae565b611dbe565b604051610cba9190612876565b60405180910390f35b610cdd6004803603810190610cd891906127ae565b611def565b604051610cea9190612876565b60405180910390f35b610d0d6004803603810190610d0891906127ae565b611e16565b604051610d1a919061290d565b60405180910390f35b610d2b611e98565b604051610d38919061264d565b60405180910390f35b610d5b6004803603810190610d569190612611565b611ee3565b604051610d68919061264d565b60405180910390f35b610d8b6004803603810190610d869190612611565b611f1e565b604051610d98919061264d565b60405180910390f35b610dbb6004803603810190610db69190612611565b611f5a565b604051610dc8919061264d565b60405180910390f35b610deb6004803603810190610de69190612988565b611f96565b604051610df8919061264d565b60405180910390f35b610e1b6004803603810190610e169190612611565b611fe4565b604051610e28919061264d565b60405180910390f35b610e4b6004803603810190610e469190612611565b61201f565b604051610e58919061264d565b60405180910390f35b610e7b6004803603810190610e769190612611565b61205a565b604051610e88919061264d565b60405180910390f35b610eab6004803603810190610ea69190612611565b612095565b604051610eb8919061264d565b60405180910390f35b610edb6004803603810190610ed69190612611565b6120d0565b604051610ee8919061264d565b60405180910390f35b610f0b6004803603810190610f069190612611565b612114565b604051610f18919061264d565b60405180910390f35b610f3b6004803603810190610f369190612611565b612150565b604051610f48919061264d565b60405180910390f35b610f6b6004803603810190610f669190612611565b61218b565b604051610f78919061264d565b60405180910390f35b610f9b6004803603810190610f969190612611565b6121c9565b604051610fa8919061264d565b60405180910390f35b610fcb6004803603810190610fc69190612611565b612206565b604051610fd8919061264d565b60405180910390f35b610ffb6004803603810190610ff69190612611565b612240565b604051611008919061264d565b60405180910390f35b61102b60048036038101906110269190612611565b61227c565b604051611038919061264d565b60405180910390f35b61105b60048036038101906110569190612611565b6122b8565b604051611068919061264d565b60405180910390f35b61108b60048036038101906110869190612611565b612313565b604051611098919061264d565b60405180910390f35b6110bb60048036038101906110b69190612611565b612355565b6040516110c8919061264d565b60405180910390f35b6110eb60048036038101906110e69190612611565b612391565b6040516110f8919061264d565b60405180910390f35b61111b60048036038101906111169190612611565b6123ce565b604051611128919061264d565b60405180910390f35b61114b600480360381019061114691906127ae565b612410565b6040516111589190612876565b60405180910390f35b61117b60048036038101906111769190612611565b61247f565b604051611188919061264d565b60405180910390f35b6111ab60048036038101906111a69190612611565b6124bb565b6040516111b8919061264d565b60405180910390f35b6111db60048036038101906111d69190612611565b6124f9565b6040516111e8919061264d565b60405180910390f35b61120b600480360381019061120691906127ae565b612538565b6040516112189190612a10565b60405180910390f35b61123b60048036038101906112369190612611565b61256a565b604051611248919061264d565b60405180910390f35b600061125b6117a3565b50600065deadbeef003690506000805b848110156112815736915060018101905061126b565b505080915050919050565b60006112966117a3565b50600065deadbeef003290506000805b848110156112bc573291506001810190506112a6565b505080915050919050565b60006112d16117a3565b50600065deadbeef0052905060005b838110156112f757816000526001810190506112e0565b5080915050919050565b60606000600890506040828451602086016000855af18061132157600080fd5b5050919050565b60006113326117a3565b50600065deadbeef0001905060005b8381101561135a57600082019150600181019050611341565b5080915050919050565b60008054905090565b60006113776117a3565b50600065deadbeef0017905060005b8381101561139f57600082179150600181019050611386565b5080915050919050565b60006113b36117a3565b50600065deadbeef003490506000805b848110156113d9573491506001810190506113c3565b505080915050919050565b60006113ee6117a3565b50600065deadbeef0006905060005b83811015611435577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820691506001810190506113fd565b5080915050919050565b60006114496117a3565b50600065deadbeef001390506000805b8481101561147257600183139150600181019050611459565b505080915050919050565b60006114876117a3565b50600065deadbeef002090507fffffffff000000000000000000000000000000000000000000000000000000006000526000805b848110156114d557600460002091506001810190506114bb565b507f29045a592007d0c246ef02c2223570da9522d0cf0f73282c79a1bc8f0bb2c238811461150257600091505b5080915050919050565b60006115166117a3565b50600065deadbeef00a490508060105260005b83811015611548576004600360028360066010a4600181019050611529565b5080915050919050565b600061155c6117a3565b50600065deadbeef001a90506000805b84811015611585578260001a915060018101905061156c565b505080915050919050565b600061159a6117a3565b50600065deadbeef001b905060005b838110156115c2578160001b91506001810190506115a9565b5080915050919050565b60006115d66117a3565b50600065deadbeef004290506000805b848110156115fc574291506001810190506115e6565b505080915050919050565b60006116116117a3565b50600065deadbeef0031905060003060005b8581101561163a5781319250600181019050611623565b50505080915050919050565b60006116506117a3565b50600065deadbeef004890506000805b8481101561167657489150600181019050611660565b505080915050919050565b600061168b6117a3565b50600065deadbeef003d90506000805b848110156116b1573d915060018101905061169b565b505080915050919050565b60006116c66117a3565b50600065deadbeef004390506000805b848110156116ec574391506001810190506116d6565b505080915050919050565b6002818154811061170757600080fd5b90600052602060002001600091509050805461172290612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461174e90612a5a565b801561179b5780601f106117705761010080835404028352916020019161179b565b820191906000526020600020905b81548152906001019060200180831161177e57829003601f168201915b505050505081565b600060016000546117b49190612aba565b600081905550600054905090565b60006117cc6117a3565b50600065deadbeef0004905060005b838110156117f4576001820491506001810190506117db565b5080915050919050565b60006118086117a3565b50600065deadbeef0037905060005b8381101561183057602060008037600181019050611817565b5080915050919050565b60006118446117a3565b50600065deadbeef00a090508060105260005b8381101561186f5760066010a0600181019050611857565b5080915050919050565b60006118836117a3565b50600065deadbeef003390506000805b848110156118a957339150600181019050611893565b505080915050919050565b60006118be6117a3565b50600065deadbeef0053905060005b838110156118e85763deadbeef6000526001810190506118cd565b5080915050919050565b60006118fc6117a3565b50600065deadbeef003a90506000805b84811015611922573a915060018101905061190c565b505080915050919050565b60006119376117a3565b50600065deadbeef0051905060008160005260005b8481101561196457600051915060018101905061194c565b508091505080915050919050565b600061197c6117a3565b50600065deadbeef001d905060005b838110156119a4578160001d915060018101905061198b565b5080915050919050565b606060006005905060208301835160405160208183856000885af1806119d357600080fd5b8195505050505050919050565b600080600290506020830183518360208183856000885af180611a0257600080fd5b5050505050919050565b6000611a166117a3565b505b6103e85a1115611a40576001806000828254611a349190612aba565b92505081905550611a18565b600154905090565b6000611a526117a3565b50600065deadbeef001090506000805b84811015611a7b57826001109150600181019050611a62565b505080915050919050565b6000611a906117a3565b50600065deadbeef004490506000805b84811015611ab657449150600181019050611aa0565b505080915050919050565b6000611acb6117a3565b50600065deadbeef001190506000805b84811015611af457600183119150600181019050611adb565b505080915050919050565b6000611b096117a3565b50600065deadbeef003e905060005b83811015611b315760206000803e600181019050611b18565b5080915050919050565b6000611b456117a3565b50600065deadbeef004590506000805b84811015611b6b57459150600181019050611b55565b505080915050919050565b6000611b806117a3565b50600065deadbeef0002905060005b83811015611ba857600182029150600181019050611b8f565b5080915050919050565b6000611bbc6117a3565b50600065deadbeef0008905060005b83811015611c05577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600083089150600181019050611bcb565b5080915050919050565b6000611c196117a3565b50600065deadbeef005490508060005560005b83811015611c44576000549150600181019050611c2c565b5080915050919050565b6000611c586117a3565b50600065deadbeef005a90506000805b84811015611c7e575a9150600181019050611c68565b505080915050919050565b6000611c936117a3565b50600065deadbeef0019905060005b83811015611cb95781199150600181019050611ca2565b5065deadbeef00198114611ccc57801990505b80915050919050565b606080825114611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1190612b4b565b60405180910390fd5b60006007905060208301835160408482846000875af180611d3a57600080fd5b50505050919050565b6000611d4d6117a3565b50600065deadbeef00a190508060105260005b83811015611d79578060066010a1600181019050611d60565b5080915050919050565b6000611d8d6117a3565b50600065deadbeef0016905060005b83811015611db4578182169150600181019050611d9c565b5080915050919050565b6060600060049050602083018351604051818183856000885af180611de257600080fd5b8195505050505050919050565b60606000600890506040828451602086016000855af180611e0f57600080fd5b5050919050565b60006080825114611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5390612bb7565b60405180910390fd5b600060019050602083016020810151601f1a602082015260206040516080836000865af180611e8a57600080fd5b604051519350505050919050565b6000611ea26117a3565b505b6103e85a1115611edb576001806000828254611ec09190612aba565b9250508190555043600154611ed59190612c06565b50611ea4565b600154905090565b6000611eed6117a3565b50600065deadbeef004690506000805b84811015611f1357469150600181019050611efd565b505080915050919050565b6000611f286117a3565b50600065deadbeef0005905060005b83811015611f5057600182059150600181019050611f37565b5080915050919050565b6000611f646117a3565b50600065deadbeef0039905060005b83811015611f8c57602060008039600181019050611f73565b5080915050919050565b60006002838390918060018154018082558091505060019003906000526020600020016000909192909192909192909192509182611fd5929190612dee565b50600280549050905092915050565b6000611fee6117a3565b50600065deadbeef005990506000805b8481101561201457599150600181019050611ffe565b505080915050919050565b60006120296117a3565b50600065deadbeef003890506000805b8481101561204f57389150600181019050612039565b505080915050919050565b60006120646117a3565b50600065deadbeef004190506000805b8481101561208a57419150600181019050612074565b505080915050919050565b600061209f6117a3565b50600065deadbeef003090506000805b848110156120c5573091506001810190506120af565b505080915050919050565b60006120da6117a3565b50600065deadbeef00a390508060105260005b8381101561210a57600360028260066010a36001810190506120ed565b5080915050919050565b600061211e6117a3565b50600065deadbeef000b905060005b83811015612146578160200b915060018101905061212d565b5080915050919050565b600061215a6117a3565b50600065deadbeef004790506000805b848110156121805747915060018101905061216a565b505080915050919050565b60006121956117a3565b50600065deadbeef001c90506000805b848110156121be578260001c92506001810190506121a5565b505080915050919050565b60006121d36117a3565b50600065deadbeef003590506000805b848110156121fb5760003591506001810190506121e3565b505080915050919050565b60006122106117a3565b50600065deadbeef0055905060005b83811015612236578160005560018101905061221f565b5080915050919050565b600061224a6117a3565b50600065deadbeef0018905060005b8381101561227257600082189150600181019050612259565b5080915050919050565b60006122866117a3565b50600065deadbeef0003905060005b838110156122ae57600082039150600181019050612295565b5080915050919050565b60006122c26117a3565b50600065deadbeef0007905060005b83811015612309577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820791506001810190506122d1565b5080915050919050565b600061231d6117a3565b50600065deadbeef00a290508060105260005b8381101561234b5760028160066010a2600181019050612330565b5080915050919050565b600061235f6117a3565b50600065deadbeef000a905060005b83811015612387576001820a915060018101905061236e565b5080915050919050565b600061239b6117a3565b50600065deadbeef001490506000805b848110156123c35782831491506001810190506123ab565b505080915050919050565b60006123d86117a3565b50600065deadbeef0040905060006001430360005b8581101561240457814092506001810190506123ed565b50505080915050919050565b60606080825114612456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244d90612b4b565b60405180910390fd5b60006006905060208301835160408482846000875af18061247657600080fd5b50505050919050565b60006124896117a3565b50600065deadbeef001590506000805b848110156124b05782159150600181019050612499565b505080915050919050565b60006124c56117a3565b50600065deadbeef001290506000805b848110156124ee578260011291506001810190506124d5565b505080915050919050565b60006125036117a3565b50600065deadbeef003b905060003060005b8581101561252c57813b9250600181019050612515565b50505080915050919050565b6000806003905060208301835160405160148183856000885af18061255c57600080fd5b815195505050505050919050565b60006125746117a3565b50600065deadbeef0009905060005b838110156125bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600183099150600181019050612583565b5080915050919050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6125ee816125db565b81146125f957600080fd5b50565b60008135905061260b816125e5565b92915050565b600060208284031215612627576126266125d1565b5b6000612635848285016125fc565b91505092915050565b612647816125db565b82525050565b6000602082019050612662600083018461263e565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126bb82612672565b810181811067ffffffffffffffff821117156126da576126d9612683565b5b80604052505050565b60006126ed6125c7565b90506126f982826126b2565b919050565b600067ffffffffffffffff82111561271957612718612683565b5b61272282612672565b9050602081019050919050565b82818337600083830152505050565b600061275161274c846126fe565b6126e3565b90508281526020810184848401111561276d5761276c61266d565b5b61277884828561272f565b509392505050565b600082601f83011261279557612794612668565b5b81356127a584826020860161273e565b91505092915050565b6000602082840312156127c4576127c36125d1565b5b600082013567ffffffffffffffff8111156127e2576127e16125d6565b5b6127ee84828501612780565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612831578082015181840152602081019050612816565b60008484015250505050565b6000612848826127f7565b6128528185612802565b9350612862818560208601612813565b61286b81612672565b840191505092915050565b60006020820190508181036000830152612890818461283d565b905092915050565b6000819050919050565b6128ab81612898565b82525050565b60006020820190506128c660008301846128a2565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128f7826128cc565b9050919050565b612907816128ec565b82525050565b600060208201905061292260008301846128fe565b92915050565b600080fd5b600080fd5b60008083601f84011261294857612947612668565b5b8235905067ffffffffffffffff81111561296557612964612928565b5b6020830191508360018202830111156129815761298061292d565b5b9250929050565b6000806020838503121561299f5761299e6125d1565b5b600083013567ffffffffffffffff8111156129bd576129bc6125d6565b5b6129c985828601612932565b92509250509250929050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b612a0a816129d5565b82525050565b6000602082019050612a256000830184612a01565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a7257607f821691505b602082108103612a8557612a84612a2b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ac5826125db565b9150612ad0836125db565b9250828201905080821115612ae857612ae7612a8b565b5b92915050565b600082825260208201905092915050565b7f496e76616c696420696e707574206c656e677468000000000000000000000000600082015250565b6000612b35601483612aee565b9150612b4082612aff565b602082019050919050565b60006020820190508181036000830152612b6481612b28565b9050919050565b7f496e76616c696420696e7075742064617461206c656e6774682e000000000000600082015250565b6000612ba1601a83612aee565b9150612bac82612b6b565b602082019050919050565b60006020820190508181036000830152612bd081612b94565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c11826125db565b9150612c1c836125db565b925082612c2c57612c2b612bd7565b5b828206905092915050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ca47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612c67565b612cae8683612c67565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612ceb612ce6612ce1846125db565b612cc6565b6125db565b9050919050565b6000819050919050565b612d0583612cd0565b612d19612d1182612cf2565b848454612c74565b825550505050565b600090565b612d2e612d21565b612d39818484612cfc565b505050565b5b81811015612d5d57612d52600082612d26565b600181019050612d3f565b5050565b601f821115612da257612d7381612c42565b612d7c84612c57565b81016020851015612d8b578190505b612d9f612d9785612c57565b830182612d3e565b50505b505050565b600082821c905092915050565b6000612dc560001984600802612da7565b1980831691505092915050565b6000612dde8383612db4565b9150826002028217905092915050565b612df88383612c37565b67ffffffffffffffff811115612e1157612e10612683565b5b612e1b8254612a5a565b612e26828285612d61565b6000601f831160018114612e555760008415612e43578287013590505b612e4d8582612dd2565b865550612eb5565b601f198416612e6386612c42565b60005b82811015612e8b57848901358255600182019150602085019450602081019050612e66565b86831015612ea85784890135612ea4601f891682612db4565b8355505b6001600288020188555050505b5050505050505056fea26469706673582212208612dc3a454553c8629c7050845d284621be46a91a361388814c0ca053f9dca464736f6c63430008150033", + Bin: "0x608060405234801561001057600080fd5b50611d1e806100206000396000f3fe608060405234801561001057600080fd5b50600436106104545760003560e01c806380947f8011610241578063bf529ca11161013b578063dd9bef60116100c3578063f279ca8111610087578063f279ca811461098f578063f4d1fc61146109a2578063f58fc36a146109b5578063f6b0bbf7146109c8578063fde7721c146109e857600080fd5b8063dd9bef6014610930578063de97a36314610943578063e9f9b3f214610956578063ea5141e614610969578063edf003cf1461097c57600080fd5b8063ce3cf4ef1161010a578063ce3cf4ef146108d1578063d117320b146108e4578063d51e7b5b146108f7578063d53ff3fd1461090a578063d93cd5581461091d57600080fd5b8063bf529ca114610885578063c360aba614610898578063c420eb61146108ab578063c4bd65d5146108be57600080fd5b8063a18683cb116101c9578063b374012b1161018d578063b374012b14610826578063b3d847f214610839578063b7b862071461084c578063b81c14841461085f578063bdc875fc1461087257600080fd5b8063a18683cb146107c5578063a271b721146107e5578063a60a1087146107ed578063a645c9c214610800578063acaebdf61461081357600080fd5b8063962e4dc211610210578063962e4dc21461077957806398456f3e1461078c5780639a2b7c811461079f5780639cce7cf9146107b2578063a040aec6146104a857600080fd5b806380947f801461072d578063880eff3914610740578063918a5fcd1461075357806391e7b2771461076657600080fd5b80633430ec061161035257806360e13cde116102da5780636f099c8d1161029e5780636f099c8d146106ce57806371d91d28146106e15780637b6e0b0e146106f45780637c191d20146107075780637de8c6f81461071a57600080fd5b806360e13cde1461067a578063613d0a821461068d57806363138d4f146106a0578063659bbb4f146106b35780636e7f1fe7146106bb57600080fd5b806340fe26621161032157806340fe26621461061b57806344cf3bc71461062e5780634a61af1f146106415780634d2c74b3146106545780635590c2d91461066757600080fd5b80633430ec06146105da578063371303c0146105ed5780633a411f12146105f55780633a425dfc1461060857600080fd5b806318093b46116103e0578063219cddeb116103a4578063219cddeb1461057b5780632294fc7f1461058e5780632871ef85146105a15780632b21ef44146105b45780632d34e798146105c757600080fd5b806318093b461461051c57806319b621d61461052f5780631aba07ea146105425780631de2f343146105555780632007332e1461056857600080fd5b80630ba8a73b116104275780630ba8a73b146104c85780631287a68c146104db578063135d52f7146104e35780631581cf19146104f6578063165821501461050957600080fd5b8063034aef7114610459578063050082f814610482578063087b4e84146104955780630b3b996a146104a8575b600080fd5b61046c610467366004611786565b6109fb565b60405161047991906117b7565b60405180910390f35b61046c610490366004611786565b610a2d565b61046c6104a3366004611786565b610a56565b6104bb6104b63660046118bc565b610a87565b6040516104799190611953565b61046c6104d6366004611786565b610aaa565b60005461046c565b61046c6104f1366004611786565b610acf565b61046c610504366004611786565b610af1565b61046c610517366004611786565b610b1a565b61046c61052a366004611786565b610b46565b61046c61053d366004611786565b610b71565b61046c610550366004611786565b610bdd565b61046c610563366004611786565b610c13565b61046c610576366004611786565b610c40565b61046c610589366004611786565b610c62565b61046c61059c366004611786565b610c8b565b61046c6105af366004611786565b610cc0565b61046c6105c2366004611786565b610ce9565b61046c6105d5366004611786565b610d12565b6104bb6105e8366004611786565b610d3b565b61046c610de4565b61046c610603366004611786565b610dfd565b61046c610616366004611786565b610e1f565b61046c610629366004611786565b610e4a565b61046c61063c366004611786565b610e79565b61046c61064f366004611786565b610ea2565b61046c610662366004611786565b610ecf565b61046c610675366004611786565b610ef8565b61046c610688366004611786565b610f2e565b6104bb61069b3660046118bc565b610f5a565b61046c6106ae3660046118bc565b610f85565b61046c610fae565b61046c6106c9366004611786565b610fe8565b61046c6106dc366004611786565b611013565b61046c6106ef366004611786565b61103c565b61046c610702366004611786565b611067565b61046c610715366004611786565b611092565b61046c610728366004611786565b6110bb565b61046c61073b366004611786565b6110dd565b61046c61074e366004611786565b61110b565b61046c610761366004611786565b611138565b61046c610774366004611786565b611161565b6104bb6107873660046118bc565b61119f565b61046c61079a366004611786565b6111f0565b61046c6107ad366004611786565b611220565b6104bb6107c03660046118bc565b611242565b6107d86107d33660046118bc565b611262565b6040516104799190611985565b61046c6112bc565b61046c6107fb366004611786565b6112fd565b61046c61080e366004611786565b611326565b61046c610821366004611786565b611348565b61046c6108343660046119e5565b611373565b61046c610847366004611786565b6113a2565b61046c61085a366004611786565b6113cb565b61046c61086d366004611786565b6113f4565b61046c610880366004611786565b61141d565b61046c610893366004611786565b611446565b61046c6108a6366004611786565b61147a565b61046c6108b9366004611786565b61149c565b61046c6108cc366004611786565b6114c5565b61046c6108df366004611786565b6114eb565b61046c6108f2366004611786565b611516565b61046c610905366004611786565b611540565b61046c610918366004611786565b611562565b61046c61092b366004611786565b611584565b61046c61093e366004611786565b6115b0565b61046c610951366004611786565b6115e2565b61046c610964366004611786565b61160c565b61046c610977366004611786565b611635565b6104bb61098a3660046118bc565b611664565b61046c61099d366004611786565b6116a3565b61046c6109b0366004611786565b6116cd565b61046c6109c3366004611786565b6116f8565b6109db6109d63660046118bc565b611723565b6040516104799190611a42565b61046c6109f6366004611786565b611751565b6000610a05610de4565b5065deadbeef00366000805b84811015610a2457369150600101610a11565b50909392505050565b6000610a37610de4565b5065deadbeef00326000805b84811015610a2457329150600101610a43565b6000610a60610de4565b5065deadbeef005260005b83811015610a80576000829052600101610a6b565b5092915050565b606060086040828451602086016000855af180610aa357600080fd5b5050919050565b6000610ab4610de4565b5065deadbeef000160005b83811015610a8057600101610abf565b6000610ad9610de4565b5065deadbeef001760008315610a8057600101610abf565b6000610afb610de4565b5065deadbeef00346000805b84811015610a2457349150600101610b07565b6000610b24610de4565b5065deadbeef000660005b83811015610a805760001990910690600101610b2f565b6000610b50610de4565b5065deadbeef00136000805b84811015610a24576001808413925001610b5c565b6000610b7b610de4565b506001600160e01b0319600090815265deadbeef002090805b84811015610bab5760046000209150600101610b94565b507f29045a592007d0c246ef02c2223570da9522d0cf0f73282c79a1bc8f0bb2c2388114610a80575060009392505050565b6000610be7610de4565b5065deadbeef00a4601081905260005b83811015610a80576004600360028360066010a4600101610bf7565b6000610c1d610de4565b5065deadbeef001a6000805b84811015610a2457600083901a9150600101610c29565b6000610c4a610de4565b5065deadbeef001b60008315610a8057600101610abf565b6000610c6c610de4565b5065deadbeef00426000805b84811015610a2457429150600101610c78565b6000610c95610de4565b5065deadbeef0031600030815b85811015610cb65781319250600101610ca2565b5091949350505050565b6000610cca610de4565b5065deadbeef00486000805b84811015610a2457489150600101610cd6565b6000610cf3610de4565b5065deadbeef003d6000805b84811015610a24573d9150600101610cff565b6000610d1c610de4565b5065deadbeef00436000805b84811015610a2457439150600101610d28565b60028181548110610d4b57600080fd5b906000526020600020018054909150610d6390611a66565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8f90611a66565b8015610ddc5780601f10610db157610100808354040283529160200191610ddc565b820191906000526020600020905b815481529060010190602001808311610dbf57829003601f168201915b505050505081565b60008054610df3906001611aa8565b6000819055919050565b6000610e07610de4565b5065deadbeef000460008315610a8057600101610abf565b6000610e29610de4565b5065deadbeef003760005b83811015610a8057602060008037600101610e34565b6000610e54610de4565b5065deadbeef00a0601081905260005b83811015610a805760066010a0600101610e64565b6000610e83610de4565b5065deadbeef00336000805b84811015610a2457339150600101610e8f565b6000610eac610de4565b5065deadbeef005360005b83811015610a805763deadbeef600052600101610eb7565b6000610ed9610de4565b5065deadbeef003a6000805b84811015610a24573a9150600101610ee5565b6000610f02610de4565b5065deadbeef00516000818152805b84811015610f26576000519150600101610f11565b509392505050565b6000610f38610de4565b5065deadbeef001d60005b83811015610a805760009190911d90600101610f43565b6060600560208301835160405160208183856000885af180610f7b57600080fd5b5095945050505050565b600060026020830183518360208183856000885af180610fa457600080fd5b5050505050919050565b6000610fb8610de4565b505b6103e85a1115610fe1576001806000828254610fd69190611aa8565b90915550610fba9050565b5060015490565b6000610ff2610de4565b5065deadbeef00106000805b84811015610a24576001838110925001610ffe565b600061101d610de4565b5065deadbeef00446000805b84811015610a2457449150600101611029565b6000611046610de4565b5065deadbeef00116000805b84811015610a24576001808411925001611052565b6000611071610de4565b5065deadbeef003e60005b83811015610a805760206000803e60010161107c565b600061109c610de4565b5065deadbeef00456000805b84811015610a24574591506001016110a8565b60006110c5610de4565b5065deadbeef000260008315610a8057600101610abf565b60006110e7610de4565b5065deadbeef000860005b83811015610a80576000196000830891506001016110f2565b6000611115610de4565b5065deadbeef005460008181555b83811015610a80576000549150600101611123565b6000611142610de4565b5065deadbeef005a6000805b84811015610a24575a915060010161114e565b600061116b610de4565b5065deadbeef001960005b8381101561118957901990600101611176565b5065deadbeef0019811461119957195b92915050565b606081516060146111cb5760405162461bcd60e51b81526004016111c290611ae9565b60405180910390fd5b600760208301835160408482846000875af1806111e757600080fd5b50505050919050565b60006111fa610de4565b5065deadbeef00a1601081905260005b83811015610a80578060066010a160010161120a565b600061122a610de4565b5065deadbeef001660008315610a8057600101610abf565b60606004602083018351604051818183856000885af180610f7b57600080fd5b600081516080146112855760405162461bcd60e51b81526004016111c290611b2d565b6001602083016040840151601f1a602082015260206040516080836000865af1806112af57600080fd5b6040515195945050505050565b60006112c6610de4565b505b6103e85a1115610fe15760018060008282546112e49190611aa8565b90915550506001546112f7904390611b53565b506112c8565b6000611307610de4565b5065deadbeef00466000805b84811015610a2457469150600101611313565b6000611330610de4565b5065deadbeef000560008315610a8057600101610abf565b6000611352610de4565b5065deadbeef003960005b83811015610a805760206000803960010161135d565b60028054600181018255600091825283908390602084200191611397919083611c17565b505060025492915050565b60006113ac610de4565b5065deadbeef00596000805b84811015610a24575991506001016113b8565b60006113d5610de4565b5065deadbeef00386000805b84811015610a24573891506001016113e1565b60006113fe610de4565b5065deadbeef00416000805b84811015610a245741915060010161140a565b6000611427610de4565b5065deadbeef00306000805b84811015610a2457309150600101611433565b6000611450610de4565b5065deadbeef00a3601081905260005b83811015610a8057600360028260066010a3600101611460565b6000611484610de4565b5065deadbeef000b60008315610a8057600101610abf565b60006114a6610de4565b5065deadbeef00476000805b84811015610a24574791506001016114b2565b60006114cf610de4565b5065deadbeef001c6000805b84811015610a24576001016114db565b60006114f5610de4565b5065deadbeef00356000805b84811015610a24576000359150600101611501565b6000611520610de4565b5065deadbeef005560005b83811015610a8057600082905560010161152b565b600061154a610de4565b5065deadbeef001860008315610a8057600101610abf565b600061156c610de4565b5065deadbeef000360008315610a8057600101610abf565b600061158e610de4565b5065deadbeef000760005b83811015610a805760001990910790600101611599565b60006115ba610de4565b5065deadbeef00a2601081905260005b83811015610a805760028160066010a26001016115ca565b60006115ec610de4565b5065deadbeef000a60005b83811015610a805760019182900a91016115f7565b6000611616610de4565b5065deadbeef00146000805b84811015610a2457600191508101611622565b600061163f610de4565b5065deadbeef004060006000194301815b85811015610cb65781409250600101611650565b606081516080146116875760405162461bcd60e51b81526004016111c290611ae9565b600660208301835160408482846000875af1806111e757600080fd5b60006116ad610de4565b5065deadbeef00156000805b84811015610a2457821591506001016116b9565b60006116d7610de4565b5065deadbeef00126000805b84811015610a245760018381129250016116e3565b6000611702610de4565b5065deadbeef003b600030815b85811015610cb657813b925060010161170f565b6000600360208301835160405160148183856000885af18061174457600080fd5b8151979650505050505050565b600061175b610de4565b5065deadbeef000960005b83811015610a8057600019600183099150600101611766565b8035611199565b60006020828403121561179b5761179b600080fd5b60006117a7848461177f565b949350505050565b805b82525050565b6020810161119982846117af565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715611801576118016117c5565b6040525050565b60006118176000604051905090565b905061182382826117db565b919050565b600067ffffffffffffffff821115611842576118426117c5565b601f19601f83011660200192915050565b82818337506000910152565b600061187261186d84611828565b611808565b90508281526020810184848401111561188d5761188d600080fd5b610f26848285611853565b600082601f8301126118ac576118ac600080fd5b81356117a784826020860161185f565b6000602082840312156118d1576118d1600080fd5b813567ffffffffffffffff8111156118eb576118eb600080fd5b6117a784828501611898565b60005b838110156119125780820151838201526020016118fa565b50506000910152565b600061192b826000815192915050565b8084526020840193506119428185602086016118f7565b601f01601f19169290920192915050565b60208082528101611964818461191b565b9392505050565b60006001600160a01b038216611199565b6117b18161196b565b60208101611199828461197c565b60008083601f8401126119a8576119a8600080fd5b50813567ffffffffffffffff8111156119c3576119c3600080fd5b6020830191508360018202830111156119de576119de600080fd5b9250929050565b600080602083850312156119fb576119fb600080fd5b823567ffffffffffffffff811115611a1557611a15600080fd5b611a2185828601611993565b92509250509250929050565b6bffffffffffffffffffffffff1981166117b1565b602081016111998284611a2d565b634e487b7160e01b600052602260045260246000fd5b600281046001821680611a7a57607f821691505b602082108103611a8c57611a8c611a50565b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561119957611199611a92565b6014815260006020820173092dcecc2d8d2c840d2dce0eae840d8cadccee8d60631b815291505b5060200190565b6020808252810161119981611abb565b601a81526000602082017f496e76616c696420696e7075742064617461206c656e6774682e00000000000081529150611ae2565b6020808252810161119981611af9565b634e487b7160e01b600052601260045260246000fd5b600082611b6257611b62611b3d565b500690565b6000611199611b738381565b90565b611b7f83611b67565b815460001960089490940293841b1916921b91909117905550565b6000611ba7818484611b76565b505050565b81811015611bc757611bbf600082611b9a565b600101611bac565b5050565b601f821115611ba757611be981600081815281906020902092915050565b6020601f85010481016020851015611bfe5750805b611c106020601f860104830182611bac565b5050505050565b8267ffffffffffffffff811115611c3057611c306117c5565b611c3a8254611a66565b611c45828285611bcb565b6000601f831160018114611c795760008415611c615750858201355b600019600886021c1981166002860217865550611cdf565b601f198416611c9386600081815281906020902092915050565b60005b82811015611cb65788850135825560209485019460019092019101611c96565b86831015611cd257600019601f88166008021c19858a01351682555b6001600288020188555050505b5050505050505056fea2646970667358221220a1e32bfe0f6f40313e4cc2d9327c0f056f456f06f4491c30cda9acec4dc522a164736f6c63430008170033", } // LoadTesterABI is the input ABI used to generate the binding from. diff --git a/contracts/precompiledContracts.go b/bindings/tester/precompiles.go similarity index 98% rename from contracts/precompiledContracts.go rename to bindings/tester/precompiles.go index fd7e8202..eb59e0e2 100644 --- a/contracts/precompiledContracts.go +++ b/bindings/tester/precompiles.go @@ -1,4 +1,4 @@ -package contracts +package tester import ( "crypto/ecdsa" @@ -204,7 +204,7 @@ func CallPrecompiledContracts(address int, lt *LoadTester, opts *bind.TransactOp return lt.TestBlake2f(opts, inputData) } - return nil, fmt.Errorf("Unrecognized precompiled address %d", address) + return nil, fmt.Errorf("unrecognized precompiled address %d", address) } func GetRandomPrecompiledContractAddress() int { diff --git a/bindings/tokens/ERC20.abi b/bindings/tokens/ERC20.abi new file mode 100644 index 00000000..2ef12acd --- /dev/null +++ b/bindings/tokens/ERC20.abi @@ -0,0 +1,290 @@ +[ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/bindings/tokens/ERC20.bin b/bindings/tokens/ERC20.bin new file mode 100644 index 00000000..baecffc7 --- /dev/null +++ b/bindings/tokens/ERC20.bin @@ -0,0 +1 @@ +0x60806040523480156200001157600080fd5b506040518060400160405280600781526020016626bcaa37b5b2b760c91b815250604051806040016040528060038152602001624d544b60e81b81525081600390816200005f91906200026d565b5060046200006e82826200026d565b505050620000ab3362000086620000b160201b60201c565b620000969060ff16600a62000484565b620000a590620f424062000495565b620000b6565b62000516565b601290565b6001600160a01b038216620000e85760405162461bcd60e51b8152600401620000df90620004b7565b60405180910390fd5b8060026000828254620000fc9190620004f3565b90915550506001600160a01b038216600081815260208190526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200015090859062000509565b60405180910390a35b5050565b505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b600281046001821680620001a357607f821691505b602082108103620001b857620001b862000178565b50919050565b6000620001cf620001cc8381565b90565b92915050565b620001e083620001be565b815460001960089490940293841b1916921b91909117905550565b60006200015d818484620001d5565b81811015620001595762000220600082620001fb565b6001016200020a565b601f8211156200015d576000818152602090206020601f85010481016020851015620002525750805b620002666020601f8601048301826200020a565b5050505050565b81516001600160401b0381111562000289576200028962000162565b6200029582546200018e565b620002a282828562000229565b6020601f831160018114620002d95760008415620002c05750858201515b600019600886021c198116600286021786555062000335565b600085815260208120601f198616915b828110156200030b5788850151825560209485019460019092019101620002e9565b86831015620003285784890151600019601f89166008021c191682555b6001600288020188555050505b505050505050565b634e487b7160e01b600052601160045260246000fd5b80825b600185111562000399578086048111156200037557620003756200033d565b60018516156200038457908102905b8002620003918560011c90565b945062000356565b94509492505050565b600082620003b3575060016200047d565b81620003c2575060006200047d565b8160018114620003db5760028114620003e6576200041a565b60019150506200047d565b60ff841115620003fa57620003fa6200033d565b8360020a9150848211156200041357620004136200033d565b506200047d565b5060208310610133831016604e8410600b841016171562000452575081810a838111156200044c576200044c6200033d565b6200047d565b62000461848484600162000353565b925090508184048111156200047a576200047a6200033d565b81025b9392505050565b60006200047d6000198484620003a2565b818102808215838204851417620004b057620004b06200033d565b5092915050565b60208082528101620001cf81601f81527f45524332303a206d696e7420746f20746865207a65726f206164647265737300602082015260400190565b80820180821115620001cf57620001cf6200033d565b81815260208101620001cf565b610adf80620005266000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806370a082311161007157806370a082311461013d57806395d89b4114610166578063a0712d681461016e578063a457c2d714610183578063a9059cbb14610196578063dd62ed3e146101a957600080fd5b806306fdde03146100b9578063095ea7b3146100d757806318160ddd146100f757806323b872dd14610108578063313ce5671461011b578063395093511461012a575b600080fd5b6100c16101bc565b6040516100ce9190610623565b60405180910390f35b6100ea6100e536600461067c565b61024e565b6040516100ce91906106c3565b6002545b6040516100ce91906106d7565b6100ea6101163660046106e5565b610268565b60126040516100ce919061073e565b6100ea61013836600461067c565b61028c565b6100fb61014b36600461074c565b6001600160a01b031660009081526020819052604090205490565b6100c16102ae565b61018161017c366004610775565b6102bd565b005b6100ea61019136600461067c565b6102ca565b6100ea6101a436600461067c565b610310565b6100fb6101b7366004610796565b61031e565b6060600380546101cb906107df565b80601f01602080910402602001604051908101604052809291908181526020018280546101f7906107df565b80156102445780601f1061021957610100808354040283529160200191610244565b820191906000526020600020905b81548152906001019060200180831161022757829003601f168201915b5050505050905090565b60003361025c818585610349565b60019150505b92915050565b6000336102768582856103fd565b610281858585610447565b506001949350505050565b60003361025c81858561029f838361031e565b6102a99190610821565b610349565b6060600480546101cb906107df565b6102c73382610537565b50565b600033816102d8828661031e565b9050838110156103035760405162461bcd60e51b81526004016102fa90610879565b60405180910390fd5b6102818286868403610349565b60003361025c818585610447565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661036f5760405162461bcd60e51b81526004016102fa906108ca565b6001600160a01b0382166103955760405162461bcd60e51b81526004016102fa90610919565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103f09085906106d7565b60405180910390a3505050565b6000610409848461031e565b9050600019811461044157818110156104345760405162461bcd60e51b81526004016102fa90610960565b6104418484848403610349565b50505050565b6001600160a01b03831661046d5760405162461bcd60e51b81526004016102fa906109b2565b6001600160a01b0382166104935760405162461bcd60e51b81526004016102fa90610a02565b6001600160a01b038316600090815260208190526040902054818110156104cc5760405162461bcd60e51b81526004016102fa90610a55565b6001600160a01b0380851660008181526020819052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061052a9086906106d7565b60405180910390a3610441565b6001600160a01b03821661055d5760405162461bcd60e51b81526004016102fa90610a99565b806002600082825461056f9190610821565b90915550506001600160a01b038216600081815260208190526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906105c19085906106d7565b60405180910390a35050565b60005b838110156105e85781810151838201526020016105d0565b50506000910152565b60006105fb825190565b8084526020840193506106128185602086016105cd565b601f01601f19169290920192915050565b6020808252810161063481846105f1565b9392505050565b60006001600160a01b038216610262565b6106558161063b565b81146102c757600080fd5b80356102628161064c565b80610655565b80356102628161066b565b6000806040838503121561069257610692600080fd5b600061069e8585610660565b92505060206106af85828601610671565b9150509250929050565b8015155b82525050565b6020810161026282846106b9565b806106bd565b6020810161026282846106d1565b6000806000606084860312156106fd576106fd600080fd5b60006107098686610660565b935050602061071a86828701610660565b925050604061072b86828701610671565b9150509250925092565b60ff81166106bd565b602081016102628284610735565b60006020828403121561076157610761600080fd5b600061076d8484610660565b949350505050565b60006020828403121561078a5761078a600080fd5b600061076d8484610671565b600080604083850312156107ac576107ac600080fd5b60006107b88585610660565b92505060206106af85828601610660565b634e487b7160e01b600052602260045260246000fd5b6002810460018216806107f357607f821691505b602082108103610805576108056107c9565b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102625761026261080b565b602581526000602082017f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77815264207a65726f60d81b602082015291505b5060400190565b6020808252810161026281610834565b602481526000602082017f45524332303a20617070726f76652066726f6d20746865207a65726f206164648152637265737360e01b60208201529150610872565b6020808252810161026281610889565b602281526000602082017f45524332303a20617070726f766520746f20746865207a65726f206164647265815261737360f01b60208201529150610872565b60208082528101610262816108da565b601d81526000602082017f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000815291505b5060200190565b6020808252810161026281610929565b602581526000602082017f45524332303a207472616e736665722066726f6d20746865207a65726f206164815264647265737360d81b60208201529150610872565b6020808252810161026281610970565b602381526000602082017f45524332303a207472616e7366657220746f20746865207a65726f206164647281526265737360e81b60208201529150610872565b60208082528101610262816109c2565b602681526000602082017f45524332303a207472616e7366657220616d6f756e7420657863656564732062815265616c616e636560d01b60208201529150610872565b6020808252810161026281610a12565b601f81526000602082017f45524332303a206d696e7420746f20746865207a65726f20616464726573730081529150610959565b6020808252810161026281610a6556fea2646970667358221220f24bdedbdb7d6f85ee28fed7aac9452bd82797392c5340d26d79c8f693c8eabc64736f6c63430008170033 diff --git a/contracts/tokens/ERC20.go b/bindings/tokens/ERC20.go similarity index 58% rename from contracts/tokens/ERC20.go rename to bindings/tokens/ERC20.go index df3d27f1..dfaa93dc 100644 --- a/contracts/tokens/ERC20.go +++ b/bindings/tokens/ERC20.go @@ -31,8 +31,8 @@ var ( // ERC20MetaData contains all meta data concerning the ERC20 contract. var ERC20MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60806040526012600560006101000a81548160ff021916908360ff1602179055503480156200002d57600080fd5b506040516200149938038062001499833981810160405281019062000053919062000212565b8160039081620000649190620004e2565b508060049081620000769190620004e2565b505050620005c9565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000e8826200009d565b810181811067ffffffffffffffff821117156200010a5762000109620000ae565b5b80604052505050565b60006200011f6200007f565b90506200012d8282620000dd565b919050565b600067ffffffffffffffff82111562000150576200014f620000ae565b5b6200015b826200009d565b9050602081019050919050565b60005b83811015620001885780820151818401526020810190506200016b565b60008484015250505050565b6000620001ab620001a58462000132565b62000113565b905082815260208101848484011115620001ca57620001c962000098565b5b620001d784828562000168565b509392505050565b600082601f830112620001f757620001f662000093565b5b81516200020984826020860162000194565b91505092915050565b600080604083850312156200022c576200022b62000089565b5b600083015167ffffffffffffffff8111156200024d576200024c6200008e565b5b6200025b85828601620001df565b925050602083015167ffffffffffffffff8111156200027f576200027e6200008e565b5b6200028d85828601620001df565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ea57607f821691505b6020821081036200030057620002ff620002a2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200036a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200032b565b6200037686836200032b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003c3620003bd620003b7846200038e565b62000398565b6200038e565b9050919050565b6000819050919050565b620003df83620003a2565b620003f7620003ee82620003ca565b84845462000338565b825550505050565b600090565b6200040e620003ff565b6200041b818484620003d4565b505050565b5b8181101562000443576200043760008262000404565b60018101905062000421565b5050565b601f82111562000492576200045c8162000306565b62000467846200031b565b8101602085101562000477578190505b6200048f62000486856200031b565b83018262000420565b50505b505050565b600082821c905092915050565b6000620004b76000198460080262000497565b1980831691505092915050565b6000620004d28383620004a4565b9150826002028217905092915050565b620004ed8262000297565b67ffffffffffffffff811115620005095762000508620000ae565b5b620005158254620002d1565b6200052282828562000447565b600060209050601f8311600181146200055a576000841562000545578287015190505b620005518582620004c4565b865550620005c1565b601f1984166200056a8662000306565b60005b8281101562000594578489015182556001820191506020850194506020810190506200056d565b86831015620005b45784890151620005b0601f891682620004a4565b8355505b6001600288020188555050505b505050505050565b610ec080620005d96000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b411461023a578063a0712d6814610258578063a9059cbb14610274578063dd62ed3e146102a4576100cf565b806342966c68146101be57806355b6ed5c146101da57806370a082311461020a576100cf565b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461012257806323b872dd1461014057806327e235e314610170578063313ce567146101a0575b600080fd5b6100dc6102d4565b6040516100e99190610b14565b60405180910390f35b61010c60048036038101906101079190610bcf565b610362565b6040516101199190610c2a565b60405180910390f35b61012a610454565b6040516101379190610c54565b60405180910390f35b61015a60048036038101906101559190610c6f565b61045a565b6040516101679190610c2a565b60405180910390f35b61018a60048036038101906101859190610cc2565b61060b565b6040516101979190610c54565b60405180910390f35b6101a8610623565b6040516101b59190610d0b565b60405180910390f35b6101d860048036038101906101d39190610d26565b610636565b005b6101f460048036038101906101ef9190610d53565b61070d565b6040516102019190610c54565b60405180910390f35b610224600480360381019061021f9190610cc2565b610732565b6040516102319190610c54565b60405180910390f35b61024261077b565b60405161024f9190610b14565b60405180910390f35b610272600480360381019061026d9190610d26565b610809565b005b61028e60048036038101906102899190610bcf565b6108e0565b60405161029b9190610c2a565b60405180910390f35b6102be60048036038101906102b99190610d53565b6109fd565b6040516102cb9190610c54565b60405180910390f35b600380546102e190610dc2565b80601f016020809104026020016040519081016040528092919081815260200182805461030d90610dc2565b801561035a5780601f1061032f5761010080835404028352916020019161035a565b820191906000526020600020905b81548152906001019060200180831161033d57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104429190610c54565b60405180910390a36001905092915050565b60005481565b600081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546104e89190610e22565b9250508190555081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461053e9190610e22565b9250508190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546105949190610e56565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516105f89190610c54565b60405180910390a3600190509392505050565b60016020528060005260406000206000915090505481565b600560009054906101000a900460ff1681565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106859190610e22565b925050819055508060008082825461069d9190610e22565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107029190610c54565b60405180910390a350565b6002602052816000526040600020602052806000526040600020600091509150505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6004805461078890610dc2565b80601f01602080910402602001604051908101604052809291908181526020018280546107b490610dc2565b80156108015780601f106107d657610100808354040283529160200191610801565b820191906000526020600020905b8154815290600101906020018083116107e457829003601f168201915b505050505081565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108589190610e56565b92505081905550806000808282546108709190610e56565b925050819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516108d59190610c54565b60405180910390a350565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109319190610e22565b9250508190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109879190610e56565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109eb9190610c54565b60405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610abe578082015181840152602081019050610aa3565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ae682610a84565b610af08185610a8f565b9350610b00818560208601610aa0565b610b0981610aca565b840191505092915050565b60006020820190508181036000830152610b2e8184610adb565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b6682610b3b565b9050919050565b610b7681610b5b565b8114610b8157600080fd5b50565b600081359050610b9381610b6d565b92915050565b6000819050919050565b610bac81610b99565b8114610bb757600080fd5b50565b600081359050610bc981610ba3565b92915050565b60008060408385031215610be657610be5610b36565b5b6000610bf485828601610b84565b9250506020610c0585828601610bba565b9150509250929050565b60008115159050919050565b610c2481610c0f565b82525050565b6000602082019050610c3f6000830184610c1b565b92915050565b610c4e81610b99565b82525050565b6000602082019050610c696000830184610c45565b92915050565b600080600060608486031215610c8857610c87610b36565b5b6000610c9686828701610b84565b9350506020610ca786828701610b84565b9250506040610cb886828701610bba565b9150509250925092565b600060208284031215610cd857610cd7610b36565b5b6000610ce684828501610b84565b91505092915050565b600060ff82169050919050565b610d0581610cef565b82525050565b6000602082019050610d206000830184610cfc565b92915050565b600060208284031215610d3c57610d3b610b36565b5b6000610d4a84828501610bba565b91505092915050565b60008060408385031215610d6a57610d69610b36565b5b6000610d7885828601610b84565b9250506020610d8985828601610b84565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610dda57607f821691505b602082108103610ded57610dec610d93565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610e2d82610b99565b9150610e3883610b99565b9250828203905081811115610e5057610e4f610df3565b5b92915050565b6000610e6182610b99565b9150610e6c83610b99565b9250828201905080821115610e8457610e83610df3565b5b9291505056fea2646970667358221220e50dff36c097760061d643e3240fb48ba521b74057802dde5e30f1560bee7cf564736f6c63430008150033", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60806040523480156200001157600080fd5b506040518060400160405280600781526020016626bcaa37b5b2b760c91b815250604051806040016040528060038152602001624d544b60e81b81525081600390816200005f91906200026d565b5060046200006e82826200026d565b505050620000ab3362000086620000b160201b60201c565b620000969060ff16600a62000484565b620000a590620f424062000495565b620000b6565b62000516565b601290565b6001600160a01b038216620000e85760405162461bcd60e51b8152600401620000df90620004b7565b60405180910390fd5b8060026000828254620000fc9190620004f3565b90915550506001600160a01b038216600081815260208190526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200015090859062000509565b60405180910390a35b5050565b505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b600281046001821680620001a357607f821691505b602082108103620001b857620001b862000178565b50919050565b6000620001cf620001cc8381565b90565b92915050565b620001e083620001be565b815460001960089490940293841b1916921b91909117905550565b60006200015d818484620001d5565b81811015620001595762000220600082620001fb565b6001016200020a565b601f8211156200015d576000818152602090206020601f85010481016020851015620002525750805b620002666020601f8601048301826200020a565b5050505050565b81516001600160401b0381111562000289576200028962000162565b6200029582546200018e565b620002a282828562000229565b6020601f831160018114620002d95760008415620002c05750858201515b600019600886021c198116600286021786555062000335565b600085815260208120601f198616915b828110156200030b5788850151825560209485019460019092019101620002e9565b86831015620003285784890151600019601f89166008021c191682555b6001600288020188555050505b505050505050565b634e487b7160e01b600052601160045260246000fd5b80825b600185111562000399578086048111156200037557620003756200033d565b60018516156200038457908102905b8002620003918560011c90565b945062000356565b94509492505050565b600082620003b3575060016200047d565b81620003c2575060006200047d565b8160018114620003db5760028114620003e6576200041a565b60019150506200047d565b60ff841115620003fa57620003fa6200033d565b8360020a9150848211156200041357620004136200033d565b506200047d565b5060208310610133831016604e8410600b841016171562000452575081810a838111156200044c576200044c6200033d565b6200047d565b62000461848484600162000353565b925090508184048111156200047a576200047a6200033d565b81025b9392505050565b60006200047d6000198484620003a2565b818102808215838204851417620004b057620004b06200033d565b5092915050565b60208082528101620001cf81601f81527f45524332303a206d696e7420746f20746865207a65726f206164647265737300602082015260400190565b80820180821115620001cf57620001cf6200033d565b81815260208101620001cf565b610adf80620005266000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806370a082311161007157806370a082311461013d57806395d89b4114610166578063a0712d681461016e578063a457c2d714610183578063a9059cbb14610196578063dd62ed3e146101a957600080fd5b806306fdde03146100b9578063095ea7b3146100d757806318160ddd146100f757806323b872dd14610108578063313ce5671461011b578063395093511461012a575b600080fd5b6100c16101bc565b6040516100ce9190610623565b60405180910390f35b6100ea6100e536600461067c565b61024e565b6040516100ce91906106c3565b6002545b6040516100ce91906106d7565b6100ea6101163660046106e5565b610268565b60126040516100ce919061073e565b6100ea61013836600461067c565b61028c565b6100fb61014b36600461074c565b6001600160a01b031660009081526020819052604090205490565b6100c16102ae565b61018161017c366004610775565b6102bd565b005b6100ea61019136600461067c565b6102ca565b6100ea6101a436600461067c565b610310565b6100fb6101b7366004610796565b61031e565b6060600380546101cb906107df565b80601f01602080910402602001604051908101604052809291908181526020018280546101f7906107df565b80156102445780601f1061021957610100808354040283529160200191610244565b820191906000526020600020905b81548152906001019060200180831161022757829003601f168201915b5050505050905090565b60003361025c818585610349565b60019150505b92915050565b6000336102768582856103fd565b610281858585610447565b506001949350505050565b60003361025c81858561029f838361031e565b6102a99190610821565b610349565b6060600480546101cb906107df565b6102c73382610537565b50565b600033816102d8828661031e565b9050838110156103035760405162461bcd60e51b81526004016102fa90610879565b60405180910390fd5b6102818286868403610349565b60003361025c818585610447565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661036f5760405162461bcd60e51b81526004016102fa906108ca565b6001600160a01b0382166103955760405162461bcd60e51b81526004016102fa90610919565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103f09085906106d7565b60405180910390a3505050565b6000610409848461031e565b9050600019811461044157818110156104345760405162461bcd60e51b81526004016102fa90610960565b6104418484848403610349565b50505050565b6001600160a01b03831661046d5760405162461bcd60e51b81526004016102fa906109b2565b6001600160a01b0382166104935760405162461bcd60e51b81526004016102fa90610a02565b6001600160a01b038316600090815260208190526040902054818110156104cc5760405162461bcd60e51b81526004016102fa90610a55565b6001600160a01b0380851660008181526020819052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061052a9086906106d7565b60405180910390a3610441565b6001600160a01b03821661055d5760405162461bcd60e51b81526004016102fa90610a99565b806002600082825461056f9190610821565b90915550506001600160a01b038216600081815260208190526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906105c19085906106d7565b60405180910390a35050565b60005b838110156105e85781810151838201526020016105d0565b50506000910152565b60006105fb825190565b8084526020840193506106128185602086016105cd565b601f01601f19169290920192915050565b6020808252810161063481846105f1565b9392505050565b60006001600160a01b038216610262565b6106558161063b565b81146102c757600080fd5b80356102628161064c565b80610655565b80356102628161066b565b6000806040838503121561069257610692600080fd5b600061069e8585610660565b92505060206106af85828601610671565b9150509250929050565b8015155b82525050565b6020810161026282846106b9565b806106bd565b6020810161026282846106d1565b6000806000606084860312156106fd576106fd600080fd5b60006107098686610660565b935050602061071a86828701610660565b925050604061072b86828701610671565b9150509250925092565b60ff81166106bd565b602081016102628284610735565b60006020828403121561076157610761600080fd5b600061076d8484610660565b949350505050565b60006020828403121561078a5761078a600080fd5b600061076d8484610671565b600080604083850312156107ac576107ac600080fd5b60006107b88585610660565b92505060206106af85828601610660565b634e487b7160e01b600052602260045260246000fd5b6002810460018216806107f357607f821691505b602082108103610805576108056107c9565b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156102625761026261080b565b602581526000602082017f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77815264207a65726f60d81b602082015291505b5060400190565b6020808252810161026281610834565b602481526000602082017f45524332303a20617070726f76652066726f6d20746865207a65726f206164648152637265737360e01b60208201529150610872565b6020808252810161026281610889565b602281526000602082017f45524332303a20617070726f766520746f20746865207a65726f206164647265815261737360f01b60208201529150610872565b60208082528101610262816108da565b601d81526000602082017f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000815291505b5060200190565b6020808252810161026281610929565b602581526000602082017f45524332303a207472616e736665722066726f6d20746865207a65726f206164815264647265737360d81b60208201529150610872565b6020808252810161026281610970565b602381526000602082017f45524332303a207472616e7366657220746f20746865207a65726f206164647281526265737360e81b60208201529150610872565b60208082528101610262816109c2565b602681526000602082017f45524332303a207472616e7366657220616d6f756e7420657863656564732062815265616c616e636560d01b60208201529150610872565b6020808252810161026281610a12565b601f81526000602082017f45524332303a206d696e7420746f20746865207a65726f20616464726573730081529150610959565b6020808252810161026281610a6556fea2646970667358221220f24bdedbdb7d6f85ee28fed7aac9452bd82797392c5340d26d79c8f693c8eabc64736f6c63430008170033", } // ERC20ABI is the input ABI used to generate the binding from. @@ -44,7 +44,7 @@ var ERC20ABI = ERC20MetaData.ABI var ERC20Bin = ERC20MetaData.Bin // DeployERC20 deploys a new Ethereum contract, binding an instance of ERC20 to it. -func DeployERC20(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string) (common.Address, *types.Transaction, *ERC20, error) { +func DeployERC20(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ERC20, error) { parsed, err := ERC20MetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -53,7 +53,7 @@ func DeployERC20(auth *bind.TransactOpts, backend bind.ContractBackend, _name st return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ERC20Bin), backend, _name, _symbol) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ERC20Bin), backend) if err != nil { return common.Address{}, nil, nil, err } @@ -233,37 +233,6 @@ func (_ERC20 *ERC20CallerSession) Allowance(owner common.Address, spender common return _ERC20.Contract.Allowance(&_ERC20.CallOpts, owner, spender) } -// Allowances is a free data retrieval call binding the contract method 0x55b6ed5c. -// -// Solidity: function allowances(address , address ) view returns(uint256) -func (_ERC20 *ERC20Caller) Allowances(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (*big.Int, error) { - var out []interface{} - err := _ERC20.contract.Call(opts, &out, "allowances", arg0, arg1) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// Allowances is a free data retrieval call binding the contract method 0x55b6ed5c. -// -// Solidity: function allowances(address , address ) view returns(uint256) -func (_ERC20 *ERC20Session) Allowances(arg0 common.Address, arg1 common.Address) (*big.Int, error) { - return _ERC20.Contract.Allowances(&_ERC20.CallOpts, arg0, arg1) -} - -// Allowances is a free data retrieval call binding the contract method 0x55b6ed5c. -// -// Solidity: function allowances(address , address ) view returns(uint256) -func (_ERC20 *ERC20CallerSession) Allowances(arg0 common.Address, arg1 common.Address) (*big.Int, error) { - return _ERC20.Contract.Allowances(&_ERC20.CallOpts, arg0, arg1) -} - // BalanceOf is a free data retrieval call binding the contract method 0x70a08231. // // Solidity: function balanceOf(address account) view returns(uint256) @@ -295,37 +264,6 @@ func (_ERC20 *ERC20CallerSession) BalanceOf(account common.Address) (*big.Int, e return _ERC20.Contract.BalanceOf(&_ERC20.CallOpts, account) } -// Balances is a free data retrieval call binding the contract method 0x27e235e3. -// -// Solidity: function balances(address ) view returns(uint256) -func (_ERC20 *ERC20Caller) Balances(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { - var out []interface{} - err := _ERC20.contract.Call(opts, &out, "balances", arg0) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// Balances is a free data retrieval call binding the contract method 0x27e235e3. -// -// Solidity: function balances(address ) view returns(uint256) -func (_ERC20 *ERC20Session) Balances(arg0 common.Address) (*big.Int, error) { - return _ERC20.Contract.Balances(&_ERC20.CallOpts, arg0) -} - -// Balances is a free data retrieval call binding the contract method 0x27e235e3. -// -// Solidity: function balances(address ) view returns(uint256) -func (_ERC20 *ERC20CallerSession) Balances(arg0 common.Address) (*big.Int, error) { - return _ERC20.Contract.Balances(&_ERC20.CallOpts, arg0) -} - // Decimals is a free data retrieval call binding the contract method 0x313ce567. // // Solidity: function decimals() view returns(uint8) @@ -471,25 +409,46 @@ func (_ERC20 *ERC20TransactorSession) Approve(spender common.Address, amount *bi return _ERC20.Contract.Approve(&_ERC20.TransactOpts, spender, amount) } -// Burn is a paid mutator transaction binding the contract method 0x42966c68. +// DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7. +// +// Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool) +func (_ERC20 *ERC20Transactor) DecreaseAllowance(opts *bind.TransactOpts, spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) { + return _ERC20.contract.Transact(opts, "decreaseAllowance", spender, subtractedValue) +} + +// DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7. +// +// Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool) +func (_ERC20 *ERC20Session) DecreaseAllowance(spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) { + return _ERC20.Contract.DecreaseAllowance(&_ERC20.TransactOpts, spender, subtractedValue) +} + +// DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7. +// +// Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool) +func (_ERC20 *ERC20TransactorSession) DecreaseAllowance(spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) { + return _ERC20.Contract.DecreaseAllowance(&_ERC20.TransactOpts, spender, subtractedValue) +} + +// IncreaseAllowance is a paid mutator transaction binding the contract method 0x39509351. // -// Solidity: function burn(uint256 amount) returns() -func (_ERC20 *ERC20Transactor) Burn(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { - return _ERC20.contract.Transact(opts, "burn", amount) +// Solidity: function increaseAllowance(address spender, uint256 addedValue) returns(bool) +func (_ERC20 *ERC20Transactor) IncreaseAllowance(opts *bind.TransactOpts, spender common.Address, addedValue *big.Int) (*types.Transaction, error) { + return _ERC20.contract.Transact(opts, "increaseAllowance", spender, addedValue) } -// Burn is a paid mutator transaction binding the contract method 0x42966c68. +// IncreaseAllowance is a paid mutator transaction binding the contract method 0x39509351. // -// Solidity: function burn(uint256 amount) returns() -func (_ERC20 *ERC20Session) Burn(amount *big.Int) (*types.Transaction, error) { - return _ERC20.Contract.Burn(&_ERC20.TransactOpts, amount) +// Solidity: function increaseAllowance(address spender, uint256 addedValue) returns(bool) +func (_ERC20 *ERC20Session) IncreaseAllowance(spender common.Address, addedValue *big.Int) (*types.Transaction, error) { + return _ERC20.Contract.IncreaseAllowance(&_ERC20.TransactOpts, spender, addedValue) } -// Burn is a paid mutator transaction binding the contract method 0x42966c68. +// IncreaseAllowance is a paid mutator transaction binding the contract method 0x39509351. // -// Solidity: function burn(uint256 amount) returns() -func (_ERC20 *ERC20TransactorSession) Burn(amount *big.Int) (*types.Transaction, error) { - return _ERC20.Contract.Burn(&_ERC20.TransactOpts, amount) +// Solidity: function increaseAllowance(address spender, uint256 addedValue) returns(bool) +func (_ERC20 *ERC20TransactorSession) IncreaseAllowance(spender common.Address, addedValue *big.Int) (*types.Transaction, error) { + return _ERC20.Contract.IncreaseAllowance(&_ERC20.TransactOpts, spender, addedValue) } // Mint is a paid mutator transaction binding the contract method 0xa0712d68. @@ -515,44 +474,44 @@ func (_ERC20 *ERC20TransactorSession) Mint(amount *big.Int) (*types.Transaction, // Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. // -// Solidity: function transfer(address recipient, uint256 amount) returns(bool) -func (_ERC20 *ERC20Transactor) Transfer(opts *bind.TransactOpts, recipient common.Address, amount *big.Int) (*types.Transaction, error) { - return _ERC20.contract.Transact(opts, "transfer", recipient, amount) +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_ERC20 *ERC20Transactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ERC20.contract.Transact(opts, "transfer", to, amount) } // Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. // -// Solidity: function transfer(address recipient, uint256 amount) returns(bool) -func (_ERC20 *ERC20Session) Transfer(recipient common.Address, amount *big.Int) (*types.Transaction, error) { - return _ERC20.Contract.Transfer(&_ERC20.TransactOpts, recipient, amount) +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_ERC20 *ERC20Session) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ERC20.Contract.Transfer(&_ERC20.TransactOpts, to, amount) } // Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. // -// Solidity: function transfer(address recipient, uint256 amount) returns(bool) -func (_ERC20 *ERC20TransactorSession) Transfer(recipient common.Address, amount *big.Int) (*types.Transaction, error) { - return _ERC20.Contract.Transfer(&_ERC20.TransactOpts, recipient, amount) +// Solidity: function transfer(address to, uint256 amount) returns(bool) +func (_ERC20 *ERC20TransactorSession) Transfer(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ERC20.Contract.Transfer(&_ERC20.TransactOpts, to, amount) } // TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. // -// Solidity: function transferFrom(address sender, address recipient, uint256 amount) returns(bool) -func (_ERC20 *ERC20Transactor) TransferFrom(opts *bind.TransactOpts, sender common.Address, recipient common.Address, amount *big.Int) (*types.Transaction, error) { - return _ERC20.contract.Transact(opts, "transferFrom", sender, recipient, amount) +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_ERC20 *ERC20Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ERC20.contract.Transact(opts, "transferFrom", from, to, amount) } // TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. // -// Solidity: function transferFrom(address sender, address recipient, uint256 amount) returns(bool) -func (_ERC20 *ERC20Session) TransferFrom(sender common.Address, recipient common.Address, amount *big.Int) (*types.Transaction, error) { - return _ERC20.Contract.TransferFrom(&_ERC20.TransactOpts, sender, recipient, amount) +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_ERC20 *ERC20Session) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ERC20.Contract.TransferFrom(&_ERC20.TransactOpts, from, to, amount) } // TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. // -// Solidity: function transferFrom(address sender, address recipient, uint256 amount) returns(bool) -func (_ERC20 *ERC20TransactorSession) TransferFrom(sender common.Address, recipient common.Address, amount *big.Int) (*types.Transaction, error) { - return _ERC20.Contract.TransferFrom(&_ERC20.TransactOpts, sender, recipient, amount) +// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool) +func (_ERC20 *ERC20TransactorSession) TransferFrom(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ERC20.Contract.TransferFrom(&_ERC20.TransactOpts, from, to, amount) } // ERC20ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the ERC20 contract. diff --git a/bindings/tokens/ERC721.abi b/bindings/tokens/ERC721.abi new file mode 100644 index 00000000..d9b3e8d8 --- /dev/null +++ b/bindings/tokens/ERC721.abi @@ -0,0 +1,368 @@ +[ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mintBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/bindings/tokens/ERC721.bin b/bindings/tokens/ERC721.bin new file mode 100644 index 00000000..22d511d3 --- /dev/null +++ b/bindings/tokens/ERC721.bin @@ -0,0 +1 @@ +0x608060405260006006553480156200001657600080fd5b5060405180604001604052806005815260200164135e53919560da1b815250604051806040016040528060048152602001631353919560e21b815250816000908162000063919062000457565b50600162000072828262000457565b50505062000089336103e86200008f60201b60201c565b6200075c565b60005b81811015620000cb576000600660008154620000ae906200053d565b91829055509050620000c18482620000d0565b5060010162000092565b505050565b620000f2828260405180602001604052806000815250620000f660201b60201c565b5050565b62000102838362000139565b6200011160008484846200023d565b620000cb5760405162461bcd60e51b815260040162000130906200055a565b60405180910390fd5b6001600160a01b038216620001625760405162461bcd60e51b81526004016200013090620005e6565b6000818152600260205260409020546001600160a01b0316156200019a5760405162461bcd60e51b815260040162000130906200062d565b6000818152600260205260409020546001600160a01b031615620001d25760405162461bcd60e51b815260040162000130906200062d565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156200034057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029062000284903390899088908890600401620006c4565b6020604051808303816000875af1925050508015620002c2575060408051601f3d908101601f19168201909252620002bf9181019062000737565b60015b62000325573d808015620002f3576040519150601f19603f3d011682016040523d82523d6000602084013e620002f8565b606091505b5080516000036200031d5760405162461bcd60e51b815260040162000130906200055a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000344565b5060015b949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b6002810460018216806200038d57607f821691505b602082108103620003a257620003a262000362565b50919050565b6000620003b9620003b68381565b90565b92915050565b620003ca83620003a8565b815460001960089490940293841b1916921b91909117905550565b6000620000cb818484620003bf565b81811015620000f2576200040a600082620003e5565b600101620003f4565b601f821115620000cb576000818152602090206020601f850104810160208510156200043c5750805b620004506020601f860104830182620003f4565b5050505050565b81516001600160401b038111156200047357620004736200034c565b6200047f825462000378565b6200048c82828562000413565b6020601f831160018114620004c35760008415620004aa5750858201515b600019600886021c19811660028602178655506200051f565b600085815260208120601f198616915b82811015620004f55788850151825560209485019460019092019101620004d3565b86831015620005125784890151600019601f89166008021c191682555b6001600288020188555050505b505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600019820362000553576200055362000527565b5060010190565b60208082528101620003b981603281527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560208201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b604082015260600190565b60208082527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373910190815260005b5060200190565b60208082528101620003b981620005b1565b601c81526000602082017f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081529150620005df565b60208082528101620003b981620005f8565b60006001600160a01b038216620003b9565b6200065c816200063f565b82525050565b806200065c565b60005b83811015620006865781810151838201526020016200066c565b50506000910152565b60006200069a825190565b808452602084019350620006b381856020860162000669565b601f01601f19169290920192915050565b60808101620006d4828762000651565b620006e3602083018662000651565b620006f2604083018562000662565b81810360608301526200070681846200068f565b9695505050505050565b6001600160e01b0319811681146200072757600080fd5b50565b8051620003b98162000710565b6000602082840312156200074e576200074e600080fd5b60006200034484846200072a565b611524806200076c6000396000f3fe608060405234801561001057600080fd5b50600436106100f45760003560e01c806342842e0e11610097578063a22cb46511610066578063a22cb465146101e9578063b88d4fde146101fc578063c87b56dd1461020f578063e985e9c51461022257600080fd5b806342842e0e146101a85780636352211e146101bb57806370a08231146101ce57806395d89b41146101e157600080fd5b8063081812fc116100d3578063081812fc1461014d578063095ea7b31461016d57806323b872dd14610182578063248b71fc1461019557600080fd5b80629a9b7b146100f957806301ffc9a71461011857806306fdde0314610138575b600080fd5b61010260065481565b60405161010f9190610c7f565b60405180910390f35b61012b610126366004610caf565b610235565b60405161010f9190610cd8565b610140610287565b60405161010f9190610d3c565b61016061015b366004610d5e565b610319565b60405161010f9190610d99565b61018061017b366004610dbb565b610340565b005b610180610190366004610df8565b6103ce565b6101806101a3366004610dbb565b6103ff565b6101806101b6366004610df8565b610435565b6101606101c9366004610d5e565b610450565b6101026101dc366004610e48565b610485565b6101406104c9565b6101806101f7366004610e7c565b6104d8565b61018061020a366004610fa2565b6104e7565b61014061021d366004610d5e565b61051f565b61012b610230366004611021565b610593565b60006001600160e01b031982166380ac58cd60e01b148061026657506001600160e01b03198216635b5e139f60e01b145b8061028157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546102969061106a565b80601f01602080910402602001604051908101604052809291908181526020018280546102c29061106a565b801561030f5780601f106102e45761010080835404028352916020019161030f565b820191906000526020600020905b8154815290600101906020018083116102f257829003601f168201915b5050505050905090565b6000610324826105c1565b506000908152600460205260409020546001600160a01b031690565b600061034b82610450565b9050806001600160a01b0316836001600160a01b0316036103875760405162461bcd60e51b815260040161037e906110d7565b60405180910390fd5b336001600160a01b03821614806103a357506103a38133610593565b6103bf5760405162461bcd60e51b815260040161037e90611141565b6103c983836105f8565b505050565b6103d83382610666565b6103f45760405162461bcd60e51b815260040161037e9061119b565b6103c98383836106c5565b60005b818110156103c957600060066000815461041b906111c1565b9182905550905061042c84826107ed565b50600101610402565b6103c9838383604051806020016040528060008152506104e7565b6000818152600260205260408120546001600160a01b0316806102815760405162461bcd60e51b815260040161037e90611212565b60006001600160a01b0382166104ad5760405162461bcd60e51b815260040161037e90611268565b506001600160a01b031660009081526003602052604090205490565b6060600180546102969061106a565b6104e3338383610807565b5050565b6104f13383610666565b61050d5760405162461bcd60e51b815260040161037e9061119b565b610519848484846108a9565b50505050565b606061052a826105c1565b600061054160408051602081019091526000815290565b90506000815111610561576040518060200160405280600081525061058c565b8061056b846108dc565b60405160200161057c92919061129a565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6000818152600260205260409020546001600160a01b03166105f55760405162461bcd60e51b815260040161037e90611212565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061062d82610450565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061067283610450565b9050806001600160a01b0316846001600160a01b0316148061069957506106998185610593565b806106bd5750836001600160a01b03166106b284610319565b6001600160a01b0316145b949350505050565b826001600160a01b03166106d882610450565b6001600160a01b0316146106fe5760405162461bcd60e51b815260040161037e906112f4565b6001600160a01b0382166107245760405162461bcd60e51b815260040161037e90611345565b826001600160a01b031661073782610450565b6001600160a01b03161461075d5760405162461bcd60e51b815260040161037e906112f4565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6104e3828260405180602001604052806000815250610970565b816001600160a01b0316836001600160a01b0316036108385760405162461bcd60e51b815260040161037e90611389565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319061089c908590610cd8565b60405180910390a3505050565b6108b48484846106c5565b6108c0848484846109a3565b6105195760405162461bcd60e51b815260040161037e906113e8565b606060006108e983610aa4565b600101905060008167ffffffffffffffff81111561090957610909610eaf565b6040519080825280601f01601f191660200182016040528015610933576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461093d575b509392505050565b61097a8383610b7c565b61098760008484846109a3565b6103c95760405162461bcd60e51b815260040161037e906113e8565b60006001600160a01b0384163b15610a9957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906109e79033908990889088906004016113f8565b6020604051808303816000875af1925050508015610a22575060408051601f3d908101601f19168201909252610a1f91810190611447565b60015b610a7f573d808015610a50576040519150601f19603f3d011682016040523d82523d6000602084013e610a55565b606091505b508051600003610a775760405162461bcd60e51b815260040161037e906113e8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506106bd565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610ae35772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610b0f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610b2d57662386f26fc10000830492506010015b6305f5e1008310610b45576305f5e100830492506008015b6127108310610b5957612710830492506004015b60648310610b6b576064830492506002015b600a83106102815760010192915050565b6001600160a01b038216610ba25760405162461bcd60e51b815260040161037e9061149a565b6000818152600260205260409020546001600160a01b031615610bd75760405162461bcd60e51b815260040161037e906114de565b6000818152600260205260409020546001600160a01b031615610c0c5760405162461bcd60e51b815260040161037e906114de565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b805b82525050565b602081016102818284610c77565b6001600160e01b031981165b81146105f557600080fd5b803561028181610c8d565b600060208284031215610cc457610cc4600080fd5b60006106bd8484610ca4565b801515610c79565b602081016102818284610cd0565b60005b83811015610d01578181015183820152602001610ce9565b50506000910152565b6000610d14825190565b808452602084019350610d2b818560208601610ce6565b601f01601f19169290920192915050565b6020808252810161058c8184610d0a565b80610c99565b803561028181610d4d565b600060208284031215610d7357610d73600080fd5b60006106bd8484610d53565b60006001600160a01b038216610281565b610c7981610d7f565b602081016102818284610d90565b610c9981610d7f565b803561028181610da7565b60008060408385031215610dd157610dd1600080fd5b6000610ddd8585610db0565b9250506020610dee85828601610d53565b9150509250929050565b600080600060608486031215610e1057610e10600080fd5b6000610e1c8686610db0565b9350506020610e2d86828701610db0565b9250506040610e3e86828701610d53565b9150509250925092565b600060208284031215610e5d57610e5d600080fd5b60006106bd8484610db0565b801515610c99565b803561028181610e69565b60008060408385031215610e9257610e92600080fd5b6000610e9e8585610db0565b9250506020610dee85828601610e71565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715610eeb57610eeb610eaf565b6040525050565b6000610efd60405190565b9050610f098282610ec5565b919050565b600067ffffffffffffffff821115610f2857610f28610eaf565b601f19601f83011660200192915050565b82818337506000910152565b6000610f58610f5384610f0e565b610ef2565b905082815260208101848484011115610f7357610f73600080fd5b610968848285610f39565b600082601f830112610f9257610f92600080fd5b81356106bd848260208601610f45565b60008060008060808587031215610fbb57610fbb600080fd5b6000610fc78787610db0565b9450506020610fd887828801610db0565b9350506040610fe987828801610d53565b925050606085013567ffffffffffffffff81111561100957611009600080fd5b61101587828801610f7e565b91505092959194509250565b6000806040838503121561103757611037600080fd5b60006110438585610db0565b9250506020610dee85828601610db0565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061107e57607f821691505b60208210810361109057611090611054565b50919050565b602181526000602082017f4552433732313a20617070726f76616c20746f2063757272656e74206f776e658152603960f91b602082015291505b5060400190565b6020808252810161028181611096565b603d81526000602082017f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f81527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015291506110d0565b60208082528101610281816110e7565b602d81526000602082017f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6581526c1c881bdc88185c1c1c9bdd9959609a1b602082015291506110d0565b6020808252810161028181611151565b634e487b7160e01b600052601160045260246000fd5b600060001982036111d4576111d46111ab565b5060010190565b601881526000602082017f4552433732313a20696e76616c696420746f6b656e2049440000000000000000815291505b5060200190565b60208082528101610281816111db565b602981526000602082017f4552433732313a2061646472657373207a65726f206973206e6f7420612076618152683634b21037bbb732b960b91b602082015291506110d0565b6020808252810161028181611222565b6000611282825190565b611290818560208601610ce6565b9290920192915050565b60006112a68285611278565b91506106bd8284611278565b602581526000602082017f4552433732313a207472616e736665722066726f6d20696e636f72726563742081526437bbb732b960d91b602082015291506110d0565b60208082528101610281816112b2565b602481526000602082017f4552433732313a207472616e7366657220746f20746865207a65726f206164648152637265737360e01b602082015291506110d0565b6020808252810161028181611304565b601981526000602082017f4552433732313a20617070726f766520746f2063616c6c6572000000000000008152915061120b565b6020808252810161028181611355565b603281526000602082017f4552433732313a207472616e7366657220746f206e6f6e20455243373231526581527131b2b4bb32b91034b6b83632b6b2b73a32b960711b602082015291506110d0565b6020808252810161028181611399565b608081016114068287610d90565b6114136020830186610d90565b6114206040830185610c77565b81810360608301526114328184610d0a565b9695505050505050565b805161028181610c8d565b60006020828403121561145c5761145c600080fd5b60006106bd848461143c565b60208082527f4552433732313a206d696e7420746f20746865207a65726f20616464726573739101908152600061120b565b6020808252810161028181611468565b601c81526000602082017f4552433732313a20746f6b656e20616c7265616479206d696e746564000000008152915061120b565b60208082528101610281816114aa56fea264697066735822122000229c3c686a66e419169718b3d99caa40300a455a103d71935ebe560a02fd1864736f6c63430008170033 diff --git a/contracts/tokens/ERC721.go b/bindings/tokens/ERC721.go similarity index 50% rename from contracts/tokens/ERC721.go rename to bindings/tokens/ERC721.go index 1f55bfc1..011b1a1e 100644 --- a/contracts/tokens/ERC721.go +++ b/bindings/tokens/ERC721.go @@ -31,8 +31,8 @@ var ( // ERC721MetaData contains all meta data concerning the ERC721 contract. var ERC721MetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"quantity\",\"type\":\"uint256\"}],\"name\":\"mintBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040526000600455606460809081525034801561001d57600080fd5b50608051611c7961003960003960006110260152611c796000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806342842e0e1161007157806342842e0e146101625780636352211e1461017e57806370a08231146101ae578063a22cb465146101de578063b88d4fde146101fa578063e985e9c514610216576100a9565b806301ffc9a7146100ae578063081812fc146100de578063095ea7b31461010e57806323b872dd1461012a578063248b71fc14610146575b600080fd5b6100c860048036038101906100c3919061123d565b610246565b6040516100d59190611285565b60405180910390f35b6100f860048036038101906100f391906112d6565b610318565b6040516101059190611344565b60405180910390f35b6101286004803603810190610123919061138b565b6103f5565b005b610144600480360381019061013f91906113cb565b6105dd565b005b610160600480360381019061015b919061138b565b6108c7565b005b61017c600480360381019061017791906113cb565b6108d5565b005b610198600480360381019061019391906112d6565b610a0d565b6040516101a59190611344565b60405180910390f35b6101c860048036038101906101c3919061141e565b610ab8565b6040516101d5919061145a565b60405180910390f35b6101f860048036038101906101f391906114a1565b610b6f565b005b610214600480360381019061020f9190611546565b610c6c565b005b610230600480360381019061022b91906115ce565b610daa565b60405161023d9190611285565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061031157507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036103ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b19061166b565b60405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104ec5750600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61052b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610522906116d7565b60405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067490611743565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e3906117af565b60405180910390fd5b6106f7833383610dd9565b610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072d906116d7565b60405180910390fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610786906117fe565b9190505550600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906107db90611827565b91905055508160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6108d18282610f0d565b5050565b6108e08383836105dd565b60008273ffffffffffffffffffffffffffffffffffffffff163b14806109c9575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b8152600401610965939291906118a6565b6020604051808303816000875af1158015610984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a89190611905565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b610a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ff9061197e565b60405180910390fd5b505050565b600080600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa9061166b565b60405180910390fd5b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f906119ea565b60405180910390fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c609190611285565b60405180910390a35050565b610c778585856105dd565b60008473ffffffffffffffffffffffffffffffffffffffff163b1480610d64575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b8152600401610d00959493929190611a57565b6020604051808303816000875af1158015610d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d439190611905565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a9061197e565b60405180910390fd5b5050505050565b60036020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e9b5750600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80610f0457506002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b90509392505050565b60006004549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90611af1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101b90611b5d565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000821115611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e90611bef565b60405180910390fd5b816fffffffffffffffffffffffffffffffff16600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110e89190611c0f565b92505081905550600081905060005b838110156111cd57818573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48460008084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081806111b790611827565b92505080806111c590611827565b9150506110f7565b508060048190555050505050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61121a816111e5565b811461122557600080fd5b50565b60008135905061123781611211565b92915050565b600060208284031215611253576112526111db565b5b600061126184828501611228565b91505092915050565b60008115159050919050565b61127f8161126a565b82525050565b600060208201905061129a6000830184611276565b92915050565b6000819050919050565b6112b3816112a0565b81146112be57600080fd5b50565b6000813590506112d0816112aa565b92915050565b6000602082840312156112ec576112eb6111db565b5b60006112fa848285016112c1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061132e82611303565b9050919050565b61133e81611323565b82525050565b60006020820190506113596000830184611335565b92915050565b61136881611323565b811461137357600080fd5b50565b6000813590506113858161135f565b92915050565b600080604083850312156113a2576113a16111db565b5b60006113b085828601611376565b92505060206113c1858286016112c1565b9150509250929050565b6000806000606084860312156113e4576113e36111db565b5b60006113f286828701611376565b935050602061140386828701611376565b9250506040611414868287016112c1565b9150509250925092565b600060208284031215611434576114336111db565b5b600061144284828501611376565b91505092915050565b611454816112a0565b82525050565b600060208201905061146f600083018461144b565b92915050565b61147e8161126a565b811461148957600080fd5b50565b60008135905061149b81611475565b92915050565b600080604083850312156114b8576114b76111db565b5b60006114c685828601611376565b92505060206114d78582860161148c565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112611506576115056114e1565b5b8235905067ffffffffffffffff811115611523576115226114e6565b5b60208301915083600182028301111561153f5761153e6114eb565b5b9250929050565b600080600080600060808688031215611562576115616111db565b5b600061157088828901611376565b955050602061158188828901611376565b9450506040611592888289016112c1565b935050606086013567ffffffffffffffff8111156115b3576115b26111e0565b5b6115bf888289016114f0565b92509250509295509295909350565b600080604083850312156115e5576115e46111db565b5b60006115f385828601611376565b925050602061160485828601611376565b9150509250929050565b600082825260208201905092915050565b7f746f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b600061165560138361160e565b91506116608261161f565b602082019050919050565b6000602082019050818103600083015261168481611648565b9050919050565b7f6e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b60006116c1600e8361160e565b91506116cc8261168b565b602082019050919050565b600060208201905081810360008301526116f0816116b4565b9050919050565b7f66726f6d20213d206f776e657200000000000000000000000000000000000000600082015250565b600061172d600d8361160e565b9150611738826116f7565b602082019050919050565b6000602082019050818103600083015261175c81611720565b9050919050565b7f7472616e7366657220746f207a65726f20616464726573730000000000000000600082015250565b600061179960188361160e565b91506117a482611763565b602082019050919050565b600060208201905081810360008301526117c88161178c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611809826112a0565b91506000820361181c5761181b6117cf565b5b600182039050919050565b6000611832826112a0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611864576118636117cf565b5b600182019050919050565b600082825260208201905092915050565b50565b600061189060008361186f565b915061189b82611880565b600082019050919050565b60006080820190506118bb6000830186611335565b6118c86020830185611335565b6118d5604083018461144b565b81810360608301526118e681611883565b9050949350505050565b6000815190506118ff81611211565b92915050565b60006020828403121561191b5761191a6111db565b5b6000611929848285016118f0565b91505092915050565b7f756e7361666520726563697069656e7400000000000000000000000000000000600082015250565b600061196860108361160e565b915061197382611932565b602082019050919050565b600060208201905081810360008301526119978161195b565b9050919050565b7f6f776e6572203d207a65726f2061646472657373000000000000000000000000600082015250565b60006119d460148361160e565b91506119df8261199e565b602082019050919050565b60006020820190508181036000830152611a03816119c7565b9050919050565b82818337600083830152505050565b6000601f19601f8301169050919050565b6000611a36838561186f565b9350611a43838584611a0a565b611a4c83611a19565b840190509392505050565b6000608082019050611a6c6000830188611335565b611a796020830187611335565b611a86604083018661144b565b8181036060830152611a99818486611a2a565b90509695505050505050565b7f6d696e7420746f207a65726f2061646472657373000000000000000000000000600082015250565b6000611adb60148361160e565b9150611ae682611aa5565b602082019050919050565b60006020820190508181036000830152611b0a81611ace565b9050919050565b7f616c7265616479206d696e746564000000000000000000000000000000000000600082015250565b6000611b47600e8361160e565b9150611b5282611b11565b602082019050919050565b60006020820190508181036000830152611b7681611b3a565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000611bd960228361160e565b9150611be482611b7d565b604082019050919050565b60006020820190508181036000830152611c0881611bcc565b9050919050565b6000611c1a826112a0565b9150611c25836112a0565b9250828201905080821115611c3d57611c3c6117cf565b5b9291505056fea264697066735822122036621e4f4ef072ed94979bf338e8d15f60cd9af9e1fc693b1438f4494545594664736f6c63430008150033", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405260006006553480156200001657600080fd5b5060405180604001604052806005815260200164135e53919560da1b815250604051806040016040528060048152602001631353919560e21b815250816000908162000063919062000457565b50600162000072828262000457565b50505062000089336103e86200008f60201b60201c565b6200075c565b60005b81811015620000cb576000600660008154620000ae906200053d565b91829055509050620000c18482620000d0565b5060010162000092565b505050565b620000f2828260405180602001604052806000815250620000f660201b60201c565b5050565b62000102838362000139565b6200011160008484846200023d565b620000cb5760405162461bcd60e51b815260040162000130906200055a565b60405180910390fd5b6001600160a01b038216620001625760405162461bcd60e51b81526004016200013090620005e6565b6000818152600260205260409020546001600160a01b0316156200019a5760405162461bcd60e51b815260040162000130906200062d565b6000818152600260205260409020546001600160a01b031615620001d25760405162461bcd60e51b815260040162000130906200062d565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156200034057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029062000284903390899088908890600401620006c4565b6020604051808303816000875af1925050508015620002c2575060408051601f3d908101601f19168201909252620002bf9181019062000737565b60015b62000325573d808015620002f3576040519150601f19603f3d011682016040523d82523d6000602084013e620002f8565b606091505b5080516000036200031d5760405162461bcd60e51b815260040162000130906200055a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000344565b5060015b949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b6002810460018216806200038d57607f821691505b602082108103620003a257620003a262000362565b50919050565b6000620003b9620003b68381565b90565b92915050565b620003ca83620003a8565b815460001960089490940293841b1916921b91909117905550565b6000620000cb818484620003bf565b81811015620000f2576200040a600082620003e5565b600101620003f4565b601f821115620000cb576000818152602090206020601f850104810160208510156200043c5750805b620004506020601f860104830182620003f4565b5050505050565b81516001600160401b038111156200047357620004736200034c565b6200047f825462000378565b6200048c82828562000413565b6020601f831160018114620004c35760008415620004aa5750858201515b600019600886021c19811660028602178655506200051f565b600085815260208120601f198616915b82811015620004f55788850151825560209485019460019092019101620004d3565b86831015620005125784890151600019601f89166008021c191682555b6001600288020188555050505b505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600019820362000553576200055362000527565b5060010190565b60208082528101620003b981603281527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560208201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b604082015260600190565b60208082527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373910190815260005b5060200190565b60208082528101620003b981620005b1565b601c81526000602082017f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081529150620005df565b60208082528101620003b981620005f8565b60006001600160a01b038216620003b9565b6200065c816200063f565b82525050565b806200065c565b60005b83811015620006865781810151838201526020016200066c565b50506000910152565b60006200069a825190565b808452602084019350620006b381856020860162000669565b601f01601f19169290920192915050565b60808101620006d4828762000651565b620006e3602083018662000651565b620006f2604083018562000662565b81810360608301526200070681846200068f565b9695505050505050565b6001600160e01b0319811681146200072757600080fd5b50565b8051620003b98162000710565b6000602082840312156200074e576200074e600080fd5b60006200034484846200072a565b611524806200076c6000396000f3fe608060405234801561001057600080fd5b50600436106100f45760003560e01c806342842e0e11610097578063a22cb46511610066578063a22cb465146101e9578063b88d4fde146101fc578063c87b56dd1461020f578063e985e9c51461022257600080fd5b806342842e0e146101a85780636352211e146101bb57806370a08231146101ce57806395d89b41146101e157600080fd5b8063081812fc116100d3578063081812fc1461014d578063095ea7b31461016d57806323b872dd14610182578063248b71fc1461019557600080fd5b80629a9b7b146100f957806301ffc9a71461011857806306fdde0314610138575b600080fd5b61010260065481565b60405161010f9190610c7f565b60405180910390f35b61012b610126366004610caf565b610235565b60405161010f9190610cd8565b610140610287565b60405161010f9190610d3c565b61016061015b366004610d5e565b610319565b60405161010f9190610d99565b61018061017b366004610dbb565b610340565b005b610180610190366004610df8565b6103ce565b6101806101a3366004610dbb565b6103ff565b6101806101b6366004610df8565b610435565b6101606101c9366004610d5e565b610450565b6101026101dc366004610e48565b610485565b6101406104c9565b6101806101f7366004610e7c565b6104d8565b61018061020a366004610fa2565b6104e7565b61014061021d366004610d5e565b61051f565b61012b610230366004611021565b610593565b60006001600160e01b031982166380ac58cd60e01b148061026657506001600160e01b03198216635b5e139f60e01b145b8061028157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546102969061106a565b80601f01602080910402602001604051908101604052809291908181526020018280546102c29061106a565b801561030f5780601f106102e45761010080835404028352916020019161030f565b820191906000526020600020905b8154815290600101906020018083116102f257829003601f168201915b5050505050905090565b6000610324826105c1565b506000908152600460205260409020546001600160a01b031690565b600061034b82610450565b9050806001600160a01b0316836001600160a01b0316036103875760405162461bcd60e51b815260040161037e906110d7565b60405180910390fd5b336001600160a01b03821614806103a357506103a38133610593565b6103bf5760405162461bcd60e51b815260040161037e90611141565b6103c983836105f8565b505050565b6103d83382610666565b6103f45760405162461bcd60e51b815260040161037e9061119b565b6103c98383836106c5565b60005b818110156103c957600060066000815461041b906111c1565b9182905550905061042c84826107ed565b50600101610402565b6103c9838383604051806020016040528060008152506104e7565b6000818152600260205260408120546001600160a01b0316806102815760405162461bcd60e51b815260040161037e90611212565b60006001600160a01b0382166104ad5760405162461bcd60e51b815260040161037e90611268565b506001600160a01b031660009081526003602052604090205490565b6060600180546102969061106a565b6104e3338383610807565b5050565b6104f13383610666565b61050d5760405162461bcd60e51b815260040161037e9061119b565b610519848484846108a9565b50505050565b606061052a826105c1565b600061054160408051602081019091526000815290565b90506000815111610561576040518060200160405280600081525061058c565b8061056b846108dc565b60405160200161057c92919061129a565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6000818152600260205260409020546001600160a01b03166105f55760405162461bcd60e51b815260040161037e90611212565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061062d82610450565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061067283610450565b9050806001600160a01b0316846001600160a01b0316148061069957506106998185610593565b806106bd5750836001600160a01b03166106b284610319565b6001600160a01b0316145b949350505050565b826001600160a01b03166106d882610450565b6001600160a01b0316146106fe5760405162461bcd60e51b815260040161037e906112f4565b6001600160a01b0382166107245760405162461bcd60e51b815260040161037e90611345565b826001600160a01b031661073782610450565b6001600160a01b03161461075d5760405162461bcd60e51b815260040161037e906112f4565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6104e3828260405180602001604052806000815250610970565b816001600160a01b0316836001600160a01b0316036108385760405162461bcd60e51b815260040161037e90611389565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319061089c908590610cd8565b60405180910390a3505050565b6108b48484846106c5565b6108c0848484846109a3565b6105195760405162461bcd60e51b815260040161037e906113e8565b606060006108e983610aa4565b600101905060008167ffffffffffffffff81111561090957610909610eaf565b6040519080825280601f01601f191660200182016040528015610933576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461093d575b509392505050565b61097a8383610b7c565b61098760008484846109a3565b6103c95760405162461bcd60e51b815260040161037e906113e8565b60006001600160a01b0384163b15610a9957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906109e79033908990889088906004016113f8565b6020604051808303816000875af1925050508015610a22575060408051601f3d908101601f19168201909252610a1f91810190611447565b60015b610a7f573d808015610a50576040519150601f19603f3d011682016040523d82523d6000602084013e610a55565b606091505b508051600003610a775760405162461bcd60e51b815260040161037e906113e8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506106bd565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610ae35772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610b0f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610b2d57662386f26fc10000830492506010015b6305f5e1008310610b45576305f5e100830492506008015b6127108310610b5957612710830492506004015b60648310610b6b576064830492506002015b600a83106102815760010192915050565b6001600160a01b038216610ba25760405162461bcd60e51b815260040161037e9061149a565b6000818152600260205260409020546001600160a01b031615610bd75760405162461bcd60e51b815260040161037e906114de565b6000818152600260205260409020546001600160a01b031615610c0c5760405162461bcd60e51b815260040161037e906114de565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b805b82525050565b602081016102818284610c77565b6001600160e01b031981165b81146105f557600080fd5b803561028181610c8d565b600060208284031215610cc457610cc4600080fd5b60006106bd8484610ca4565b801515610c79565b602081016102818284610cd0565b60005b83811015610d01578181015183820152602001610ce9565b50506000910152565b6000610d14825190565b808452602084019350610d2b818560208601610ce6565b601f01601f19169290920192915050565b6020808252810161058c8184610d0a565b80610c99565b803561028181610d4d565b600060208284031215610d7357610d73600080fd5b60006106bd8484610d53565b60006001600160a01b038216610281565b610c7981610d7f565b602081016102818284610d90565b610c9981610d7f565b803561028181610da7565b60008060408385031215610dd157610dd1600080fd5b6000610ddd8585610db0565b9250506020610dee85828601610d53565b9150509250929050565b600080600060608486031215610e1057610e10600080fd5b6000610e1c8686610db0565b9350506020610e2d86828701610db0565b9250506040610e3e86828701610d53565b9150509250925092565b600060208284031215610e5d57610e5d600080fd5b60006106bd8484610db0565b801515610c99565b803561028181610e69565b60008060408385031215610e9257610e92600080fd5b6000610e9e8585610db0565b9250506020610dee85828601610e71565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715610eeb57610eeb610eaf565b6040525050565b6000610efd60405190565b9050610f098282610ec5565b919050565b600067ffffffffffffffff821115610f2857610f28610eaf565b601f19601f83011660200192915050565b82818337506000910152565b6000610f58610f5384610f0e565b610ef2565b905082815260208101848484011115610f7357610f73600080fd5b610968848285610f39565b600082601f830112610f9257610f92600080fd5b81356106bd848260208601610f45565b60008060008060808587031215610fbb57610fbb600080fd5b6000610fc78787610db0565b9450506020610fd887828801610db0565b9350506040610fe987828801610d53565b925050606085013567ffffffffffffffff81111561100957611009600080fd5b61101587828801610f7e565b91505092959194509250565b6000806040838503121561103757611037600080fd5b60006110438585610db0565b9250506020610dee85828601610db0565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061107e57607f821691505b60208210810361109057611090611054565b50919050565b602181526000602082017f4552433732313a20617070726f76616c20746f2063757272656e74206f776e658152603960f91b602082015291505b5060400190565b6020808252810161028181611096565b603d81526000602082017f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f81527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015291506110d0565b60208082528101610281816110e7565b602d81526000602082017f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6581526c1c881bdc88185c1c1c9bdd9959609a1b602082015291506110d0565b6020808252810161028181611151565b634e487b7160e01b600052601160045260246000fd5b600060001982036111d4576111d46111ab565b5060010190565b601881526000602082017f4552433732313a20696e76616c696420746f6b656e2049440000000000000000815291505b5060200190565b60208082528101610281816111db565b602981526000602082017f4552433732313a2061646472657373207a65726f206973206e6f7420612076618152683634b21037bbb732b960b91b602082015291506110d0565b6020808252810161028181611222565b6000611282825190565b611290818560208601610ce6565b9290920192915050565b60006112a68285611278565b91506106bd8284611278565b602581526000602082017f4552433732313a207472616e736665722066726f6d20696e636f72726563742081526437bbb732b960d91b602082015291506110d0565b60208082528101610281816112b2565b602481526000602082017f4552433732313a207472616e7366657220746f20746865207a65726f206164648152637265737360e01b602082015291506110d0565b6020808252810161028181611304565b601981526000602082017f4552433732313a20617070726f766520746f2063616c6c6572000000000000008152915061120b565b6020808252810161028181611355565b603281526000602082017f4552433732313a207472616e7366657220746f206e6f6e20455243373231526581527131b2b4bb32b91034b6b83632b6b2b73a32b960711b602082015291506110d0565b6020808252810161028181611399565b608081016114068287610d90565b6114136020830186610d90565b6114206040830185610c77565b81810360608301526114328184610d0a565b9695505050505050565b805161028181610c8d565b60006020828403121561145c5761145c600080fd5b60006106bd848461143c565b60208082527f4552433732313a206d696e7420746f20746865207a65726f20616464726573739101908152600061120b565b6020808252810161028181611468565b601c81526000602082017f4552433732313a20746f6b656e20616c7265616479206d696e746564000000008152915061120b565b60208082528101610281816114aa56fea264697066735822122000229c3c686a66e419169718b3d99caa40300a455a103d71935ebe560a02fd1864736f6c63430008170033", } // ERC721ABI is the input ABI used to generate the binding from. @@ -233,12 +233,43 @@ func (_ERC721 *ERC721CallerSession) BalanceOf(owner common.Address) (*big.Int, e return _ERC721.Contract.BalanceOf(&_ERC721.CallOpts, owner) } +// CurrentTokenId is a free data retrieval call binding the contract method 0x009a9b7b. +// +// Solidity: function currentTokenId() view returns(uint256) +func (_ERC721 *ERC721Caller) CurrentTokenId(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ERC721.contract.Call(opts, &out, "currentTokenId") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CurrentTokenId is a free data retrieval call binding the contract method 0x009a9b7b. +// +// Solidity: function currentTokenId() view returns(uint256) +func (_ERC721 *ERC721Session) CurrentTokenId() (*big.Int, error) { + return _ERC721.Contract.CurrentTokenId(&_ERC721.CallOpts) +} + +// CurrentTokenId is a free data retrieval call binding the contract method 0x009a9b7b. +// +// Solidity: function currentTokenId() view returns(uint256) +func (_ERC721 *ERC721CallerSession) CurrentTokenId() (*big.Int, error) { + return _ERC721.Contract.CurrentTokenId(&_ERC721.CallOpts) +} + // GetApproved is a free data retrieval call binding the contract method 0x081812fc. // -// Solidity: function getApproved(uint256 id) view returns(address) -func (_ERC721 *ERC721Caller) GetApproved(opts *bind.CallOpts, id *big.Int) (common.Address, error) { +// Solidity: function getApproved(uint256 tokenId) view returns(address) +func (_ERC721 *ERC721Caller) GetApproved(opts *bind.CallOpts, tokenId *big.Int) (common.Address, error) { var out []interface{} - err := _ERC721.contract.Call(opts, &out, "getApproved", id) + err := _ERC721.contract.Call(opts, &out, "getApproved", tokenId) if err != nil { return *new(common.Address), err @@ -252,24 +283,24 @@ func (_ERC721 *ERC721Caller) GetApproved(opts *bind.CallOpts, id *big.Int) (comm // GetApproved is a free data retrieval call binding the contract method 0x081812fc. // -// Solidity: function getApproved(uint256 id) view returns(address) -func (_ERC721 *ERC721Session) GetApproved(id *big.Int) (common.Address, error) { - return _ERC721.Contract.GetApproved(&_ERC721.CallOpts, id) +// Solidity: function getApproved(uint256 tokenId) view returns(address) +func (_ERC721 *ERC721Session) GetApproved(tokenId *big.Int) (common.Address, error) { + return _ERC721.Contract.GetApproved(&_ERC721.CallOpts, tokenId) } // GetApproved is a free data retrieval call binding the contract method 0x081812fc. // -// Solidity: function getApproved(uint256 id) view returns(address) -func (_ERC721 *ERC721CallerSession) GetApproved(id *big.Int) (common.Address, error) { - return _ERC721.Contract.GetApproved(&_ERC721.CallOpts, id) +// Solidity: function getApproved(uint256 tokenId) view returns(address) +func (_ERC721 *ERC721CallerSession) GetApproved(tokenId *big.Int) (common.Address, error) { + return _ERC721.Contract.GetApproved(&_ERC721.CallOpts, tokenId) } // IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. // -// Solidity: function isApprovedForAll(address , address ) view returns(bool) -func (_ERC721 *ERC721Caller) IsApprovedForAll(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (bool, error) { +// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool) +func (_ERC721 *ERC721Caller) IsApprovedForAll(opts *bind.CallOpts, owner common.Address, operator common.Address) (bool, error) { var out []interface{} - err := _ERC721.contract.Call(opts, &out, "isApprovedForAll", arg0, arg1) + err := _ERC721.contract.Call(opts, &out, "isApprovedForAll", owner, operator) if err != nil { return *new(bool), err @@ -283,24 +314,55 @@ func (_ERC721 *ERC721Caller) IsApprovedForAll(opts *bind.CallOpts, arg0 common.A // IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. // -// Solidity: function isApprovedForAll(address , address ) view returns(bool) -func (_ERC721 *ERC721Session) IsApprovedForAll(arg0 common.Address, arg1 common.Address) (bool, error) { - return _ERC721.Contract.IsApprovedForAll(&_ERC721.CallOpts, arg0, arg1) +// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool) +func (_ERC721 *ERC721Session) IsApprovedForAll(owner common.Address, operator common.Address) (bool, error) { + return _ERC721.Contract.IsApprovedForAll(&_ERC721.CallOpts, owner, operator) } // IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5. // -// Solidity: function isApprovedForAll(address , address ) view returns(bool) -func (_ERC721 *ERC721CallerSession) IsApprovedForAll(arg0 common.Address, arg1 common.Address) (bool, error) { - return _ERC721.Contract.IsApprovedForAll(&_ERC721.CallOpts, arg0, arg1) +// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool) +func (_ERC721 *ERC721CallerSession) IsApprovedForAll(owner common.Address, operator common.Address) (bool, error) { + return _ERC721.Contract.IsApprovedForAll(&_ERC721.CallOpts, owner, operator) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ERC721 *ERC721Caller) Name(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ERC721.contract.Call(opts, &out, "name") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ERC721 *ERC721Session) Name() (string, error) { + return _ERC721.Contract.Name(&_ERC721.CallOpts) +} + +// Name is a free data retrieval call binding the contract method 0x06fdde03. +// +// Solidity: function name() view returns(string) +func (_ERC721 *ERC721CallerSession) Name() (string, error) { + return _ERC721.Contract.Name(&_ERC721.CallOpts) } // OwnerOf is a free data retrieval call binding the contract method 0x6352211e. // -// Solidity: function ownerOf(uint256 id) view returns(address owner) -func (_ERC721 *ERC721Caller) OwnerOf(opts *bind.CallOpts, id *big.Int) (common.Address, error) { +// Solidity: function ownerOf(uint256 tokenId) view returns(address) +func (_ERC721 *ERC721Caller) OwnerOf(opts *bind.CallOpts, tokenId *big.Int) (common.Address, error) { var out []interface{} - err := _ERC721.contract.Call(opts, &out, "ownerOf", id) + err := _ERC721.contract.Call(opts, &out, "ownerOf", tokenId) if err != nil { return *new(common.Address), err @@ -314,21 +376,21 @@ func (_ERC721 *ERC721Caller) OwnerOf(opts *bind.CallOpts, id *big.Int) (common.A // OwnerOf is a free data retrieval call binding the contract method 0x6352211e. // -// Solidity: function ownerOf(uint256 id) view returns(address owner) -func (_ERC721 *ERC721Session) OwnerOf(id *big.Int) (common.Address, error) { - return _ERC721.Contract.OwnerOf(&_ERC721.CallOpts, id) +// Solidity: function ownerOf(uint256 tokenId) view returns(address) +func (_ERC721 *ERC721Session) OwnerOf(tokenId *big.Int) (common.Address, error) { + return _ERC721.Contract.OwnerOf(&_ERC721.CallOpts, tokenId) } // OwnerOf is a free data retrieval call binding the contract method 0x6352211e. // -// Solidity: function ownerOf(uint256 id) view returns(address owner) -func (_ERC721 *ERC721CallerSession) OwnerOf(id *big.Int) (common.Address, error) { - return _ERC721.Contract.OwnerOf(&_ERC721.CallOpts, id) +// Solidity: function ownerOf(uint256 tokenId) view returns(address) +func (_ERC721 *ERC721CallerSession) OwnerOf(tokenId *big.Int) (common.Address, error) { + return _ERC721.Contract.OwnerOf(&_ERC721.CallOpts, tokenId) } // SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. // -// Solidity: function supportsInterface(bytes4 interfaceId) pure returns(bool) +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) func (_ERC721 *ERC721Caller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { var out []interface{} err := _ERC721.contract.Call(opts, &out, "supportsInterface", interfaceId) @@ -345,100 +407,162 @@ func (_ERC721 *ERC721Caller) SupportsInterface(opts *bind.CallOpts, interfaceId // SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. // -// Solidity: function supportsInterface(bytes4 interfaceId) pure returns(bool) +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) func (_ERC721 *ERC721Session) SupportsInterface(interfaceId [4]byte) (bool, error) { return _ERC721.Contract.SupportsInterface(&_ERC721.CallOpts, interfaceId) } // SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. // -// Solidity: function supportsInterface(bytes4 interfaceId) pure returns(bool) +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) func (_ERC721 *ERC721CallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { return _ERC721.Contract.SupportsInterface(&_ERC721.CallOpts, interfaceId) } +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_ERC721 *ERC721Caller) Symbol(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ERC721.contract.Call(opts, &out, "symbol") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_ERC721 *ERC721Session) Symbol() (string, error) { + return _ERC721.Contract.Symbol(&_ERC721.CallOpts) +} + +// Symbol is a free data retrieval call binding the contract method 0x95d89b41. +// +// Solidity: function symbol() view returns(string) +func (_ERC721 *ERC721CallerSession) Symbol() (string, error) { + return _ERC721.Contract.Symbol(&_ERC721.CallOpts) +} + +// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd. +// +// Solidity: function tokenURI(uint256 tokenId) view returns(string) +func (_ERC721 *ERC721Caller) TokenURI(opts *bind.CallOpts, tokenId *big.Int) (string, error) { + var out []interface{} + err := _ERC721.contract.Call(opts, &out, "tokenURI", tokenId) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd. +// +// Solidity: function tokenURI(uint256 tokenId) view returns(string) +func (_ERC721 *ERC721Session) TokenURI(tokenId *big.Int) (string, error) { + return _ERC721.Contract.TokenURI(&_ERC721.CallOpts, tokenId) +} + +// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd. +// +// Solidity: function tokenURI(uint256 tokenId) view returns(string) +func (_ERC721 *ERC721CallerSession) TokenURI(tokenId *big.Int) (string, error) { + return _ERC721.Contract.TokenURI(&_ERC721.CallOpts, tokenId) +} + // Approve is a paid mutator transaction binding the contract method 0x095ea7b3. // -// Solidity: function approve(address spender, uint256 id) returns() -func (_ERC721 *ERC721Transactor) Approve(opts *bind.TransactOpts, spender common.Address, id *big.Int) (*types.Transaction, error) { - return _ERC721.contract.Transact(opts, "approve", spender, id) +// Solidity: function approve(address to, uint256 tokenId) returns() +func (_ERC721 *ERC721Transactor) Approve(opts *bind.TransactOpts, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _ERC721.contract.Transact(opts, "approve", to, tokenId) } // Approve is a paid mutator transaction binding the contract method 0x095ea7b3. // -// Solidity: function approve(address spender, uint256 id) returns() -func (_ERC721 *ERC721Session) Approve(spender common.Address, id *big.Int) (*types.Transaction, error) { - return _ERC721.Contract.Approve(&_ERC721.TransactOpts, spender, id) +// Solidity: function approve(address to, uint256 tokenId) returns() +func (_ERC721 *ERC721Session) Approve(to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _ERC721.Contract.Approve(&_ERC721.TransactOpts, to, tokenId) } // Approve is a paid mutator transaction binding the contract method 0x095ea7b3. // -// Solidity: function approve(address spender, uint256 id) returns() -func (_ERC721 *ERC721TransactorSession) Approve(spender common.Address, id *big.Int) (*types.Transaction, error) { - return _ERC721.Contract.Approve(&_ERC721.TransactOpts, spender, id) +// Solidity: function approve(address to, uint256 tokenId) returns() +func (_ERC721 *ERC721TransactorSession) Approve(to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _ERC721.Contract.Approve(&_ERC721.TransactOpts, to, tokenId) } // MintBatch is a paid mutator transaction binding the contract method 0x248b71fc. // -// Solidity: function mintBatch(address to, uint256 quantity) returns() -func (_ERC721 *ERC721Transactor) MintBatch(opts *bind.TransactOpts, to common.Address, quantity *big.Int) (*types.Transaction, error) { - return _ERC721.contract.Transact(opts, "mintBatch", to, quantity) +// Solidity: function mintBatch(address to, uint256 amount) returns() +func (_ERC721 *ERC721Transactor) MintBatch(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ERC721.contract.Transact(opts, "mintBatch", to, amount) } // MintBatch is a paid mutator transaction binding the contract method 0x248b71fc. // -// Solidity: function mintBatch(address to, uint256 quantity) returns() -func (_ERC721 *ERC721Session) MintBatch(to common.Address, quantity *big.Int) (*types.Transaction, error) { - return _ERC721.Contract.MintBatch(&_ERC721.TransactOpts, to, quantity) +// Solidity: function mintBatch(address to, uint256 amount) returns() +func (_ERC721 *ERC721Session) MintBatch(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ERC721.Contract.MintBatch(&_ERC721.TransactOpts, to, amount) } // MintBatch is a paid mutator transaction binding the contract method 0x248b71fc. // -// Solidity: function mintBatch(address to, uint256 quantity) returns() -func (_ERC721 *ERC721TransactorSession) MintBatch(to common.Address, quantity *big.Int) (*types.Transaction, error) { - return _ERC721.Contract.MintBatch(&_ERC721.TransactOpts, to, quantity) +// Solidity: function mintBatch(address to, uint256 amount) returns() +func (_ERC721 *ERC721TransactorSession) MintBatch(to common.Address, amount *big.Int) (*types.Transaction, error) { + return _ERC721.Contract.MintBatch(&_ERC721.TransactOpts, to, amount) } // SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e. // -// Solidity: function safeTransferFrom(address from, address to, uint256 id) returns() -func (_ERC721 *ERC721Transactor) SafeTransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, id *big.Int) (*types.Transaction, error) { - return _ERC721.contract.Transact(opts, "safeTransferFrom", from, to, id) +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns() +func (_ERC721 *ERC721Transactor) SafeTransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _ERC721.contract.Transact(opts, "safeTransferFrom", from, to, tokenId) } // SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e. // -// Solidity: function safeTransferFrom(address from, address to, uint256 id) returns() -func (_ERC721 *ERC721Session) SafeTransferFrom(from common.Address, to common.Address, id *big.Int) (*types.Transaction, error) { - return _ERC721.Contract.SafeTransferFrom(&_ERC721.TransactOpts, from, to, id) +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns() +func (_ERC721 *ERC721Session) SafeTransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _ERC721.Contract.SafeTransferFrom(&_ERC721.TransactOpts, from, to, tokenId) } // SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e. // -// Solidity: function safeTransferFrom(address from, address to, uint256 id) returns() -func (_ERC721 *ERC721TransactorSession) SafeTransferFrom(from common.Address, to common.Address, id *big.Int) (*types.Transaction, error) { - return _ERC721.Contract.SafeTransferFrom(&_ERC721.TransactOpts, from, to, id) +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns() +func (_ERC721 *ERC721TransactorSession) SafeTransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _ERC721.Contract.SafeTransferFrom(&_ERC721.TransactOpts, from, to, tokenId) } // SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde. // -// Solidity: function safeTransferFrom(address from, address to, uint256 id, bytes data) returns() -func (_ERC721 *ERC721Transactor) SafeTransferFrom0(opts *bind.TransactOpts, from common.Address, to common.Address, id *big.Int, data []byte) (*types.Transaction, error) { - return _ERC721.contract.Transact(opts, "safeTransferFrom0", from, to, id, data) +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns() +func (_ERC721 *ERC721Transactor) SafeTransferFrom0(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) { + return _ERC721.contract.Transact(opts, "safeTransferFrom0", from, to, tokenId, data) } // SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde. // -// Solidity: function safeTransferFrom(address from, address to, uint256 id, bytes data) returns() -func (_ERC721 *ERC721Session) SafeTransferFrom0(from common.Address, to common.Address, id *big.Int, data []byte) (*types.Transaction, error) { - return _ERC721.Contract.SafeTransferFrom0(&_ERC721.TransactOpts, from, to, id, data) +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns() +func (_ERC721 *ERC721Session) SafeTransferFrom0(from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) { + return _ERC721.Contract.SafeTransferFrom0(&_ERC721.TransactOpts, from, to, tokenId, data) } // SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde. // -// Solidity: function safeTransferFrom(address from, address to, uint256 id, bytes data) returns() -func (_ERC721 *ERC721TransactorSession) SafeTransferFrom0(from common.Address, to common.Address, id *big.Int, data []byte) (*types.Transaction, error) { - return _ERC721.Contract.SafeTransferFrom0(&_ERC721.TransactOpts, from, to, id, data) +// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns() +func (_ERC721 *ERC721TransactorSession) SafeTransferFrom0(from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) { + return _ERC721.Contract.SafeTransferFrom0(&_ERC721.TransactOpts, from, to, tokenId, data) } // SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465. @@ -464,23 +588,23 @@ func (_ERC721 *ERC721TransactorSession) SetApprovalForAll(operator common.Addres // TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. // -// Solidity: function transferFrom(address from, address to, uint256 id) returns() -func (_ERC721 *ERC721Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, id *big.Int) (*types.Transaction, error) { - return _ERC721.contract.Transact(opts, "transferFrom", from, to, id) +// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns() +func (_ERC721 *ERC721Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _ERC721.contract.Transact(opts, "transferFrom", from, to, tokenId) } // TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. // -// Solidity: function transferFrom(address from, address to, uint256 id) returns() -func (_ERC721 *ERC721Session) TransferFrom(from common.Address, to common.Address, id *big.Int) (*types.Transaction, error) { - return _ERC721.Contract.TransferFrom(&_ERC721.TransactOpts, from, to, id) +// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns() +func (_ERC721 *ERC721Session) TransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _ERC721.Contract.TransferFrom(&_ERC721.TransactOpts, from, to, tokenId) } // TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. // -// Solidity: function transferFrom(address from, address to, uint256 id) returns() -func (_ERC721 *ERC721TransactorSession) TransferFrom(from common.Address, to common.Address, id *big.Int) (*types.Transaction, error) { - return _ERC721.Contract.TransferFrom(&_ERC721.TransactOpts, from, to, id) +// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns() +func (_ERC721 *ERC721TransactorSession) TransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _ERC721.Contract.TransferFrom(&_ERC721.TransactOpts, from, to, tokenId) } // ERC721ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the ERC721 contract. @@ -552,31 +676,31 @@ func (it *ERC721ApprovalIterator) Close() error { // ERC721Approval represents a Approval event raised by the ERC721 contract. type ERC721Approval struct { - Owner common.Address - Spender common.Address - Id *big.Int - Raw types.Log // Blockchain specific contextual infos + Owner common.Address + Approved common.Address + TokenId *big.Int + Raw types.Log // Blockchain specific contextual infos } // FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. // -// Solidity: event Approval(address indexed owner, address indexed spender, uint256 indexed id) -func (_ERC721 *ERC721Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address, id []*big.Int) (*ERC721ApprovalIterator, error) { +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) +func (_ERC721 *ERC721Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, approved []common.Address, tokenId []*big.Int) (*ERC721ApprovalIterator, error) { var ownerRule []interface{} for _, ownerItem := range owner { ownerRule = append(ownerRule, ownerItem) } - var spenderRule []interface{} - for _, spenderItem := range spender { - spenderRule = append(spenderRule, spenderItem) + var approvedRule []interface{} + for _, approvedItem := range approved { + approvedRule = append(approvedRule, approvedItem) } - var idRule []interface{} - for _, idItem := range id { - idRule = append(idRule, idItem) + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) } - logs, sub, err := _ERC721.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule, idRule) + logs, sub, err := _ERC721.contract.FilterLogs(opts, "Approval", ownerRule, approvedRule, tokenIdRule) if err != nil { return nil, err } @@ -585,23 +709,23 @@ func (_ERC721 *ERC721Filterer) FilterApproval(opts *bind.FilterOpts, owner []com // WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. // -// Solidity: event Approval(address indexed owner, address indexed spender, uint256 indexed id) -func (_ERC721 *ERC721Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *ERC721Approval, owner []common.Address, spender []common.Address, id []*big.Int) (event.Subscription, error) { +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) +func (_ERC721 *ERC721Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *ERC721Approval, owner []common.Address, approved []common.Address, tokenId []*big.Int) (event.Subscription, error) { var ownerRule []interface{} for _, ownerItem := range owner { ownerRule = append(ownerRule, ownerItem) } - var spenderRule []interface{} - for _, spenderItem := range spender { - spenderRule = append(spenderRule, spenderItem) + var approvedRule []interface{} + for _, approvedItem := range approved { + approvedRule = append(approvedRule, approvedItem) } - var idRule []interface{} - for _, idItem := range id { - idRule = append(idRule, idItem) + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) } - logs, sub, err := _ERC721.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule, idRule) + logs, sub, err := _ERC721.contract.WatchLogs(opts, "Approval", ownerRule, approvedRule, tokenIdRule) if err != nil { return nil, err } @@ -635,7 +759,7 @@ func (_ERC721 *ERC721Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- * // ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925. // -// Solidity: event Approval(address indexed owner, address indexed spender, uint256 indexed id) +// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId) func (_ERC721 *ERC721Filterer) ParseApproval(log types.Log) (*ERC721Approval, error) { event := new(ERC721Approval) if err := _ERC721.contract.UnpackLog(event, "Approval", log); err != nil { @@ -868,16 +992,16 @@ func (it *ERC721TransferIterator) Close() error { // ERC721Transfer represents a Transfer event raised by the ERC721 contract. type ERC721Transfer struct { - From common.Address - To common.Address - Id *big.Int - Raw types.Log // Blockchain specific contextual infos + From common.Address + To common.Address + TokenId *big.Int + Raw types.Log // Blockchain specific contextual infos } // FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. // -// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed id) -func (_ERC721 *ERC721Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address, id []*big.Int) (*ERC721TransferIterator, error) { +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) +func (_ERC721 *ERC721Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address, tokenId []*big.Int) (*ERC721TransferIterator, error) { var fromRule []interface{} for _, fromItem := range from { @@ -887,12 +1011,12 @@ func (_ERC721 *ERC721Filterer) FilterTransfer(opts *bind.FilterOpts, from []comm for _, toItem := range to { toRule = append(toRule, toItem) } - var idRule []interface{} - for _, idItem := range id { - idRule = append(idRule, idItem) + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) } - logs, sub, err := _ERC721.contract.FilterLogs(opts, "Transfer", fromRule, toRule, idRule) + logs, sub, err := _ERC721.contract.FilterLogs(opts, "Transfer", fromRule, toRule, tokenIdRule) if err != nil { return nil, err } @@ -901,8 +1025,8 @@ func (_ERC721 *ERC721Filterer) FilterTransfer(opts *bind.FilterOpts, from []comm // WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. // -// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed id) -func (_ERC721 *ERC721Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ERC721Transfer, from []common.Address, to []common.Address, id []*big.Int) (event.Subscription, error) { +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) +func (_ERC721 *ERC721Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ERC721Transfer, from []common.Address, to []common.Address, tokenId []*big.Int) (event.Subscription, error) { var fromRule []interface{} for _, fromItem := range from { @@ -912,12 +1036,12 @@ func (_ERC721 *ERC721Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- * for _, toItem := range to { toRule = append(toRule, toItem) } - var idRule []interface{} - for _, idItem := range id { - idRule = append(idRule, idItem) + var tokenIdRule []interface{} + for _, tokenIdItem := range tokenId { + tokenIdRule = append(tokenIdRule, tokenIdItem) } - logs, sub, err := _ERC721.contract.WatchLogs(opts, "Transfer", fromRule, toRule, idRule) + logs, sub, err := _ERC721.contract.WatchLogs(opts, "Transfer", fromRule, toRule, tokenIdRule) if err != nil { return nil, err } @@ -951,7 +1075,7 @@ func (_ERC721 *ERC721Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- * // ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. // -// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed id) +// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId) func (_ERC721 *ERC721Filterer) ParseTransfer(log types.Log) (*ERC721Transfer, error) { event := new(ERC721Transfer) if err := _ERC721.contract.UnpackLog(event, "Transfer", log); err != nil { diff --git a/contracts/uniswapv3/IUniswapV3Pool.abi b/bindings/uniswapv3/IUniswapV3Pool.abi similarity index 100% rename from contracts/uniswapv3/IUniswapV3Pool.abi rename to bindings/uniswapv3/IUniswapV3Pool.abi diff --git a/contracts/uniswapv3/IUniswapV3Pool.go b/bindings/uniswapv3/IUniswapV3Pool.go similarity index 100% rename from contracts/uniswapv3/IUniswapV3Pool.go rename to bindings/uniswapv3/IUniswapV3Pool.go diff --git a/contracts/uniswapv3/IUniswapV3Pool.json b/bindings/uniswapv3/IUniswapV3Pool.json similarity index 100% rename from contracts/uniswapv3/IUniswapV3Pool.json rename to bindings/uniswapv3/IUniswapV3Pool.json diff --git a/contracts/uniswapv3/NFTDescriptor.abi b/bindings/uniswapv3/NFTDescriptor.abi similarity index 100% rename from contracts/uniswapv3/NFTDescriptor.abi rename to bindings/uniswapv3/NFTDescriptor.abi diff --git a/contracts/uniswapv3/NFTDescriptor.bin b/bindings/uniswapv3/NFTDescriptor.bin similarity index 100% rename from contracts/uniswapv3/NFTDescriptor.bin rename to bindings/uniswapv3/NFTDescriptor.bin diff --git a/contracts/uniswapv3/NFTDescriptor.go b/bindings/uniswapv3/NFTDescriptor.go similarity index 100% rename from contracts/uniswapv3/NFTDescriptor.go rename to bindings/uniswapv3/NFTDescriptor.go diff --git a/contracts/uniswapv3/NFTDescriptor.json b/bindings/uniswapv3/NFTDescriptor.json similarity index 100% rename from contracts/uniswapv3/NFTDescriptor.json rename to bindings/uniswapv3/NFTDescriptor.json diff --git a/contracts/uniswapv3/NonfungiblePositionManager.abi b/bindings/uniswapv3/NonfungiblePositionManager.abi similarity index 100% rename from contracts/uniswapv3/NonfungiblePositionManager.abi rename to bindings/uniswapv3/NonfungiblePositionManager.abi diff --git a/contracts/uniswapv3/NonfungiblePositionManager.bin b/bindings/uniswapv3/NonfungiblePositionManager.bin similarity index 100% rename from contracts/uniswapv3/NonfungiblePositionManager.bin rename to bindings/uniswapv3/NonfungiblePositionManager.bin diff --git a/contracts/uniswapv3/NonfungiblePositionManager.go b/bindings/uniswapv3/NonfungiblePositionManager.go similarity index 100% rename from contracts/uniswapv3/NonfungiblePositionManager.go rename to bindings/uniswapv3/NonfungiblePositionManager.go diff --git a/contracts/uniswapv3/NonfungiblePositionManager.json b/bindings/uniswapv3/NonfungiblePositionManager.json similarity index 100% rename from contracts/uniswapv3/NonfungiblePositionManager.json rename to bindings/uniswapv3/NonfungiblePositionManager.json diff --git a/contracts/uniswapv3/NonfungibleTokenPositionDescriptor.abi b/bindings/uniswapv3/NonfungibleTokenPositionDescriptor.abi similarity index 100% rename from contracts/uniswapv3/NonfungibleTokenPositionDescriptor.abi rename to bindings/uniswapv3/NonfungibleTokenPositionDescriptor.abi diff --git a/contracts/uniswapv3/NonfungibleTokenPositionDescriptor.bin b/bindings/uniswapv3/NonfungibleTokenPositionDescriptor.bin similarity index 100% rename from contracts/uniswapv3/NonfungibleTokenPositionDescriptor.bin rename to bindings/uniswapv3/NonfungibleTokenPositionDescriptor.bin diff --git a/contracts/uniswapv3/NonfungibleTokenPositionDescriptor.go b/bindings/uniswapv3/NonfungibleTokenPositionDescriptor.go similarity index 100% rename from contracts/uniswapv3/NonfungibleTokenPositionDescriptor.go rename to bindings/uniswapv3/NonfungibleTokenPositionDescriptor.go diff --git a/contracts/uniswapv3/NonfungibleTokenPositionDescriptor.json b/bindings/uniswapv3/NonfungibleTokenPositionDescriptor.json similarity index 100% rename from contracts/uniswapv3/NonfungibleTokenPositionDescriptor.json rename to bindings/uniswapv3/NonfungibleTokenPositionDescriptor.json diff --git a/contracts/uniswapv3/ProxyAdmin.abi b/bindings/uniswapv3/ProxyAdmin.abi similarity index 100% rename from contracts/uniswapv3/ProxyAdmin.abi rename to bindings/uniswapv3/ProxyAdmin.abi diff --git a/contracts/uniswapv3/ProxyAdmin.bin b/bindings/uniswapv3/ProxyAdmin.bin similarity index 100% rename from contracts/uniswapv3/ProxyAdmin.bin rename to bindings/uniswapv3/ProxyAdmin.bin diff --git a/contracts/uniswapv3/ProxyAdmin.go b/bindings/uniswapv3/ProxyAdmin.go similarity index 100% rename from contracts/uniswapv3/ProxyAdmin.go rename to bindings/uniswapv3/ProxyAdmin.go diff --git a/contracts/uniswapv3/ProxyAdmin.json b/bindings/uniswapv3/ProxyAdmin.json similarity index 100% rename from contracts/uniswapv3/ProxyAdmin.json rename to bindings/uniswapv3/ProxyAdmin.json diff --git a/contracts/uniswapv3/QuoterV2.abi b/bindings/uniswapv3/QuoterV2.abi similarity index 100% rename from contracts/uniswapv3/QuoterV2.abi rename to bindings/uniswapv3/QuoterV2.abi diff --git a/contracts/uniswapv3/QuoterV2.bin b/bindings/uniswapv3/QuoterV2.bin similarity index 100% rename from contracts/uniswapv3/QuoterV2.bin rename to bindings/uniswapv3/QuoterV2.bin diff --git a/contracts/uniswapv3/QuoterV2.go b/bindings/uniswapv3/QuoterV2.go similarity index 100% rename from contracts/uniswapv3/QuoterV2.go rename to bindings/uniswapv3/QuoterV2.go diff --git a/contracts/uniswapv3/QuoterV2.json b/bindings/uniswapv3/QuoterV2.json similarity index 100% rename from contracts/uniswapv3/QuoterV2.json rename to bindings/uniswapv3/QuoterV2.json diff --git a/contracts/uniswapv3/README.org b/bindings/uniswapv3/README.org similarity index 100% rename from contracts/uniswapv3/README.org rename to bindings/uniswapv3/README.org diff --git a/contracts/uniswapv3/SwapRouter02.abi b/bindings/uniswapv3/SwapRouter02.abi similarity index 100% rename from contracts/uniswapv3/SwapRouter02.abi rename to bindings/uniswapv3/SwapRouter02.abi diff --git a/contracts/uniswapv3/SwapRouter02.bin b/bindings/uniswapv3/SwapRouter02.bin similarity index 100% rename from contracts/uniswapv3/SwapRouter02.bin rename to bindings/uniswapv3/SwapRouter02.bin diff --git a/contracts/uniswapv3/SwapRouter02.go b/bindings/uniswapv3/SwapRouter02.go similarity index 100% rename from contracts/uniswapv3/SwapRouter02.go rename to bindings/uniswapv3/SwapRouter02.go diff --git a/contracts/uniswapv3/SwapRouter02.json b/bindings/uniswapv3/SwapRouter02.json similarity index 100% rename from contracts/uniswapv3/SwapRouter02.json rename to bindings/uniswapv3/SwapRouter02.json diff --git a/contracts/uniswapv3/Swapper.abi b/bindings/uniswapv3/Swapper.abi similarity index 100% rename from contracts/uniswapv3/Swapper.abi rename to bindings/uniswapv3/Swapper.abi diff --git a/contracts/uniswapv3/Swapper.bin b/bindings/uniswapv3/Swapper.bin similarity index 100% rename from contracts/uniswapv3/Swapper.bin rename to bindings/uniswapv3/Swapper.bin diff --git a/contracts/uniswapv3/Swapper.go b/bindings/uniswapv3/Swapper.go similarity index 100% rename from contracts/uniswapv3/Swapper.go rename to bindings/uniswapv3/Swapper.go diff --git a/contracts/uniswapv3/Swapper.json b/bindings/uniswapv3/Swapper.json similarity index 100% rename from contracts/uniswapv3/Swapper.json rename to bindings/uniswapv3/Swapper.json diff --git a/contracts/uniswapv3/Swapper.sol b/bindings/uniswapv3/Swapper.sol similarity index 100% rename from contracts/uniswapv3/Swapper.sol rename to bindings/uniswapv3/Swapper.sol diff --git a/contracts/uniswapv3/TickLens.abi b/bindings/uniswapv3/TickLens.abi similarity index 100% rename from contracts/uniswapv3/TickLens.abi rename to bindings/uniswapv3/TickLens.abi diff --git a/contracts/uniswapv3/TickLens.bin b/bindings/uniswapv3/TickLens.bin similarity index 100% rename from contracts/uniswapv3/TickLens.bin rename to bindings/uniswapv3/TickLens.bin diff --git a/contracts/uniswapv3/TickLens.go b/bindings/uniswapv3/TickLens.go similarity index 100% rename from contracts/uniswapv3/TickLens.go rename to bindings/uniswapv3/TickLens.go diff --git a/contracts/uniswapv3/TickLens.json b/bindings/uniswapv3/TickLens.json similarity index 100% rename from contracts/uniswapv3/TickLens.json rename to bindings/uniswapv3/TickLens.json diff --git a/contracts/uniswapv3/TransparentUpgradeableProxy.abi b/bindings/uniswapv3/TransparentUpgradeableProxy.abi similarity index 100% rename from contracts/uniswapv3/TransparentUpgradeableProxy.abi rename to bindings/uniswapv3/TransparentUpgradeableProxy.abi diff --git a/contracts/uniswapv3/TransparentUpgradeableProxy.bin b/bindings/uniswapv3/TransparentUpgradeableProxy.bin similarity index 100% rename from contracts/uniswapv3/TransparentUpgradeableProxy.bin rename to bindings/uniswapv3/TransparentUpgradeableProxy.bin diff --git a/contracts/uniswapv3/TransparentUpgradeableProxy.go b/bindings/uniswapv3/TransparentUpgradeableProxy.go similarity index 100% rename from contracts/uniswapv3/TransparentUpgradeableProxy.go rename to bindings/uniswapv3/TransparentUpgradeableProxy.go diff --git a/contracts/uniswapv3/TransparentUpgradeableProxy.json b/bindings/uniswapv3/TransparentUpgradeableProxy.json similarity index 100% rename from contracts/uniswapv3/TransparentUpgradeableProxy.json rename to bindings/uniswapv3/TransparentUpgradeableProxy.json diff --git a/contracts/uniswapv3/UniswapInterfaceMulticall.abi b/bindings/uniswapv3/UniswapInterfaceMulticall.abi similarity index 100% rename from contracts/uniswapv3/UniswapInterfaceMulticall.abi rename to bindings/uniswapv3/UniswapInterfaceMulticall.abi diff --git a/contracts/uniswapv3/UniswapInterfaceMulticall.bin b/bindings/uniswapv3/UniswapInterfaceMulticall.bin similarity index 100% rename from contracts/uniswapv3/UniswapInterfaceMulticall.bin rename to bindings/uniswapv3/UniswapInterfaceMulticall.bin diff --git a/contracts/uniswapv3/UniswapInterfaceMulticall.go b/bindings/uniswapv3/UniswapInterfaceMulticall.go similarity index 100% rename from contracts/uniswapv3/UniswapInterfaceMulticall.go rename to bindings/uniswapv3/UniswapInterfaceMulticall.go diff --git a/contracts/uniswapv3/UniswapInterfaceMulticall.json b/bindings/uniswapv3/UniswapInterfaceMulticall.json similarity index 100% rename from contracts/uniswapv3/UniswapInterfaceMulticall.json rename to bindings/uniswapv3/UniswapInterfaceMulticall.json diff --git a/contracts/uniswapv3/UniswapV3Factory.abi b/bindings/uniswapv3/UniswapV3Factory.abi similarity index 100% rename from contracts/uniswapv3/UniswapV3Factory.abi rename to bindings/uniswapv3/UniswapV3Factory.abi diff --git a/contracts/uniswapv3/UniswapV3Factory.bin b/bindings/uniswapv3/UniswapV3Factory.bin similarity index 100% rename from contracts/uniswapv3/UniswapV3Factory.bin rename to bindings/uniswapv3/UniswapV3Factory.bin diff --git a/contracts/uniswapv3/UniswapV3Factory.go b/bindings/uniswapv3/UniswapV3Factory.go similarity index 100% rename from contracts/uniswapv3/UniswapV3Factory.go rename to bindings/uniswapv3/UniswapV3Factory.go diff --git a/contracts/uniswapv3/UniswapV3Factory.json b/bindings/uniswapv3/UniswapV3Factory.json similarity index 100% rename from contracts/uniswapv3/UniswapV3Factory.json rename to bindings/uniswapv3/UniswapV3Factory.json diff --git a/contracts/uniswapv3/UniswapV3Staker.abi b/bindings/uniswapv3/UniswapV3Staker.abi similarity index 100% rename from contracts/uniswapv3/UniswapV3Staker.abi rename to bindings/uniswapv3/UniswapV3Staker.abi diff --git a/contracts/uniswapv3/UniswapV3Staker.bin b/bindings/uniswapv3/UniswapV3Staker.bin similarity index 100% rename from contracts/uniswapv3/UniswapV3Staker.bin rename to bindings/uniswapv3/UniswapV3Staker.bin diff --git a/contracts/uniswapv3/UniswapV3Staker.go b/bindings/uniswapv3/UniswapV3Staker.go similarity index 100% rename from contracts/uniswapv3/UniswapV3Staker.go rename to bindings/uniswapv3/UniswapV3Staker.go diff --git a/contracts/uniswapv3/UniswapV3Staker.json b/bindings/uniswapv3/UniswapV3Staker.json similarity index 100% rename from contracts/uniswapv3/UniswapV3Staker.json rename to bindings/uniswapv3/UniswapV3Staker.json diff --git a/contracts/uniswapv3/V3Migrator.abi b/bindings/uniswapv3/V3Migrator.abi similarity index 100% rename from contracts/uniswapv3/V3Migrator.abi rename to bindings/uniswapv3/V3Migrator.abi diff --git a/contracts/uniswapv3/V3Migrator.bin b/bindings/uniswapv3/V3Migrator.bin similarity index 100% rename from contracts/uniswapv3/V3Migrator.bin rename to bindings/uniswapv3/V3Migrator.bin diff --git a/contracts/uniswapv3/V3Migrator.go b/bindings/uniswapv3/V3Migrator.go similarity index 100% rename from contracts/uniswapv3/V3Migrator.go rename to bindings/uniswapv3/V3Migrator.go diff --git a/contracts/uniswapv3/V3Migrator.json b/bindings/uniswapv3/V3Migrator.json similarity index 100% rename from contracts/uniswapv3/V3Migrator.json rename to bindings/uniswapv3/V3Migrator.json diff --git a/contracts/uniswapv3/WETH9.abi b/bindings/uniswapv3/WETH9.abi similarity index 100% rename from contracts/uniswapv3/WETH9.abi rename to bindings/uniswapv3/WETH9.abi diff --git a/contracts/uniswapv3/WETH9.bin b/bindings/uniswapv3/WETH9.bin similarity index 100% rename from contracts/uniswapv3/WETH9.bin rename to bindings/uniswapv3/WETH9.bin diff --git a/contracts/uniswapv3/WETH9.go b/bindings/uniswapv3/WETH9.go similarity index 100% rename from contracts/uniswapv3/WETH9.go rename to bindings/uniswapv3/WETH9.go diff --git a/contracts/uniswapv3/WETH9.json b/bindings/uniswapv3/WETH9.json similarity index 100% rename from contracts/uniswapv3/WETH9.json rename to bindings/uniswapv3/WETH9.json diff --git a/cmd/loadtest/loadtest.go b/cmd/loadtest/loadtest.go index 326029df..ecef3ffb 100644 --- a/cmd/loadtest/loadtest.go +++ b/cmd/loadtest/loadtest.go @@ -15,11 +15,10 @@ import ( "sync" "time" + "github.com/maticnetwork/polygon-cli/bindings/tester" + "github.com/maticnetwork/polygon-cli/bindings/tokens" uniswapv3loadtest "github.com/maticnetwork/polygon-cli/cmd/loadtest/uniswapv3" - "github.com/maticnetwork/polygon-cli/contracts" - "github.com/maticnetwork/polygon-cli/contracts/tokens" - "github.com/maticnetwork/polygon-cli/metrics" "github.com/maticnetwork/polygon-cli/rpctypes" "github.com/maticnetwork/polygon-cli/util" @@ -473,7 +472,7 @@ func mainLoop(ctx context.Context, c *ethclient.Client, rpc *ethrpc.Client) erro // deploy and instantiate the load tester contract var ltAddr ethcommon.Address - var ltContract *contracts.LoadTester + var ltContract *tester.LoadTester if anyModeRequiresLoadTestContract(ltp.ParsedModes) || *inputLoadTestParams.ForceContractDeploy { ltAddr, ltContract, err = getLoadTestContract(ctx, c, tops, cops) if err != nil { @@ -660,11 +659,11 @@ func mainLoop(ctx context.Context, c *ethclient.Client, rpc *ethrpc.Client) erro return nil } -func getLoadTestContract(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts) (ltAddr ethcommon.Address, ltContract *contracts.LoadTester, err error) { +func getLoadTestContract(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts) (ltAddr ethcommon.Address, ltContract *tester.LoadTester, err error) { ltAddr = ethcommon.HexToAddress(*inputLoadTestParams.LtAddress) if *inputLoadTestParams.LtAddress == "" { - ltAddr, _, _, err = contracts.DeployLoadTester(tops, c) + ltAddr, _, _, err = tester.DeployLoadTester(tops, c) if err != nil { log.Error().Err(err).Msg("Failed to create the load testing contract. Do you have the right chain id? Do you have enough funds?") return @@ -672,7 +671,7 @@ func getLoadTestContract(ctx context.Context, c *ethclient.Client, tops *bind.Tr } log.Trace().Interface("contractaddress", ltAddr).Msg("Load test contract address") - ltContract, err = contracts.NewLoadTester(ltAddr, c) + ltContract, err = tester.NewLoadTester(ltAddr, c) if err != nil { log.Error().Err(err).Msg("Unable to instantiate new contract") return @@ -686,15 +685,13 @@ func getLoadTestContract(ctx context.Context, c *ethclient.Client, tops *bind.Tr } func getERC20Contract(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts) (erc20Addr ethcommon.Address, erc20Contract *tokens.ERC20, err error) { erc20Addr = ethcommon.HexToAddress(*inputLoadTestParams.ERC20Address) - shouldMint := false if *inputLoadTestParams.ERC20Address == "" { - erc20Addr, _, _, err = tokens.DeployERC20(tops, c, "ERC20TestToken", "T20") + erc20Addr, _, _, err = tokens.DeployERC20(tops, c) if err != nil { log.Error().Err(err).Msg("Unable to deploy ERC20 contract") return } - // if we're deploying a new ERC 20 we should mint tokens - shouldMint = true + // Tokens already minted and sent to the address of the deployer. } log.Trace().Interface("contractaddress", erc20Addr).Msg("ERC20 contract address") @@ -704,23 +701,6 @@ func getERC20Contract(ctx context.Context, c *ethclient.Client, tops *bind.Trans return } - err = blockUntilSuccessful(ctx, c, func() error { - _, err = erc20Contract.BalanceOf(cops, *inputLoadTestParams.FromETHAddress) - return err - }) - if err != nil { - return - } - - if !shouldMint { - return - } - _, err = erc20Contract.Mint(tops, metrics.UnitMegaether) - if err != nil { - log.Error().Err(err).Msg("There was an error minting ERC20") - return - } - err = blockUntilSuccessful(ctx, c, func() error { var balance *big.Int balance, err = erc20Contract.BalanceOf(cops, *inputLoadTestParams.FromETHAddress) @@ -774,7 +754,7 @@ func getERC721Contract(ctx context.Context, c *ethclient.Client, tops *bind.Tran } func blockUntilSuccessful(ctx context.Context, c *ethclient.Client, retryable func() error) error { - return contracts.BlockUntilSuccessful(ctx, c, retryable) + return tester.BlockUntilSuccessful(ctx, c, retryable) } func loadTestTransaction(ctx context.Context, c *ethclient.Client, nonce uint64) (t1 time.Time, t2 time.Time, err error) { @@ -922,10 +902,10 @@ func loadTestDeploy(ctx context.Context, c *ethclient.Client, nonce uint64) (t1 defer func() { t2 = time.Now() }() if *ltp.CallOnly { msg := transactOptsToCallMsg(tops) - msg.Data = ethcommon.FromHex(contracts.LoadTesterMetaData.Bin) + msg.Data = ethcommon.FromHex(tester.LoadTesterMetaData.Bin) _, err = c.CallContract(ctx, msg, nil) } else { - _, _, _, err = contracts.DeployLoadTester(tops, c) + _, _, _, err = tester.DeployLoadTester(tops, c) } return } @@ -938,9 +918,9 @@ func getCurrentLoadTestFunction() uint64 { if loadTestModeFunction == inputLoadTestParams.Mode { return *inputLoadTestParams.Function } - return contracts.GetRandomOPCode() + return tester.GetRandomOPCode() } -func loadTestFunction(ctx context.Context, c *ethclient.Client, nonce uint64, ltContract *contracts.LoadTester) (t1 time.Time, t2 time.Time, err error) { +func loadTestFunction(ctx context.Context, c *ethclient.Client, nonce uint64, ltContract *tester.LoadTester) (t1 time.Time, t2 time.Time, err error) { ltp := inputLoadTestParams chainID := new(big.Int).SetUint64(*ltp.ChainID) @@ -961,19 +941,19 @@ func loadTestFunction(ctx context.Context, c *ethclient.Client, nonce uint64, lt if *ltp.CallOnly { tops.NoSend = true var tx *ethtypes.Transaction - tx, err = contracts.CallLoadTestFunctionByOpCode(f, ltContract, tops, *iterations) + tx, err = tester.CallLoadTestFunctionByOpCode(f, ltContract, tops, *iterations) if err != nil { return } msg := txToCallMsg(tx) _, err = c.CallContract(ctx, msg, nil) } else { - _, err = contracts.CallLoadTestFunctionByOpCode(f, ltContract, tops, *iterations) + _, err = tester.CallLoadTestFunctionByOpCode(f, ltContract, tops, *iterations) } return } -func loadTestCallPrecompiledContracts(ctx context.Context, c *ethclient.Client, nonce uint64, ltContract *contracts.LoadTester, useSelectedAddress bool) (t1 time.Time, t2 time.Time, err error) { +func loadTestCallPrecompiledContracts(ctx context.Context, c *ethclient.Client, nonce uint64, ltContract *tester.LoadTester, useSelectedAddress bool) (t1 time.Time, t2 time.Time, err error) { var f int ltp := inputLoadTestParams @@ -983,7 +963,7 @@ func loadTestCallPrecompiledContracts(ctx context.Context, c *ethclient.Client, if useSelectedAddress { f = int(*ltp.Function) } else { - f = contracts.GetRandomPrecompiledContractAddress() + f = tester.GetRandomPrecompiledContractAddress() } tops, err := bind.NewKeyedTransactorWithChainID(privateKey, chainID) @@ -999,19 +979,19 @@ func loadTestCallPrecompiledContracts(ctx context.Context, c *ethclient.Client, if *ltp.CallOnly { tops.NoSend = true var tx *ethtypes.Transaction - tx, err = contracts.CallPrecompiledContracts(f, ltContract, tops, *iterations, privateKey) + tx, err = tester.CallPrecompiledContracts(f, ltContract, tops, *iterations, privateKey) if err != nil { return } msg := txToCallMsg(tx) _, err = c.CallContract(ctx, msg, nil) } else { - _, err = contracts.CallPrecompiledContracts(f, ltContract, tops, *iterations, privateKey) + _, err = tester.CallPrecompiledContracts(f, ltContract, tops, *iterations, privateKey) } return } -func loadTestInc(ctx context.Context, c *ethclient.Client, nonce uint64, ltContract *contracts.LoadTester) (t1 time.Time, t2 time.Time, err error) { +func loadTestInc(ctx context.Context, c *ethclient.Client, nonce uint64, ltContract *tester.LoadTester) (t1 time.Time, t2 time.Time, err error) { ltp := inputLoadTestParams chainID := new(big.Int).SetUint64(*ltp.ChainID) @@ -1042,7 +1022,7 @@ func loadTestInc(ctx context.Context, c *ethclient.Client, nonce uint64, ltContr return } -func loadTestStore(ctx context.Context, c *ethclient.Client, nonce uint64, ltContract *contracts.LoadTester) (t1 time.Time, t2 time.Time, err error) { +func loadTestStore(ctx context.Context, c *ethclient.Client, nonce uint64, ltContract *tester.LoadTester) (t1 time.Time, t2 time.Time, err error) { ltp := inputLoadTestParams chainID := new(big.Int).SetUint64(*ltp.ChainID) diff --git a/cmd/loadtest/uniswapv3.go b/cmd/loadtest/uniswapv3.go index 044e345c..ff25d87a 100644 --- a/cmd/loadtest/uniswapv3.go +++ b/cmd/loadtest/uniswapv3.go @@ -13,8 +13,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" + "github.com/maticnetwork/polygon-cli/bindings/uniswapv3" uniswapv3loadtest "github.com/maticnetwork/polygon-cli/cmd/loadtest/uniswapv3" - "github.com/maticnetwork/polygon-cli/contracts/uniswapv3" "github.com/rs/zerolog/log" ) diff --git a/cmd/loadtest/uniswapv3/deploy.go b/cmd/loadtest/uniswapv3/deploy.go index 77185ab0..37bf51d7 100644 --- a/cmd/loadtest/uniswapv3/deploy.go +++ b/cmd/loadtest/uniswapv3/deploy.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" - "github.com/maticnetwork/polygon-cli/contracts" - "github.com/maticnetwork/polygon-cli/contracts/uniswapv3" + "github.com/maticnetwork/polygon-cli/bindings/tester" + "github.com/maticnetwork/polygon-cli/bindings/uniswapv3" "github.com/rs/zerolog/log" ) @@ -71,7 +71,7 @@ type ( // Deploy the full UniswapV3 contract suite in 15 different steps. // Source: https://github.com/Uniswap/deploy-v3 -func DeployUniswapV3(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, knownAddresses UniswapV3Addresses, ownerAddress common.Address, blockblockUntilSuccessful contracts.BlockUntilSuccessfulFn) (config UniswapV3Config, err error) { +func DeployUniswapV3(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, knownAddresses UniswapV3Addresses, ownerAddress common.Address, blockblockUntilSuccessful tester.BlockUntilSuccessfulFn) (config UniswapV3Config, err error) { log.Debug().Msg("Step 0: WETH9 deployment") config.WETH9.Address, config.WETH9.Contract, err = deployOrInstantiateContract( ctx, c, tops, cops, @@ -344,7 +344,7 @@ func deployOrInstantiateContract[T Contract]( deploy func(*bind.TransactOpts, bind.ContractBackend) (common.Address, *types.Transaction, *T, error), instantiate func(common.Address, bind.ContractBackend) (*T, error), call func(*T) error, - blockUntilSuccessful contracts.BlockUntilSuccessfulFn, + blockUntilSuccessful tester.BlockUntilSuccessfulFn, ) (address common.Address, contract *T, err error) { if knownAddress == (common.Address{}) { // Deploy the contract if known address is empty. diff --git a/cmd/loadtest/uniswapv3/pool.go b/cmd/loadtest/uniswapv3/pool.go index d77c756c..5fa953ec 100644 --- a/cmd/loadtest/uniswapv3/pool.go +++ b/cmd/loadtest/uniswapv3/pool.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" - "github.com/maticnetwork/polygon-cli/contracts" - "github.com/maticnetwork/polygon-cli/contracts/uniswapv3" + "github.com/maticnetwork/polygon-cli/bindings/tester" + "github.com/maticnetwork/polygon-cli/bindings/uniswapv3" "github.com/rs/zerolog/log" ) @@ -90,7 +90,7 @@ type slot struct { // SetupLiquidityPool sets up a UniswapV3 liquidity pool, creating and initializing it if needed, // and providing liquidity in case none exists. -func SetupLiquidityPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, recipient common.Address, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) error { +func SetupLiquidityPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, recipient common.Address, blockUntilSuccessful tester.BlockUntilSuccessfulFn) error { // Create and initialise pool. poolContract, err := createPool(ctx, c, tops, cops, uniswapV3Config, poolConfig, blockUntilSuccessful) if err != nil { @@ -119,7 +119,7 @@ func SetupLiquidityPool(ctx context.Context, c *ethclient.Client, tops *bind.Tra } // createPool creates and initialises the UniswapV3 liquidity pool if needed. -func createPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) (*uniswapv3.IUniswapV3Pool, error) { +func createPool(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, poolConfig PoolConfig, blockUntilSuccessful tester.BlockUntilSuccessfulFn) (*uniswapv3.IUniswapV3Pool, error) { // Create and initialize the pool. sqrtPriceX96 := computeSqrtPriceX96(poolConfig.ReserveA, poolConfig.ReserveB) if _, err := uniswapV3Config.NonfungiblePositionManager.Contract.CreateAndInitializePoolIfNecessary(tops, poolConfig.Token0.Address, poolConfig.Token1.Address, poolConfig.Fees, sqrtPriceX96); err != nil { @@ -186,7 +186,7 @@ func getPoolState(cops *bind.CallOpts, contract *uniswapv3.IUniswapV3Pool) (slot } // provideLiquidity provides liquidity to the UniswapV3 pool. -func provideLiquidity(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, poolContract *uniswapv3.IUniswapV3Pool, poolConfig PoolConfig, recipient common.Address, nftPositionManagerContract *uniswapv3.NonfungiblePositionManager, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) error { +func provideLiquidity(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, poolContract *uniswapv3.IUniswapV3Pool, poolConfig PoolConfig, recipient common.Address, nftPositionManagerContract *uniswapv3.NonfungiblePositionManager, blockUntilSuccessful tester.BlockUntilSuccessfulFn) error { // Compute the tick lower and upper for providing liquidity. // The default tick spacing is set to 60 for the 0.3% fee tier and unfortunately, `MIN_TICK` and // `MAX_TICK` are not divisible by this amount. The solution is to use a multiple of 60 instead. diff --git a/cmd/loadtest/uniswapv3/swap.go b/cmd/loadtest/uniswapv3/swap.go index 33603889..0b7beabd 100644 --- a/cmd/loadtest/uniswapv3/swap.go +++ b/cmd/loadtest/uniswapv3/swap.go @@ -5,7 +5,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/maticnetwork/polygon-cli/contracts/uniswapv3" + "github.com/maticnetwork/polygon-cli/bindings/uniswapv3" "github.com/rs/zerolog/log" ) diff --git a/cmd/loadtest/uniswapv3/swapper.go b/cmd/loadtest/uniswapv3/swapper.go index c5d9e8ed..1d43e8df 100644 --- a/cmd/loadtest/uniswapv3/swapper.go +++ b/cmd/loadtest/uniswapv3/swapper.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" - "github.com/maticnetwork/polygon-cli/contracts" - "github.com/maticnetwork/polygon-cli/contracts/uniswapv3" + "github.com/maticnetwork/polygon-cli/bindings/tester" + "github.com/maticnetwork/polygon-cli/bindings/uniswapv3" "github.com/rs/zerolog/log" ) @@ -25,7 +25,7 @@ var ( ) // Deploy an ERC20 token. -func DeployERC20(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, tokenName, tokenSymbol string, amount *big.Int, recipient common.Address, tokenKnownAddress common.Address, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) (tokenConfig ContractConfig[uniswapv3.Swapper], err error) { +func DeployERC20(ctx context.Context, c *ethclient.Client, tops *bind.TransactOpts, cops *bind.CallOpts, uniswapV3Config UniswapV3Config, tokenName, tokenSymbol string, amount *big.Int, recipient common.Address, tokenKnownAddress common.Address, blockUntilSuccessful tester.BlockUntilSuccessfulFn) (tokenConfig ContractConfig[uniswapv3.Swapper], err error) { tokenConfig.Address, tokenConfig.Contract, err = deployOrInstantiateContract( ctx, c, tops, cops, tokenKnownAddress, @@ -59,7 +59,7 @@ func DeployERC20(ctx context.Context, c *ethclient.Client, tops *bind.TransactOp } // Approve some UniswapV3 addresses to spend tokens on behalf of the token owner. -func setUniswapV3Allowances(ctx context.Context, c *ethclient.Client, contract *uniswapv3.Swapper, tops *bind.TransactOpts, cops *bind.CallOpts, tokenName string, addresses map[string]common.Address, owner common.Address, blockUntilSuccessful contracts.BlockUntilSuccessfulFn) error { +func setUniswapV3Allowances(ctx context.Context, c *ethclient.Client, contract *uniswapv3.Swapper, tops *bind.TransactOpts, cops *bind.CallOpts, tokenName string, addresses map[string]common.Address, owner common.Address, blockUntilSuccessful tester.BlockUntilSuccessfulFn) error { // Get the ERC20 contract name. erc20Name, err := contract.Name(cops) if err != nil { diff --git a/cmd/rpcfuzz/rpcfuzz.go b/cmd/rpcfuzz/rpcfuzz.go index d622a409..c8aac3b5 100644 --- a/cmd/rpcfuzz/rpcfuzz.go +++ b/cmd/rpcfuzz/rpcfuzz.go @@ -36,9 +36,8 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/rpc" fuzz "github.com/google/gofuzz" + "github.com/maticnetwork/polygon-cli/bindings/tester" "github.com/maticnetwork/polygon-cli/cmd/rpcfuzz/testreporter" - "github.com/maticnetwork/polygon-cli/contracts" - "github.com/maticnetwork/polygon-cli/contracts/conformancetester" "github.com/maticnetwork/polygon-cli/rpctypes" "github.com/rs/zerolog/log" "github.com/xeipuuv/gojsonschema" @@ -191,7 +190,7 @@ var ( testResultMutex sync.Mutex ) -func getConformanceContract(ctx context.Context, rpc *rpc.Client, chainID *big.Int) (conformanceContractAddrStr string, conformanceContract *conformancetester.ConformanceTester, err error) { +func getConformanceContract(ctx context.Context, rpc *rpc.Client, chainID *big.Int) (conformanceContractAddrStr string, conformanceContract *tester.ConformanceTester, err error) { log.Trace().Msg("Deploying Conformance contract...") var conformanceContractAddr ethcommon.Address ec := ethclient.NewClient(rpc) @@ -202,7 +201,7 @@ func getConformanceContract(ctx context.Context, rpc *rpc.Client, chainID *big.I } cops := new(bind.CallOpts) - conformanceContractAddr, conformanceContract, err = contracts.DeployConformanceContract(ctx, ec, tops, cops) + conformanceContractAddr, conformanceContract, err = tester.DeployConformanceContract(ctx, ec, tops, cops) conformanceContractAddrStr = conformanceContractAddr.String() log.Trace().Msg("Finished Deploying Conformance contract...") diff --git a/contracts/.gitignore b/contracts/.gitignore new file mode 100644 index 00000000..85198aaa --- /dev/null +++ b/contracts/.gitignore @@ -0,0 +1,14 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ + +# Docs +docs/ + +# Dotenv file +.env diff --git a/contracts/Makefile b/contracts/Makefile new file mode 100644 index 00000000..6f7b7624 --- /dev/null +++ b/contracts/Makefile @@ -0,0 +1,40 @@ +##@ Help + +.PHONY: help +help: ## Display this help. + @awk 'BEGIN {FS = ":.*##"; printf "Usage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +##@ Build + +.PHONY: build +build: ## Build the smart contracts + FOUNDRY_PROFILE=lite forge build + +##@ Gen go bindings + +.PHONY: gen-tester-go-bindings +gen-tester-go-bindings: ## Generate go bindings for the tester contracts. + cat ./out/LoadTester.sol/LoadTester.json | jq -r '.abi' > ../bindings/tester/LoadTester.abi + cat ./out/LoadTester.sol/LoadTester.json | jq -r '.bytecode.object' > ../bindings/tester/LoadTester.bin + abigen --abi ../bindings/tester/LoadTester.abi --bin ../bindings/tester/LoadTester.bin --pkg tester --type LoadTester --out ../bindings/tester/loadTester.go + @echo "✅ tester/loadTester.go generated" + + cat ./out/ConformanceTester.sol/ConformanceTester.json | jq -r '.abi' > ../bindings/tester/ConformanceTester.abi + cat ./out/ConformanceTester.sol/ConformanceTester.json | jq -r '.bytecode.object' > ../bindings/tester/ConformanceTester.bin + abigen --abi ../bindings/tester/ConformanceTester.abi --bin ../bindings/tester/ConformanceTester.bin --pkg tester --type ConformanceTester --out ../bindings/tester/conformanceTester.go + @echo "✅ tester/conformanceTester.go generated" + +.PHONY: gen-tokens-go-bindings +gen-tokens-go-bindings: ## Generate go bindings for the tokens contracts. + cat ./out/ERC20.sol/ERC20.json | jq -r '.abi' > ../bindings/tokens/ERC20.abi + cat ./out/ERC20.sol/ERC20.json | jq -r '.bytecode.object' > ../bindings/tokens/ERC20.bin + abigen --abi ../bindings/tokens/ERC20.abi --bin ../bindings/tokens/ERC20.bin --pkg tokens --type ERC20 --out ../bindings/tokens/ERC20.go + @echo "✅ tokens/ERC20.go generated" + + cat ./out/ERC721.sol/ERC721.json | jq -r '.abi' > ../bindings/tokens/ERC721.abi + cat ./out/ERC721.sol/ERC721.json | jq -r '.bytecode.object' > ../bindings/tokens/ERC721.bin + abigen --abi ../bindings/tokens/ERC721.abi --bin ../bindings/tokens/ERC721.bin --pkg tokens --type ERC721 --out ../bindings/tokens/ERC721.go + @echo "✅ tokens/ERC721.go generated" + +.PHONY: gen-go-bindings +gen-go-bindings: build gen-tester-go-bindings gen-tokens-go-bindings ## Generate go bindings. diff --git a/contracts/README.md b/contracts/README.md new file mode 100644 index 00000000..c6f6e72a --- /dev/null +++ b/contracts/README.md @@ -0,0 +1,51 @@ +# Contracts + +Smart contracts used to perform different types of tests: + +- `tester/` to call various opcodes, precompiles, and store random data with `LoadTester` and test revert reason string with `ConformanceTester`. +- `tokens/` to perform ERC20 transfers or ERC721 mints for example. +- Other: `asm/` and `yul/`, contracts written in other languages than Solidity. + +## Generate go bindings + +```bash +$ make gen-go-bindings +FOUNDRY_PROFILE=lite forge build +[⠒] Compiling... +No files changed, compilation skipped +cat ./out/LoadTester.sol/LoadTester.json | jq -r '.abi' > ../bindings/tester/LoadTester.abi +cat ./out/LoadTester.sol/LoadTester.json | jq -r '.bytecode.object' > ../bindings/tester/LoadTester.bin +abigen --abi ../bindings/tester/LoadTester.abi --bin ../bindings/tester/LoadTester.bin --pkg tester --type LoadTester --out ../bindings/tester/loadTester.go +✅ tester/loadTester.go generated +cat ./out/ConformanceTester.sol/ConformanceTester.json | jq -r '.abi' > ../bindings/tester/ConformanceTester.abi +cat ./out/ConformanceTester.sol/ConformanceTester.json | jq -r '.bytecode.object' > ../bindings/tester/ConformanceTester.bin +abigen --abi ../bindings/tester/ConformanceTester.abi --bin ../bindings/tester/ConformanceTester.bin --pkg tester --type ConformanceTester --out ../bindings/tester/conformanceTester.go +✅ tester/conformanceTester.go generated +cat ./out/ERC20.sol/ERC20.json | jq -r '.abi' > ../bindings/tokens/ERC20.abi +cat ./out/ERC20.sol/ERC20.json | jq -r '.bytecode.object' > ../bindings/tokens/ERC20.bin +abigen --abi ../bindings/tokens/ERC20.abi --bin ../bindings/tokens/ERC20.bin --pkg tokens --type ERC20 --out ../bindings/tokens/ERC20.go +✅ tokens/ERC20.go generated +cat ./out/ERC721.sol/ERC721.json | jq -r '.abi' > ../bindings/tokens/ERC721.abi +cat ./out/ERC721.sol/ERC721.json | jq -r '.bytecode.object' > ../bindings/tokens/ERC721.bin +abigen --abi ../bindings/tokens/ERC721.abi --bin ../bindings/tokens/ERC721.bin --pkg tokens --type ERC721 --out ../bindings/tokens/ERC721.go +✅ tokens/ERC721.go generated +``` + +## Usage + +```bash +$ make +Usage: + make + +Help + help Display this help. + +Build + build Build the smart contracts + +Gen go bindings + gen-tester-go-bindings Generate go bindings for the tester contracts. + gen-tokens-go-bindings Generate go bindings for the tokens contracts. + gen-go-bindings Generate go bindings. +``` diff --git a/contracts/conformancetester/ConformanceTester.abi b/contracts/conformancetester/ConformanceTester.abi deleted file mode 100644 index 18173589..00000000 --- a/contracts/conformancetester/ConformanceTester.abi +++ /dev/null @@ -1 +0,0 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"RevertErrorMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"testRevert","outputs":[],"stateMutability":"pure","type":"function"}] \ No newline at end of file diff --git a/contracts/conformancetester/ConformanceTester.bin b/contracts/conformancetester/ConformanceTester.bin deleted file mode 100644 index 5e5d6e91..00000000 --- a/contracts/conformancetester/ConformanceTester.bin +++ /dev/null @@ -1 +0,0 @@ -60806040523480156200001157600080fd5b5060405162000ad638038062000ad68339818101604052810190620000379190620001e3565b80600090816200004891906200047f565b505062000566565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000b9826200006e565b810181811067ffffffffffffffff82111715620000db57620000da6200007f565b5b80604052505050565b6000620000f062000050565b9050620000fe8282620000ae565b919050565b600067ffffffffffffffff8211156200012157620001206200007f565b5b6200012c826200006e565b9050602081019050919050565b60005b83811015620001595780820151818401526020810190506200013c565b60008484015250505050565b60006200017c620001768462000103565b620000e4565b9050828152602081018484840111156200019b576200019a62000069565b5b620001a884828562000139565b509392505050565b600082601f830112620001c857620001c762000064565b5b8151620001da84826020860162000165565b91505092915050565b600060208284031215620001fc57620001fb6200005a565b5b600082015167ffffffffffffffff8111156200021d576200021c6200005f565b5b6200022b84828501620001b0565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028757607f821691505b6020821081036200029d576200029c6200023f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002c8565b620003138683620002c8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003606200035a62000354846200032b565b62000335565b6200032b565b9050919050565b6000819050919050565b6200037c836200033f565b620003946200038b8262000367565b848454620002d5565b825550505050565b600090565b620003ab6200039c565b620003b881848462000371565b505050565b5b81811015620003e057620003d4600082620003a1565b600181019050620003be565b5050565b601f8211156200042f57620003f981620002a3565b6200040484620002b8565b8101602085101562000414578190505b6200042c6200042385620002b8565b830182620003bd565b50505b505050565b600082821c905092915050565b6000620004546000198460080262000434565b1980831691505092915050565b60006200046f838362000441565b9150826002028217905092915050565b6200048a8262000234565b67ffffffffffffffff811115620004a657620004a56200007f565b5b620004b282546200026e565b620004bf828285620003e4565b600060209050601f831160018114620004f75760008415620004e2578287015190505b620004ee858262000461565b8655506200055e565b601f1984166200050786620002a3565b60005b8281101562000531578489015182556001820191506020850194506020810190506200050a565b868310156200055157848901516200054d601f89168262000441565b8355505b6001600288020188555050505b505050505050565b61056080620005766000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806306fdde031461005c578063242e7fa11461007a57806327e235e314610098578063a26388bb146100c8578063b6b55f25146100d2575b600080fd5b6100646100ee565b6040516100719190610328565b60405180910390f35b61008261017c565b60405161008f9190610328565b60405180910390f35b6100b260048036038101906100ad91906103ad565b6101b5565b6040516100bf91906103f3565b60405180910390f35b6100d06101cd565b005b6100ec60048036038101906100e7919061043a565b61023f565b005b600080546100fb90610496565b80601f016020809104026020016040519081016040528092919081815260200182805461012790610496565b80156101745780601f1061014957610100808354040283529160200191610174565b820191906000526020600020905b81548152906001019060200180831161015757829003601f168201915b505050505081565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d6573736167650000000000000081525081565b60016020528060005260406000206000915090505481565b6040518060400160405280601981526020017f5465737420526576657274204572726f72204d657373616765000000000000008152506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102369190610328565b60405180910390fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461028e91906104f6565b9250508190555050565b600081519050919050565b600082825260208201905092915050565b60005b838110156102d25780820151818401526020810190506102b7565b60008484015250505050565b6000601f19601f8301169050919050565b60006102fa82610298565b61030481856102a3565b93506103148185602086016102b4565b61031d816102de565b840191505092915050565b6000602082019050818103600083015261034281846102ef565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061037a8261034f565b9050919050565b61038a8161036f565b811461039557600080fd5b50565b6000813590506103a781610381565b92915050565b6000602082840312156103c3576103c261034a565b5b60006103d184828501610398565b91505092915050565b6000819050919050565b6103ed816103da565b82525050565b600060208201905061040860008301846103e4565b92915050565b610417816103da565b811461042257600080fd5b50565b6000813590506104348161040e565b92915050565b6000602082840312156104505761044f61034a565b5b600061045e84828501610425565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806104ae57607f821691505b6020821081036104c1576104c0610467565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610501826103da565b915061050c836103da565b9250828201905080821115610524576105236104c7565b5b9291505056fea264697066735822122097c56af386cdc27f1819acc9acc5fd56d14a42aeb926a842f69be51b4dc250ad64736f6c63430008150033 \ No newline at end of file diff --git a/contracts/foundry.toml b/contracts/foundry.toml new file mode 100644 index 00000000..4e0bf5f8 --- /dev/null +++ b/contracts/foundry.toml @@ -0,0 +1,13 @@ +[profile.default] +src = "src" +out = "out" +libs = ["lib"] +remappings = [ + '@openzeppelin/=lib/openzeppelin-contracts/contracts', +] + +# Lite profile with Yul optimiser disabled. +[profile.lite.optimizer_details] +yul = false + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/contracts/lib/forge-std b/contracts/lib/forge-std new file mode 160000 index 00000000..1d9650e9 --- /dev/null +++ b/contracts/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 1d9650e951204a0ddce9ff89c32f1997984cef4d diff --git a/contracts/lib/openzeppelin-contracts b/contracts/lib/openzeppelin-contracts new file mode 160000 index 00000000..fd81a96f --- /dev/null +++ b/contracts/lib/openzeppelin-contracts @@ -0,0 +1 @@ +Subproject commit fd81a96f01cc42ef1c9a5399364968d0e07e9e90 diff --git a/contracts/loadtester/LoadTester.abi b/contracts/loadtester/LoadTester.abi deleted file mode 100644 index d2e0ede1..00000000 --- a/contracts/loadtester/LoadTester.abi +++ /dev/null @@ -1 +0,0 @@ -[{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dumpster","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCallCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"loopBlockHashUntilLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"loopUntilLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"trash","type":"bytes"}],"name":"store","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testADD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testADDMOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testAND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testBALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testBASEFEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testBLOCKHASH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testBYTE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"testBlake2f","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testCALLDATACOPY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testCALLDATALOAD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testCALLDATASIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testCALLER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testCALLVALUE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testCHAINID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testCODECOPY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testCODESIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testCOINBASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testDIFFICULTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testDIV","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"testECAdd","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"testECMul","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"testECPairing","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"testECRecover","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testEQ","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testEXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testEXTCODESIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testGAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testGASLIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testGASPRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testGT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testISZERO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"testIdentity","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testLOG0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testLOG1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testLOG2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testLOG3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testLOG4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testLT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testMLOAD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testMOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testMSIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testMSTORE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testMSTORE8","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testMUL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testMULMOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"testModExp","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testNOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testNUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testORIGIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testRETURNDATACOPY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testRETURNDATASIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"testRipemd160","outputs":[{"internalType":"bytes20","name":"result","type":"bytes20"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSDIV","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSELFBALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSGT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"testSHA256","outputs":[{"internalType":"bytes32","name":"result","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSHA3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSHL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSHR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSIGNEXTEND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSLOAD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSLT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSMOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSSTORE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testSUB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testTIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"testXOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/contracts/loadtester/LoadTester.bin b/contracts/loadtester/LoadTester.bin deleted file mode 100644 index 9345c662..00000000 --- a/contracts/loadtester/LoadTester.bin +++ /dev/null @@ -1 +0,0 @@ -608060405234801561001057600080fd5b50612ef4806100206000396000f3fe608060405234801561001057600080fd5b50600436106104545760003560e01c806380947f8011610241578063bf529ca11161013b578063dd9bef60116100c3578063f279ca8111610087578063f279ca8114611161578063f4d1fc6114611191578063f58fc36a146111c1578063f6b0bbf7146111f1578063fde7721c1461122157610454565b8063dd9bef6014611071578063de97a363146110a1578063e9f9b3f2146110d1578063ea5141e614611101578063edf003cf1461113157610454565b8063ce3cf4ef1161010a578063ce3cf4ef14610f81578063d117320b14610fb1578063d51e7b5b14610fe1578063d53ff3fd14611011578063d93cd5581461104157610454565b8063bf529ca114610ec1578063c360aba614610ef1578063c420eb6114610f21578063c4bd65d514610f5157610454565b8063a18683cb116101c9578063b374012b1161018d578063b374012b14610dd1578063b3d847f214610e01578063b7b8620714610e31578063b81c148414610e61578063bdc875fc14610e9157610454565b8063a18683cb14610cf3578063a271b72114610d23578063a60a108714610d41578063a645c9c214610d71578063acaebdf614610da157610454565b8063962e4dc211610210578063962e4dc214610c0357806398456f3e14610c335780639a2b7c8114610c635780639cce7cf914610c93578063a040aec614610cc357610454565b806380947f8014610b43578063880eff3914610b73578063918a5fcd14610ba357806391e7b27714610bd357610454565b80633430ec061161035257806360e13cde116102da5780636f099c8d1161029e5780636f099c8d14610a5357806371d91d2814610a835780637b6e0b0e14610ab35780637c191d2014610ae35780637de8c6f814610b1357610454565b806360e13cde14610975578063613d0a82146109a557806363138d4f146109d5578063659bbb4f14610a055780636e7f1fe714610a2357610454565b806340fe26621161032157806340fe26621461088557806344cf3bc7146108b55780634a61af1f146108e55780634d2c74b3146109155780635590c2d91461094557610454565b80633430ec06146107d7578063371303c0146108075780633a411f12146108255780633a425dfc1461085557610454565b806318093b46116103e0578063219cddeb116103a4578063219cddeb146106e75780632294fc7f146107175780632871ef85146107475780632b21ef44146107775780632d34e798146107a757610454565b806318093b46146105f757806319b621d6146106275780631aba07ea146106575780631de2f343146106875780632007332e146106b757610454565b80630ba8a73b116104275780630ba8a73b146105195780631287a68c14610549578063135d52f7146105675780631581cf191461059757806316582150146105c757610454565b8063034aef7114610459578063050082f814610489578063087b4e84146104b95780630b3b996a146104e9575b600080fd5b610473600480360381019061046e9190612611565b611251565b604051610480919061264d565b60405180910390f35b6104a3600480360381019061049e9190612611565b61128c565b6040516104b0919061264d565b60405180910390f35b6104d360048036038101906104ce9190612611565b6112c7565b6040516104e0919061264d565b60405180910390f35b61050360048036038101906104fe91906127ae565b611301565b6040516105109190612876565b60405180910390f35b610533600480360381019061052e9190612611565b611328565b604051610540919061264d565b60405180910390f35b610551611364565b60405161055e919061264d565b60405180910390f35b610581600480360381019061057c9190612611565b61136d565b60405161058e919061264d565b60405180910390f35b6105b160048036038101906105ac9190612611565b6113a9565b6040516105be919061264d565b60405180910390f35b6105e160048036038101906105dc9190612611565b6113e4565b6040516105ee919061264d565b60405180910390f35b610611600480360381019061060c9190612611565b61143f565b60405161061e919061264d565b60405180910390f35b610641600480360381019061063c9190612611565b61147d565b60405161064e919061264d565b60405180910390f35b610671600480360381019061066c9190612611565b61150c565b60405161067e919061264d565b60405180910390f35b6106a1600480360381019061069c9190612611565b611552565b6040516106ae919061264d565b60405180910390f35b6106d160048036038101906106cc9190612611565b611590565b6040516106de919061264d565b60405180910390f35b61070160048036038101906106fc9190612611565b6115cc565b60405161070e919061264d565b60405180910390f35b610731600480360381019061072c9190612611565b611607565b60405161073e919061264d565b60405180910390f35b610761600480360381019061075c9190612611565b611646565b60405161076e919061264d565b60405180910390f35b610791600480360381019061078c9190612611565b611681565b60405161079e919061264d565b60405180910390f35b6107c160048036038101906107bc9190612611565b6116bc565b6040516107ce919061264d565b60405180910390f35b6107f160048036038101906107ec9190612611565b6116f7565b6040516107fe9190612876565b60405180910390f35b61080f6117a3565b60405161081c919061264d565b60405180910390f35b61083f600480360381019061083a9190612611565b6117c2565b60405161084c919061264d565b60405180910390f35b61086f600480360381019061086a9190612611565b6117fe565b60405161087c919061264d565b60405180910390f35b61089f600480360381019061089a9190612611565b61183a565b6040516108ac919061264d565b60405180910390f35b6108cf60048036038101906108ca9190612611565b611879565b6040516108dc919061264d565b60405180910390f35b6108ff60048036038101906108fa9190612611565b6118b4565b60405161090c919061264d565b60405180910390f35b61092f600480360381019061092a9190612611565b6118f2565b60405161093c919061264d565b60405180910390f35b61095f600480360381019061095a9190612611565b61192d565b60405161096c919061264d565b60405180910390f35b61098f600480360381019061098a9190612611565b611972565b60405161099c919061264d565b60405180910390f35b6109bf60048036038101906109ba91906127ae565b6119ae565b6040516109cc9190612876565b60405180910390f35b6109ef60048036038101906109ea91906127ae565b6119e0565b6040516109fc91906128b1565b60405180910390f35b610a0d611a0c565b604051610a1a919061264d565b60405180910390f35b610a3d6004803603810190610a389190612611565b611a48565b604051610a4a919061264d565b60405180910390f35b610a6d6004803603810190610a689190612611565b611a86565b604051610a7a919061264d565b60405180910390f35b610a9d6004803603810190610a989190612611565b611ac1565b604051610aaa919061264d565b60405180910390f35b610acd6004803603810190610ac89190612611565b611aff565b604051610ada919061264d565b60405180910390f35b610afd6004803603810190610af89190612611565b611b3b565b604051610b0a919061264d565b60405180910390f35b610b2d6004803603810190610b289190612611565b611b76565b604051610b3a919061264d565b60405180910390f35b610b5d6004803603810190610b589190612611565b611bb2565b604051610b6a919061264d565b60405180910390f35b610b8d6004803603810190610b889190612611565b611c0f565b604051610b9a919061264d565b60405180910390f35b610bbd6004803603810190610bb89190612611565b611c4e565b604051610bca919061264d565b60405180910390f35b610bed6004803603810190610be89190612611565b611c89565b604051610bfa919061264d565b60405180910390f35b610c1d6004803603810190610c1891906127ae565b611cd5565b604051610c2a9190612876565b60405180910390f35b610c4d6004803603810190610c489190612611565b611d43565b604051610c5a919061264d565b60405180910390f35b610c7d6004803603810190610c789190612611565b611d83565b604051610c8a919061264d565b60405180910390f35b610cad6004803603810190610ca891906127ae565b611dbe565b604051610cba9190612876565b60405180910390f35b610cdd6004803603810190610cd891906127ae565b611def565b604051610cea9190612876565b60405180910390f35b610d0d6004803603810190610d0891906127ae565b611e16565b604051610d1a919061290d565b60405180910390f35b610d2b611e98565b604051610d38919061264d565b60405180910390f35b610d5b6004803603810190610d569190612611565b611ee3565b604051610d68919061264d565b60405180910390f35b610d8b6004803603810190610d869190612611565b611f1e565b604051610d98919061264d565b60405180910390f35b610dbb6004803603810190610db69190612611565b611f5a565b604051610dc8919061264d565b60405180910390f35b610deb6004803603810190610de69190612988565b611f96565b604051610df8919061264d565b60405180910390f35b610e1b6004803603810190610e169190612611565b611fe4565b604051610e28919061264d565b60405180910390f35b610e4b6004803603810190610e469190612611565b61201f565b604051610e58919061264d565b60405180910390f35b610e7b6004803603810190610e769190612611565b61205a565b604051610e88919061264d565b60405180910390f35b610eab6004803603810190610ea69190612611565b612095565b604051610eb8919061264d565b60405180910390f35b610edb6004803603810190610ed69190612611565b6120d0565b604051610ee8919061264d565b60405180910390f35b610f0b6004803603810190610f069190612611565b612114565b604051610f18919061264d565b60405180910390f35b610f3b6004803603810190610f369190612611565b612150565b604051610f48919061264d565b60405180910390f35b610f6b6004803603810190610f669190612611565b61218b565b604051610f78919061264d565b60405180910390f35b610f9b6004803603810190610f969190612611565b6121c9565b604051610fa8919061264d565b60405180910390f35b610fcb6004803603810190610fc69190612611565b612206565b604051610fd8919061264d565b60405180910390f35b610ffb6004803603810190610ff69190612611565b612240565b604051611008919061264d565b60405180910390f35b61102b60048036038101906110269190612611565b61227c565b604051611038919061264d565b60405180910390f35b61105b60048036038101906110569190612611565b6122b8565b604051611068919061264d565b60405180910390f35b61108b60048036038101906110869190612611565b612313565b604051611098919061264d565b60405180910390f35b6110bb60048036038101906110b69190612611565b612355565b6040516110c8919061264d565b60405180910390f35b6110eb60048036038101906110e69190612611565b612391565b6040516110f8919061264d565b60405180910390f35b61111b60048036038101906111169190612611565b6123ce565b604051611128919061264d565b60405180910390f35b61114b600480360381019061114691906127ae565b612410565b6040516111589190612876565b60405180910390f35b61117b60048036038101906111769190612611565b61247f565b604051611188919061264d565b60405180910390f35b6111ab60048036038101906111a69190612611565b6124bb565b6040516111b8919061264d565b60405180910390f35b6111db60048036038101906111d69190612611565b6124f9565b6040516111e8919061264d565b60405180910390f35b61120b600480360381019061120691906127ae565b612538565b6040516112189190612a10565b60405180910390f35b61123b60048036038101906112369190612611565b61256a565b604051611248919061264d565b60405180910390f35b600061125b6117a3565b50600065deadbeef003690506000805b848110156112815736915060018101905061126b565b505080915050919050565b60006112966117a3565b50600065deadbeef003290506000805b848110156112bc573291506001810190506112a6565b505080915050919050565b60006112d16117a3565b50600065deadbeef0052905060005b838110156112f757816000526001810190506112e0565b5080915050919050565b60606000600890506040828451602086016000855af18061132157600080fd5b5050919050565b60006113326117a3565b50600065deadbeef0001905060005b8381101561135a57600082019150600181019050611341565b5080915050919050565b60008054905090565b60006113776117a3565b50600065deadbeef0017905060005b8381101561139f57600082179150600181019050611386565b5080915050919050565b60006113b36117a3565b50600065deadbeef003490506000805b848110156113d9573491506001810190506113c3565b505080915050919050565b60006113ee6117a3565b50600065deadbeef0006905060005b83811015611435577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820691506001810190506113fd565b5080915050919050565b60006114496117a3565b50600065deadbeef001390506000805b8481101561147257600183139150600181019050611459565b505080915050919050565b60006114876117a3565b50600065deadbeef002090507fffffffff000000000000000000000000000000000000000000000000000000006000526000805b848110156114d557600460002091506001810190506114bb565b507f29045a592007d0c246ef02c2223570da9522d0cf0f73282c79a1bc8f0bb2c238811461150257600091505b5080915050919050565b60006115166117a3565b50600065deadbeef00a490508060105260005b83811015611548576004600360028360066010a4600181019050611529565b5080915050919050565b600061155c6117a3565b50600065deadbeef001a90506000805b84811015611585578260001a915060018101905061156c565b505080915050919050565b600061159a6117a3565b50600065deadbeef001b905060005b838110156115c2578160001b91506001810190506115a9565b5080915050919050565b60006115d66117a3565b50600065deadbeef004290506000805b848110156115fc574291506001810190506115e6565b505080915050919050565b60006116116117a3565b50600065deadbeef0031905060003060005b8581101561163a5781319250600181019050611623565b50505080915050919050565b60006116506117a3565b50600065deadbeef004890506000805b8481101561167657489150600181019050611660565b505080915050919050565b600061168b6117a3565b50600065deadbeef003d90506000805b848110156116b1573d915060018101905061169b565b505080915050919050565b60006116c66117a3565b50600065deadbeef004390506000805b848110156116ec574391506001810190506116d6565b505080915050919050565b6002818154811061170757600080fd5b90600052602060002001600091509050805461172290612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461174e90612a5a565b801561179b5780601f106117705761010080835404028352916020019161179b565b820191906000526020600020905b81548152906001019060200180831161177e57829003601f168201915b505050505081565b600060016000546117b49190612aba565b600081905550600054905090565b60006117cc6117a3565b50600065deadbeef0004905060005b838110156117f4576001820491506001810190506117db565b5080915050919050565b60006118086117a3565b50600065deadbeef0037905060005b8381101561183057602060008037600181019050611817565b5080915050919050565b60006118446117a3565b50600065deadbeef00a090508060105260005b8381101561186f5760066010a0600181019050611857565b5080915050919050565b60006118836117a3565b50600065deadbeef003390506000805b848110156118a957339150600181019050611893565b505080915050919050565b60006118be6117a3565b50600065deadbeef0053905060005b838110156118e85763deadbeef6000526001810190506118cd565b5080915050919050565b60006118fc6117a3565b50600065deadbeef003a90506000805b84811015611922573a915060018101905061190c565b505080915050919050565b60006119376117a3565b50600065deadbeef0051905060008160005260005b8481101561196457600051915060018101905061194c565b508091505080915050919050565b600061197c6117a3565b50600065deadbeef001d905060005b838110156119a4578160001d915060018101905061198b565b5080915050919050565b606060006005905060208301835160405160208183856000885af1806119d357600080fd5b8195505050505050919050565b600080600290506020830183518360208183856000885af180611a0257600080fd5b5050505050919050565b6000611a166117a3565b505b6103e85a1115611a40576001806000828254611a349190612aba565b92505081905550611a18565b600154905090565b6000611a526117a3565b50600065deadbeef001090506000805b84811015611a7b57826001109150600181019050611a62565b505080915050919050565b6000611a906117a3565b50600065deadbeef004490506000805b84811015611ab657449150600181019050611aa0565b505080915050919050565b6000611acb6117a3565b50600065deadbeef001190506000805b84811015611af457600183119150600181019050611adb565b505080915050919050565b6000611b096117a3565b50600065deadbeef003e905060005b83811015611b315760206000803e600181019050611b18565b5080915050919050565b6000611b456117a3565b50600065deadbeef004590506000805b84811015611b6b57459150600181019050611b55565b505080915050919050565b6000611b806117a3565b50600065deadbeef0002905060005b83811015611ba857600182029150600181019050611b8f565b5080915050919050565b6000611bbc6117a3565b50600065deadbeef0008905060005b83811015611c05577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600083089150600181019050611bcb565b5080915050919050565b6000611c196117a3565b50600065deadbeef005490508060005560005b83811015611c44576000549150600181019050611c2c565b5080915050919050565b6000611c586117a3565b50600065deadbeef005a90506000805b84811015611c7e575a9150600181019050611c68565b505080915050919050565b6000611c936117a3565b50600065deadbeef0019905060005b83811015611cb95781199150600181019050611ca2565b5065deadbeef00198114611ccc57801990505b80915050919050565b606080825114611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1190612b4b565b60405180910390fd5b60006007905060208301835160408482846000875af180611d3a57600080fd5b50505050919050565b6000611d4d6117a3565b50600065deadbeef00a190508060105260005b83811015611d79578060066010a1600181019050611d60565b5080915050919050565b6000611d8d6117a3565b50600065deadbeef0016905060005b83811015611db4578182169150600181019050611d9c565b5080915050919050565b6060600060049050602083018351604051818183856000885af180611de257600080fd5b8195505050505050919050565b60606000600890506040828451602086016000855af180611e0f57600080fd5b5050919050565b60006080825114611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5390612bb7565b60405180910390fd5b600060019050602083016020810151601f1a602082015260206040516080836000865af180611e8a57600080fd5b604051519350505050919050565b6000611ea26117a3565b505b6103e85a1115611edb576001806000828254611ec09190612aba565b9250508190555043600154611ed59190612c06565b50611ea4565b600154905090565b6000611eed6117a3565b50600065deadbeef004690506000805b84811015611f1357469150600181019050611efd565b505080915050919050565b6000611f286117a3565b50600065deadbeef0005905060005b83811015611f5057600182059150600181019050611f37565b5080915050919050565b6000611f646117a3565b50600065deadbeef0039905060005b83811015611f8c57602060008039600181019050611f73565b5080915050919050565b60006002838390918060018154018082558091505060019003906000526020600020016000909192909192909192909192509182611fd5929190612dee565b50600280549050905092915050565b6000611fee6117a3565b50600065deadbeef005990506000805b8481101561201457599150600181019050611ffe565b505080915050919050565b60006120296117a3565b50600065deadbeef003890506000805b8481101561204f57389150600181019050612039565b505080915050919050565b60006120646117a3565b50600065deadbeef004190506000805b8481101561208a57419150600181019050612074565b505080915050919050565b600061209f6117a3565b50600065deadbeef003090506000805b848110156120c5573091506001810190506120af565b505080915050919050565b60006120da6117a3565b50600065deadbeef00a390508060105260005b8381101561210a57600360028260066010a36001810190506120ed565b5080915050919050565b600061211e6117a3565b50600065deadbeef000b905060005b83811015612146578160200b915060018101905061212d565b5080915050919050565b600061215a6117a3565b50600065deadbeef004790506000805b848110156121805747915060018101905061216a565b505080915050919050565b60006121956117a3565b50600065deadbeef001c90506000805b848110156121be578260001c92506001810190506121a5565b505080915050919050565b60006121d36117a3565b50600065deadbeef003590506000805b848110156121fb5760003591506001810190506121e3565b505080915050919050565b60006122106117a3565b50600065deadbeef0055905060005b83811015612236578160005560018101905061221f565b5080915050919050565b600061224a6117a3565b50600065deadbeef0018905060005b8381101561227257600082189150600181019050612259565b5080915050919050565b60006122866117a3565b50600065deadbeef0003905060005b838110156122ae57600082039150600181019050612295565b5080915050919050565b60006122c26117a3565b50600065deadbeef0007905060005b83811015612309577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820791506001810190506122d1565b5080915050919050565b600061231d6117a3565b50600065deadbeef00a290508060105260005b8381101561234b5760028160066010a2600181019050612330565b5080915050919050565b600061235f6117a3565b50600065deadbeef000a905060005b83811015612387576001820a915060018101905061236e565b5080915050919050565b600061239b6117a3565b50600065deadbeef001490506000805b848110156123c35782831491506001810190506123ab565b505080915050919050565b60006123d86117a3565b50600065deadbeef0040905060006001430360005b8581101561240457814092506001810190506123ed565b50505080915050919050565b60606080825114612456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244d90612b4b565b60405180910390fd5b60006006905060208301835160408482846000875af18061247657600080fd5b50505050919050565b60006124896117a3565b50600065deadbeef001590506000805b848110156124b05782159150600181019050612499565b505080915050919050565b60006124c56117a3565b50600065deadbeef001290506000805b848110156124ee578260011291506001810190506124d5565b505080915050919050565b60006125036117a3565b50600065deadbeef003b905060003060005b8581101561252c57813b9250600181019050612515565b50505080915050919050565b6000806003905060208301835160405160148183856000885af18061255c57600080fd5b815195505050505050919050565b60006125746117a3565b50600065deadbeef0009905060005b838110156125bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600183099150600181019050612583565b5080915050919050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6125ee816125db565b81146125f957600080fd5b50565b60008135905061260b816125e5565b92915050565b600060208284031215612627576126266125d1565b5b6000612635848285016125fc565b91505092915050565b612647816125db565b82525050565b6000602082019050612662600083018461263e565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126bb82612672565b810181811067ffffffffffffffff821117156126da576126d9612683565b5b80604052505050565b60006126ed6125c7565b90506126f982826126b2565b919050565b600067ffffffffffffffff82111561271957612718612683565b5b61272282612672565b9050602081019050919050565b82818337600083830152505050565b600061275161274c846126fe565b6126e3565b90508281526020810184848401111561276d5761276c61266d565b5b61277884828561272f565b509392505050565b600082601f83011261279557612794612668565b5b81356127a584826020860161273e565b91505092915050565b6000602082840312156127c4576127c36125d1565b5b600082013567ffffffffffffffff8111156127e2576127e16125d6565b5b6127ee84828501612780565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612831578082015181840152602081019050612816565b60008484015250505050565b6000612848826127f7565b6128528185612802565b9350612862818560208601612813565b61286b81612672565b840191505092915050565b60006020820190508181036000830152612890818461283d565b905092915050565b6000819050919050565b6128ab81612898565b82525050565b60006020820190506128c660008301846128a2565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128f7826128cc565b9050919050565b612907816128ec565b82525050565b600060208201905061292260008301846128fe565b92915050565b600080fd5b600080fd5b60008083601f84011261294857612947612668565b5b8235905067ffffffffffffffff81111561296557612964612928565b5b6020830191508360018202830111156129815761298061292d565b5b9250929050565b6000806020838503121561299f5761299e6125d1565b5b600083013567ffffffffffffffff8111156129bd576129bc6125d6565b5b6129c985828601612932565b92509250509250929050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b612a0a816129d5565b82525050565b6000602082019050612a256000830184612a01565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a7257607f821691505b602082108103612a8557612a84612a2b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ac5826125db565b9150612ad0836125db565b9250828201905080821115612ae857612ae7612a8b565b5b92915050565b600082825260208201905092915050565b7f496e76616c696420696e707574206c656e677468000000000000000000000000600082015250565b6000612b35601483612aee565b9150612b4082612aff565b602082019050919050565b60006020820190508181036000830152612b6481612b28565b9050919050565b7f496e76616c696420696e7075742064617461206c656e6774682e000000000000600082015250565b6000612ba1601a83612aee565b9150612bac82612b6b565b602082019050919050565b60006020820190508181036000830152612bd081612b94565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c11826125db565b9150612c1c836125db565b925082612c2c57612c2b612bd7565b5b828206905092915050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ca47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612c67565b612cae8683612c67565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612ceb612ce6612ce1846125db565b612cc6565b6125db565b9050919050565b6000819050919050565b612d0583612cd0565b612d19612d1182612cf2565b848454612c74565b825550505050565b600090565b612d2e612d21565b612d39818484612cfc565b505050565b5b81811015612d5d57612d52600082612d26565b600181019050612d3f565b5050565b601f821115612da257612d7381612c42565b612d7c84612c57565b81016020851015612d8b578190505b612d9f612d9785612c57565b830182612d3e565b50505b505050565b600082821c905092915050565b6000612dc560001984600802612da7565b1980831691505092915050565b6000612dde8383612db4565b9150826002028217905092915050565b612df88383612c37565b67ffffffffffffffff811115612e1157612e10612683565b5b612e1b8254612a5a565b612e26828285612d61565b6000601f831160018114612e555760008415612e43578287013590505b612e4d8582612dd2565b865550612eb5565b601f198416612e6386612c42565b60005b82811015612e8b57848901358255600182019150602085019450602081019050612e66565b86831015612ea85784890135612ea4601f891682612db4565b8355505b6001600288020188555050505b5050505050505056fea26469706673582212208612dc3a454553c8629c7050845d284621be46a91a361388814c0ca053f9dca464736f6c63430008150033 \ No newline at end of file diff --git a/contracts/asm/README.md b/contracts/src/asm/README.md similarity index 100% rename from contracts/asm/README.md rename to contracts/src/asm/README.md diff --git a/contracts/asm/blockhash-gas-loop.easm b/contracts/src/asm/blockhash-gas-loop.easm similarity index 100% rename from contracts/asm/blockhash-gas-loop.easm rename to contracts/src/asm/blockhash-gas-loop.easm diff --git a/contracts/asm/delegate-call-loop.easm b/contracts/src/asm/delegate-call-loop.easm similarity index 100% rename from contracts/asm/delegate-call-loop.easm rename to contracts/src/asm/delegate-call-loop.easm diff --git a/contracts/asm/deploy-call-loop.easm b/contracts/src/asm/deploy-call-loop.easm similarity index 100% rename from contracts/asm/deploy-call-loop.easm rename to contracts/src/asm/deploy-call-loop.easm diff --git a/contracts/asm/deploy-header.easm b/contracts/src/asm/deploy-header.easm similarity index 100% rename from contracts/asm/deploy-header.easm rename to contracts/src/asm/deploy-header.easm diff --git a/contracts/asm/deploy.easm b/contracts/src/asm/deploy.easm similarity index 100% rename from contracts/asm/deploy.easm rename to contracts/src/asm/deploy.easm diff --git a/contracts/asm/fib-nostore.easm b/contracts/src/asm/fib-nostore.easm similarity index 100% rename from contracts/asm/fib-nostore.easm rename to contracts/src/asm/fib-nostore.easm diff --git a/contracts/asm/fib.easm b/contracts/src/asm/fib.easm similarity index 100% rename from contracts/asm/fib.easm rename to contracts/src/asm/fib.easm diff --git a/contracts/asm/noop-loop.easm b/contracts/src/asm/noop-loop.easm similarity index 100% rename from contracts/asm/noop-loop.easm rename to contracts/src/asm/noop-loop.easm diff --git a/contracts/asm/sstore-loop.easm b/contracts/src/asm/sstore-loop.easm similarity index 100% rename from contracts/asm/sstore-loop.easm rename to contracts/src/asm/sstore-loop.easm diff --git a/contracts/conformancetester/ConformanceTester.sol b/contracts/src/tester/ConformanceTester.sol similarity index 91% rename from contracts/conformancetester/ConformanceTester.sol rename to contracts/src/tester/ConformanceTester.sol index 19a9075c..95d0b719 100644 --- a/contracts/conformancetester/ConformanceTester.sol +++ b/contracts/src/tester/ConformanceTester.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.8.21; +pragma solidity ^0.8.23; contract ConformanceTester { string public name; mapping(address => uint) public balances; - string public constant RevertErrorMessage = "Test Revert Error Message"; + string public constant RevertErrorMessage = "Test Revert Error Message"; constructor(string memory _name) { name = _name; diff --git a/contracts/loadtester/LoadTester.sol b/contracts/src/tester/LoadTester.sol similarity index 99% rename from contracts/loadtester/LoadTester.sol rename to contracts/src/tester/LoadTester.sol index 05593545..62532d9f 100644 --- a/contracts/loadtester/LoadTester.sol +++ b/contracts/src/tester/LoadTester.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.8.21; +pragma solidity ^0.8.23; contract LoadTester { uint256 callCounter; diff --git a/contracts/src/tokens/ERC20.sol b/contracts/src/tokens/ERC20.sol new file mode 100644 index 00000000..c2bc9aa6 --- /dev/null +++ b/contracts/src/tokens/ERC20.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.23; + +import {ERC20 as OZ_ERC20} from "@openzeppelin/token/ERC20/ERC20.sol" ; + +contract ERC20 is OZ_ERC20 { + constructor() OZ_ERC20("MyToken", "MTK") { + _mint(msg.sender, 1000000 * (10 ** uint256(decimals()))); + } + + function mint(uint256 amount) external { + _mint(msg.sender, amount); + } +} diff --git a/contracts/src/tokens/ERC721.sol b/contracts/src/tokens/ERC721.sol new file mode 100644 index 00000000..fa726986 --- /dev/null +++ b/contracts/src/tokens/ERC721.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.23; + +import {ERC721 as OZ_ERC721} from "@openzeppelin/token/ERC721/ERC721.sol"; + +contract ERC721 is OZ_ERC721 { + uint256 public currentTokenId = 0; + + constructor() OZ_ERC721("MyNFT", "MNFT") { + mintBatch(msg.sender, 1000); + } + + function mintBatch(address to, uint256 amount) public { + for (uint256 i = 0; i < amount; i++) { + uint256 newTokenId = ++currentTokenId; + _safeMint(to, newTokenId); + } + } +} diff --git a/contracts/test.yul b/contracts/src/yul/test.yul similarity index 100% rename from contracts/test.yul rename to contracts/src/yul/test.yul diff --git a/contracts/tokens/ERC20/ERC20.abi b/contracts/tokens/ERC20/ERC20.abi deleted file mode 100644 index 2cf2bc46..00000000 --- a/contracts/tokens/ERC20/ERC20.abi +++ /dev/null @@ -1 +0,0 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/contracts/tokens/ERC20/ERC20.bin b/contracts/tokens/ERC20/ERC20.bin deleted file mode 100644 index 809377d8..00000000 --- a/contracts/tokens/ERC20/ERC20.bin +++ /dev/null @@ -1 +0,0 @@ -60806040526012600560006101000a81548160ff021916908360ff1602179055503480156200002d57600080fd5b506040516200149938038062001499833981810160405281019062000053919062000212565b8160039081620000649190620004e2565b508060049081620000769190620004e2565b505050620005c9565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000e8826200009d565b810181811067ffffffffffffffff821117156200010a5762000109620000ae565b5b80604052505050565b60006200011f6200007f565b90506200012d8282620000dd565b919050565b600067ffffffffffffffff82111562000150576200014f620000ae565b5b6200015b826200009d565b9050602081019050919050565b60005b83811015620001885780820151818401526020810190506200016b565b60008484015250505050565b6000620001ab620001a58462000132565b62000113565b905082815260208101848484011115620001ca57620001c962000098565b5b620001d784828562000168565b509392505050565b600082601f830112620001f757620001f662000093565b5b81516200020984826020860162000194565b91505092915050565b600080604083850312156200022c576200022b62000089565b5b600083015167ffffffffffffffff8111156200024d576200024c6200008e565b5b6200025b85828601620001df565b925050602083015167ffffffffffffffff8111156200027f576200027e6200008e565b5b6200028d85828601620001df565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ea57607f821691505b6020821081036200030057620002ff620002a2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200036a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200032b565b6200037686836200032b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003c3620003bd620003b7846200038e565b62000398565b6200038e565b9050919050565b6000819050919050565b620003df83620003a2565b620003f7620003ee82620003ca565b84845462000338565b825550505050565b600090565b6200040e620003ff565b6200041b818484620003d4565b505050565b5b8181101562000443576200043760008262000404565b60018101905062000421565b5050565b601f82111562000492576200045c8162000306565b62000467846200031b565b8101602085101562000477578190505b6200048f62000486856200031b565b83018262000420565b50505b505050565b600082821c905092915050565b6000620004b76000198460080262000497565b1980831691505092915050565b6000620004d28383620004a4565b9150826002028217905092915050565b620004ed8262000297565b67ffffffffffffffff811115620005095762000508620000ae565b5b620005158254620002d1565b6200052282828562000447565b600060209050601f8311600181146200055a576000841562000545578287015190505b620005518582620004c4565b865550620005c1565b601f1984166200056a8662000306565b60005b8281101562000594578489015182556001820191506020850194506020810190506200056d565b86831015620005b45784890151620005b0601f891682620004a4565b8355505b6001600288020188555050505b505050505050565b610ec080620005d96000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806342966c681161008c57806395d89b411161006657806395d89b411461023a578063a0712d6814610258578063a9059cbb14610274578063dd62ed3e146102a4576100cf565b806342966c68146101be57806355b6ed5c146101da57806370a082311461020a576100cf565b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461012257806323b872dd1461014057806327e235e314610170578063313ce567146101a0575b600080fd5b6100dc6102d4565b6040516100e99190610b14565b60405180910390f35b61010c60048036038101906101079190610bcf565b610362565b6040516101199190610c2a565b60405180910390f35b61012a610454565b6040516101379190610c54565b60405180910390f35b61015a60048036038101906101559190610c6f565b61045a565b6040516101679190610c2a565b60405180910390f35b61018a60048036038101906101859190610cc2565b61060b565b6040516101979190610c54565b60405180910390f35b6101a8610623565b6040516101b59190610d0b565b60405180910390f35b6101d860048036038101906101d39190610d26565b610636565b005b6101f460048036038101906101ef9190610d53565b61070d565b6040516102019190610c54565b60405180910390f35b610224600480360381019061021f9190610cc2565b610732565b6040516102319190610c54565b60405180910390f35b61024261077b565b60405161024f9190610b14565b60405180910390f35b610272600480360381019061026d9190610d26565b610809565b005b61028e60048036038101906102899190610bcf565b6108e0565b60405161029b9190610c2a565b60405180910390f35b6102be60048036038101906102b99190610d53565b6109fd565b6040516102cb9190610c54565b60405180910390f35b600380546102e190610dc2565b80601f016020809104026020016040519081016040528092919081815260200182805461030d90610dc2565b801561035a5780601f1061032f5761010080835404028352916020019161035a565b820191906000526020600020905b81548152906001019060200180831161033d57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104429190610c54565b60405180910390a36001905092915050565b60005481565b600081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546104e89190610e22565b9250508190555081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461053e9190610e22565b9250508190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546105949190610e56565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516105f89190610c54565b60405180910390a3600190509392505050565b60016020528060005260406000206000915090505481565b600560009054906101000a900460ff1681565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106859190610e22565b925050819055508060008082825461069d9190610e22565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107029190610c54565b60405180910390a350565b6002602052816000526040600020602052806000526040600020600091509150505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6004805461078890610dc2565b80601f01602080910402602001604051908101604052809291908181526020018280546107b490610dc2565b80156108015780601f106107d657610100808354040283529160200191610801565b820191906000526020600020905b8154815290600101906020018083116107e457829003601f168201915b505050505081565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108589190610e56565b92505081905550806000808282546108709190610e56565b925050819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516108d59190610c54565b60405180910390a350565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109319190610e22565b9250508190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109879190610e56565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109eb9190610c54565b60405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610abe578082015181840152602081019050610aa3565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ae682610a84565b610af08185610a8f565b9350610b00818560208601610aa0565b610b0981610aca565b840191505092915050565b60006020820190508181036000830152610b2e8184610adb565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b6682610b3b565b9050919050565b610b7681610b5b565b8114610b8157600080fd5b50565b600081359050610b9381610b6d565b92915050565b6000819050919050565b610bac81610b99565b8114610bb757600080fd5b50565b600081359050610bc981610ba3565b92915050565b60008060408385031215610be657610be5610b36565b5b6000610bf485828601610b84565b9250506020610c0585828601610bba565b9150509250929050565b60008115159050919050565b610c2481610c0f565b82525050565b6000602082019050610c3f6000830184610c1b565b92915050565b610c4e81610b99565b82525050565b6000602082019050610c696000830184610c45565b92915050565b600080600060608486031215610c8857610c87610b36565b5b6000610c9686828701610b84565b9350506020610ca786828701610b84565b9250506040610cb886828701610bba565b9150509250925092565b600060208284031215610cd857610cd7610b36565b5b6000610ce684828501610b84565b91505092915050565b600060ff82169050919050565b610d0581610cef565b82525050565b6000602082019050610d206000830184610cfc565b92915050565b600060208284031215610d3c57610d3b610b36565b5b6000610d4a84828501610bba565b91505092915050565b60008060408385031215610d6a57610d69610b36565b5b6000610d7885828601610b84565b9250506020610d8985828601610b84565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610dda57607f821691505b602082108103610ded57610dec610d93565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610e2d82610b99565b9150610e3883610b99565b9250828203905081811115610e5057610e4f610df3565b5b92915050565b6000610e6182610b99565b9150610e6c83610b99565b9250828201905080821115610e8457610e83610df3565b5b9291505056fea2646970667358221220e50dff36c097760061d643e3240fb48ba521b74057802dde5e30f1560bee7cf564736f6c63430008150033 \ No newline at end of file diff --git a/contracts/tokens/ERC20/ERC20.sol b/contracts/tokens/ERC20/ERC20.sol deleted file mode 100644 index 99d3b3cd..00000000 --- a/contracts/tokens/ERC20/ERC20.sol +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.8.21; - -// https://solidity-by-example.org/app/erc20/ - -interface IERC20 { - function totalSupply() external view returns (uint); - - function balanceOf(address account) external view returns (uint); - - function transfer(address recipient, uint amount) external returns (bool); - - function allowance(address owner, address spender) external view returns (uint); - - function approve(address spender, uint amount) external returns (bool); - - function transferFrom( - address sender, - address recipient, - uint amount - ) external returns (bool); - - event Transfer(address indexed from, address indexed to, uint value); - event Approval(address indexed owner, address indexed spender, uint value); -} - -contract ERC20 is IERC20 { - uint override public totalSupply; - mapping(address => uint) public balances; - mapping(address => mapping(address => uint)) public allowances; - string public name; - string public symbol; - uint8 public decimals = 18; - - constructor(string memory _name, string memory _symbol) { - name = _name; - symbol = _symbol; - } - - function balanceOf(address account) override external view returns (uint) { - return balances[account]; - } - - function transfer(address recipient, uint amount) override external returns (bool) { - balances[msg.sender] -= amount; - balances[recipient] += amount; - emit Transfer(msg.sender, recipient, amount); - return true; - } - function allowance(address owner, address spender) override external view returns (uint) { - return allowances[owner][spender]; - } - - function approve(address spender, uint amount) override external returns (bool) { - allowances[msg.sender][spender] = amount; - emit Approval(msg.sender, spender, amount); - return true; - } - - function transferFrom( - address sender, - address recipient, - uint amount - ) override external returns (bool) { - allowances[sender][msg.sender] -= amount; - balances[sender] -= amount; - balances[recipient] += amount; - emit Transfer(sender, recipient, amount); - return true; - } - - function mint(uint amount) external { - balances[msg.sender] += amount; - totalSupply += amount; - emit Transfer(address(0), msg.sender, amount); - } - - function burn(uint amount) external { - balances[msg.sender] -= amount; - totalSupply -= amount; - emit Transfer(msg.sender, address(0), amount); - } -} \ No newline at end of file diff --git a/contracts/tokens/ERC20/IERC20.abi b/contracts/tokens/ERC20/IERC20.abi deleted file mode 100644 index 38876a99..00000000 --- a/contracts/tokens/ERC20/IERC20.abi +++ /dev/null @@ -1 +0,0 @@ -[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/contracts/tokens/ERC20/IERC20.bin b/contracts/tokens/ERC20/IERC20.bin deleted file mode 100644 index e69de29b..00000000 diff --git a/contracts/tokens/ERC721/ERC721.abi b/contracts/tokens/ERC721/ERC721.abi deleted file mode 100644 index a6572599..00000000 --- a/contracts/tokens/ERC721/ERC721.abi +++ /dev/null @@ -1 +0,0 @@ -[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/contracts/tokens/ERC721/ERC721.bin b/contracts/tokens/ERC721/ERC721.bin deleted file mode 100644 index 18ea46cc..00000000 --- a/contracts/tokens/ERC721/ERC721.bin +++ /dev/null @@ -1 +0,0 @@ -60a06040526000600455606460809081525034801561001d57600080fd5b50608051611c7961003960003960006110260152611c796000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806342842e0e1161007157806342842e0e146101625780636352211e1461017e57806370a08231146101ae578063a22cb465146101de578063b88d4fde146101fa578063e985e9c514610216576100a9565b806301ffc9a7146100ae578063081812fc146100de578063095ea7b31461010e57806323b872dd1461012a578063248b71fc14610146575b600080fd5b6100c860048036038101906100c3919061123d565b610246565b6040516100d59190611285565b60405180910390f35b6100f860048036038101906100f391906112d6565b610318565b6040516101059190611344565b60405180910390f35b6101286004803603810190610123919061138b565b6103f5565b005b610144600480360381019061013f91906113cb565b6105dd565b005b610160600480360381019061015b919061138b565b6108c7565b005b61017c600480360381019061017791906113cb565b6108d5565b005b610198600480360381019061019391906112d6565b610a0d565b6040516101a59190611344565b60405180910390f35b6101c860048036038101906101c3919061141e565b610ab8565b6040516101d5919061145a565b60405180910390f35b6101f860048036038101906101f391906114a1565b610b6f565b005b610214600480360381019061020f9190611546565b610c6c565b005b610230600480360381019061022b91906115ce565b610daa565b60405161023d9190611285565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061031157507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1660008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036103ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b19061166b565b60405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104ec5750600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61052b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610522906116d7565b60405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067490611743565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e3906117af565b60405180910390fd5b6106f7833383610dd9565b610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072d906116d7565b60405180910390fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610786906117fe565b9190505550600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906107db90611827565b91905055508160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6108d18282610f0d565b5050565b6108e08383836105dd565b60008273ffffffffffffffffffffffffffffffffffffffff163b14806109c9575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b8152600401610965939291906118a6565b6020604051808303816000875af1158015610984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a89190611905565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b610a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ff9061197e565b60405180910390fd5b505050565b600080600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa9061166b565b60405180910390fd5b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f906119ea565b60405180910390fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c609190611285565b60405180910390a35050565b610c778585856105dd565b60008473ffffffffffffffffffffffffffffffffffffffff163b1480610d64575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b8152600401610d00959493929190611a57565b6020604051808303816000875af1158015610d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d439190611905565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a9061197e565b60405180910390fd5b5050505050565b60036020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e9b5750600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80610f0457506002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b90509392505050565b60006004549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90611af1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101b90611b5d565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000821115611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e90611bef565b60405180910390fd5b816fffffffffffffffffffffffffffffffff16600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110e89190611c0f565b92505081905550600081905060005b838110156111cd57818573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48460008084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081806111b790611827565b92505080806111c590611827565b9150506110f7565b508060048190555050505050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61121a816111e5565b811461122557600080fd5b50565b60008135905061123781611211565b92915050565b600060208284031215611253576112526111db565b5b600061126184828501611228565b91505092915050565b60008115159050919050565b61127f8161126a565b82525050565b600060208201905061129a6000830184611276565b92915050565b6000819050919050565b6112b3816112a0565b81146112be57600080fd5b50565b6000813590506112d0816112aa565b92915050565b6000602082840312156112ec576112eb6111db565b5b60006112fa848285016112c1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061132e82611303565b9050919050565b61133e81611323565b82525050565b60006020820190506113596000830184611335565b92915050565b61136881611323565b811461137357600080fd5b50565b6000813590506113858161135f565b92915050565b600080604083850312156113a2576113a16111db565b5b60006113b085828601611376565b92505060206113c1858286016112c1565b9150509250929050565b6000806000606084860312156113e4576113e36111db565b5b60006113f286828701611376565b935050602061140386828701611376565b9250506040611414868287016112c1565b9150509250925092565b600060208284031215611434576114336111db565b5b600061144284828501611376565b91505092915050565b611454816112a0565b82525050565b600060208201905061146f600083018461144b565b92915050565b61147e8161126a565b811461148957600080fd5b50565b60008135905061149b81611475565b92915050565b600080604083850312156114b8576114b76111db565b5b60006114c685828601611376565b92505060206114d78582860161148c565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112611506576115056114e1565b5b8235905067ffffffffffffffff811115611523576115226114e6565b5b60208301915083600182028301111561153f5761153e6114eb565b5b9250929050565b600080600080600060808688031215611562576115616111db565b5b600061157088828901611376565b955050602061158188828901611376565b9450506040611592888289016112c1565b935050606086013567ffffffffffffffff8111156115b3576115b26111e0565b5b6115bf888289016114f0565b92509250509295509295909350565b600080604083850312156115e5576115e46111db565b5b60006115f385828601611376565b925050602061160485828601611376565b9150509250929050565b600082825260208201905092915050565b7f746f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b600061165560138361160e565b91506116608261161f565b602082019050919050565b6000602082019050818103600083015261168481611648565b9050919050565b7f6e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b60006116c1600e8361160e565b91506116cc8261168b565b602082019050919050565b600060208201905081810360008301526116f0816116b4565b9050919050565b7f66726f6d20213d206f776e657200000000000000000000000000000000000000600082015250565b600061172d600d8361160e565b9150611738826116f7565b602082019050919050565b6000602082019050818103600083015261175c81611720565b9050919050565b7f7472616e7366657220746f207a65726f20616464726573730000000000000000600082015250565b600061179960188361160e565b91506117a482611763565b602082019050919050565b600060208201905081810360008301526117c88161178c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611809826112a0565b91506000820361181c5761181b6117cf565b5b600182039050919050565b6000611832826112a0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611864576118636117cf565b5b600182019050919050565b600082825260208201905092915050565b50565b600061189060008361186f565b915061189b82611880565b600082019050919050565b60006080820190506118bb6000830186611335565b6118c86020830185611335565b6118d5604083018461144b565b81810360608301526118e681611883565b9050949350505050565b6000815190506118ff81611211565b92915050565b60006020828403121561191b5761191a6111db565b5b6000611929848285016118f0565b91505092915050565b7f756e7361666520726563697069656e7400000000000000000000000000000000600082015250565b600061196860108361160e565b915061197382611932565b602082019050919050565b600060208201905081810360008301526119978161195b565b9050919050565b7f6f776e6572203d207a65726f2061646472657373000000000000000000000000600082015250565b60006119d460148361160e565b91506119df8261199e565b602082019050919050565b60006020820190508181036000830152611a03816119c7565b9050919050565b82818337600083830152505050565b6000601f19601f8301169050919050565b6000611a36838561186f565b9350611a43838584611a0a565b611a4c83611a19565b840190509392505050565b6000608082019050611a6c6000830188611335565b611a796020830187611335565b611a86604083018661144b565b8181036060830152611a99818486611a2a565b90509695505050505050565b7f6d696e7420746f207a65726f2061646472657373000000000000000000000000600082015250565b6000611adb60148361160e565b9150611ae682611aa5565b602082019050919050565b60006020820190508181036000830152611b0a81611ace565b9050919050565b7f616c7265616479206d696e746564000000000000000000000000000000000000600082015250565b6000611b47600e8361160e565b9150611b5282611b11565b602082019050919050565b60006020820190508181036000830152611b7681611b3a565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000611bd960228361160e565b9150611be482611b7d565b604082019050919050565b60006020820190508181036000830152611c0881611bcc565b9050919050565b6000611c1a826112a0565b9150611c25836112a0565b9250828201905080821115611c3d57611c3c6117cf565b5b9291505056fea264697066735822122036621e4f4ef072ed94979bf338e8d15f60cd9af9e1fc693b1438f4494545594664736f6c63430008150033 \ No newline at end of file diff --git a/contracts/tokens/ERC721/ERC721.sol b/contracts/tokens/ERC721/ERC721.sol deleted file mode 100644 index 7f844c73..00000000 --- a/contracts/tokens/ERC721/ERC721.sol +++ /dev/null @@ -1,210 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.8.21; - -interface IERC165 { - function supportsInterface(bytes4 interfaceID) external view returns (bool); -} - -interface IERC721 is IERC165 { - - function balanceOf(address owner) external view returns (uint balance); - - function ownerOf(uint tokenId) external view returns (address owner); - - function safeTransferFrom( - address from, - address to, - uint tokenId - ) external; - - function safeTransferFrom( - address from, - address to, - uint tokenId, - bytes calldata data - ) external; - - function transferFrom( - address from, - address to, - uint tokenId - ) external; - - function approve(address to, uint tokenId) external; - - function getApproved(uint tokenId) external view returns (address operator); - - function setApprovalForAll(address operator, bool _approved) external; - - function isApprovedForAll(address owner, address operator) - external - view - returns (bool); -} - -interface IERC721Receiver { - function onERC721Received( - address operator, - address from, - uint tokenId, - bytes calldata data - ) external returns (bytes4); -} - -contract ERC721 is IERC721 { - - event Transfer(address indexed from, address indexed to, uint indexed id); - event Approval(address indexed owner, address indexed spender, uint indexed id); - event ApprovalForAll( - address indexed owner, - address indexed operator, - bool approved - ); - - // Mapping from token ID to owner address - mapping(uint => address) internal _ownerOf; - - // Mapping owner address to token count - mapping(address => uint) internal _balanceOf; - - // Mapping from token ID to approved address - mapping(uint => address) internal _approvals; - - // Mapping from owner to operator approvals - mapping(address => mapping(address => bool)) override public isApprovedForAll; - - uint256 private currentIndex = 0; - uint256 internal immutable maxBatchSize = 100; - - function supportsInterface(bytes4 interfaceId) override external pure returns (bool) { - return - interfaceId == type(IERC721).interfaceId || - interfaceId == type(IERC165).interfaceId; - } - - function ownerOf(uint id) override external view returns (address owner) { - owner = _ownerOf[id]; - require(owner != address(0), "token doesn't exist"); - } - - function balanceOf(address owner) override external view returns (uint) { - require(owner != address(0), "owner = zero address"); - return uint256(_balanceOf[owner]); - } - - function setApprovalForAll(address operator, bool approved) override external { - isApprovedForAll[msg.sender][operator] = approved; - emit ApprovalForAll(msg.sender, operator, approved); - } - - function approve(address spender, uint id) override external { - address owner = _ownerOf[id]; - require( - msg.sender == owner || isApprovedForAll[owner][msg.sender], - "not authorized" - ); - - _approvals[id] = spender; - - emit Approval(owner, spender, id); - } - - function getApproved(uint id) override external view returns (address) { - require(_ownerOf[id] != address(0), "token doesn't exist"); - return _approvals[id]; - } - - function _isApprovedOrOwner( - address owner, - address spender, - uint id - ) internal view returns (bool) { - return (spender == owner || - isApprovedForAll[owner][spender] || - spender == _approvals[id]); - } - - function transferFrom( - address from, - address to, - uint id - ) override public { - require(from == _ownerOf[id], "from != owner"); - require(to != address(0), "transfer to zero address"); - - require(_isApprovedOrOwner(from, msg.sender, id), "not authorized"); - - _balanceOf[from]--; - _balanceOf[to]++; - _ownerOf[id] = to; - - delete _approvals[id]; - - emit Transfer(from, to, id); - } - - function safeTransferFrom( - address from, - address to, - uint id - ) override external { - transferFrom(from, to, id); - - require( - to.code.length == 0 || - IERC721Receiver(to).onERC721Received(msg.sender, from, id, "") == - IERC721Receiver.onERC721Received.selector, - "unsafe recipient" - ); - } - - function safeTransferFrom( - address from, - address to, - uint id, - bytes calldata data - ) override external { - transferFrom(from, to, id); - - require( - to.code.length == 0 || - IERC721Receiver(to).onERC721Received(msg.sender, from, id, data) == - IERC721Receiver.onERC721Received.selector, - "unsafe recipient" - ); - } - - function _mintBatch(address to, uint quantity) internal { - uint256 startTokenId = currentIndex; - require(to != address(0), "mint to zero address"); - require(_ownerOf[startTokenId] == address(0), "already minted"); - require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); - - _balanceOf[to] += uint128(quantity); - - uint256 updatedIndex = startTokenId; - for (uint256 i = 0; i < quantity; i++) { - emit Transfer(address(0), to, updatedIndex); - _ownerOf[updatedIndex] = to; - updatedIndex++; - } - - currentIndex = updatedIndex; - } - - function mintBatch(address to, uint quantity) external { - _mintBatch(to, quantity); - } - - function _burn(uint id) internal { - address owner = _ownerOf[id]; - require(owner != address(0), "not minted"); - - _balanceOf[owner] -= 1; - - delete _ownerOf[id]; - delete _approvals[id]; - - emit Transfer(owner, address(0), id); - } -} \ No newline at end of file diff --git a/contracts/tokens/ERC721/IERC165.abi b/contracts/tokens/ERC721/IERC165.abi deleted file mode 100644 index dcdbc15e..00000000 --- a/contracts/tokens/ERC721/IERC165.abi +++ /dev/null @@ -1 +0,0 @@ -[{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/contracts/tokens/ERC721/IERC165.bin b/contracts/tokens/ERC721/IERC165.bin deleted file mode 100644 index e69de29b..00000000 diff --git a/contracts/tokens/ERC721/IERC721.abi b/contracts/tokens/ERC721/IERC721.abi deleted file mode 100644 index 119f8faa..00000000 --- a/contracts/tokens/ERC721/IERC721.abi +++ /dev/null @@ -1 +0,0 @@ -[{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/contracts/tokens/ERC721/IERC721.bin b/contracts/tokens/ERC721/IERC721.bin deleted file mode 100644 index e69de29b..00000000 diff --git a/contracts/tokens/ERC721/IERC721Receiver.abi b/contracts/tokens/ERC721/IERC721Receiver.abi deleted file mode 100644 index ab551930..00000000 --- a/contracts/tokens/ERC721/IERC721Receiver.abi +++ /dev/null @@ -1 +0,0 @@ -[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/contracts/tokens/ERC721/IERC721Receiver.bin b/contracts/tokens/ERC721/IERC721Receiver.bin deleted file mode 100644 index e69de29b..00000000 diff --git a/contracts/types.go b/contracts/types.go deleted file mode 100644 index a95ff55d..00000000 --- a/contracts/types.go +++ /dev/null @@ -1,11 +0,0 @@ -package contracts - -import ( - "context" - - "github.com/ethereum/go-ethereum/ethclient" -) - -// BlockUntilSuccessfulFn is designed to wait until a specified number of Ethereum blocks have been -// mined, periodically checking for the completion of a given function within each block interval. -type BlockUntilSuccessfulFn func(ctx context.Context, c *ethclient.Client, f func() error) error diff --git a/go.sum b/go.sum index 01df85a5..08bcf33f 100644 --- a/go.sum +++ b/go.sum @@ -249,8 +249,6 @@ github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpx github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= From 48044b87af548e1623a4bfa24cbbc7c5dcbcfa8f Mon Sep 17 00:00:00 2001 From: Dan Moore <100106211+rebelArtists@users.noreply.github.com> Date: Mon, 20 Nov 2023 10:58:07 -0600 Subject: [PATCH 4/5] feature: bulk fund crypto wallets (#159) * feature: bulk fund crypto wallets * gofmt * fix: errant print statements * fix: add gen docs * fix: unnecessary pause * fix: pr feedback * fix: lint issues * fix verbosity flag and default gas value * fix docs * fix: auto detect chain id --------- Co-authored-by: dan moore --- README.md | 2 + cmd/fund/fund.go | 317 ++++++++++++++++++++++++++++++++++++++++++++ cmd/fund/usage.md | 10 ++ cmd/root.go | 2 + doc/polycli.md | 2 + doc/polycli_fund.md | 61 +++++++++ go.mod | 4 + go.sum | 34 +++++ 8 files changed, 432 insertions(+) create mode 100644 cmd/fund/fund.go create mode 100644 cmd/fund/usage.md create mode 100644 doc/polycli_fund.md diff --git a/README.md b/README.md index 639f8a65..333e3f24 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,8 @@ Note: Do not modify this section! It is auto-generated by `cobra` using `make ge - [polycli fork](doc/polycli_fork.md) - Take a forked block and walk up the chain to do analysis. +- [polycli fund](doc/polycli_fund.md) - Bulk fund many crypto wallets automatically. + - [polycli hash](doc/polycli_hash.md) - Provide common crypto hashing functions. - [polycli loadtest](doc/polycli_loadtest.md) - Run a generic load test against an Eth/EVM style JSON-RPC endpoint. diff --git a/cmd/fund/fund.go b/cmd/fund/fund.go new file mode 100644 index 00000000..295ebee5 --- /dev/null +++ b/cmd/fund/fund.go @@ -0,0 +1,317 @@ +package fund + +import ( + "crypto/ecdsa" + "encoding/hex" + "encoding/json" + "fmt" + "io/ioutil" + "math/big" + "net/http" + "os" + "strconv" + "strings" + "sync" + "time" + + _ "embed" + + "github.com/chenzhijie/go-web3" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" +) + +var ( + //go:embed usage.md + usage string + walletCount int + fundingWalletPK string + fundingWalletPublicKey *ecdsa.PublicKey + chainRPC string + concurrencyLevel int + walletFundingAmt float64 + walletFundingGas uint64 + nonceMutex sync.Mutex + globalNonce uint64 + nonceInitialized bool + outputFileFlag string +) + +// Wallet struct to hold public key, private key, and address +type Wallet struct { + PublicKey *ecdsa.PublicKey + PrivateKey *ecdsa.PrivateKey + Address common.Address +} + +func getChainIDFromNode(chainRPC string) (int64, error) { + // Create an HTTP client + client := &http.Client{} + + // Prepare the JSON-RPC request payload + payload := `{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}` + + // Create the HTTP request + req, err := http.NewRequest("POST", chainRPC, strings.NewReader(payload)) + if err != nil { + return 0, err + } + + // Set the required headers + req.Header.Set("Content-Type", "application/json") + + // Send the request + resp, err := client.Do(req) + if err != nil { + return 0, err + } + defer resp.Body.Close() + + // Read the response body + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return 0, err + } + + // Parse the JSON response + var result map[string]interface{} + if err := json.Unmarshal(body, &result); err != nil { + return 0, err + } + + // Extract the chain ID from the response + chainIDHex, ok := result["result"].(string) + if !ok { + return 0, fmt.Errorf("unable to extract chain ID from response") + } + + // Convert the chain ID from hex to int64 + int64ChainID, err := strconv.ParseInt(chainIDHex, 0, 64) + if err != nil { + return 0, err + } + + return int64ChainID, nil +} + +func generateNonce(web3Client *web3.Web3) (uint64, error) { + nonceMutex.Lock() + defer nonceMutex.Unlock() + + if nonceInitialized { + globalNonce++ + } else { + // Derive the public key from the funding wallet's private key + fundingWalletECDSA, ecdsaErr := crypto.HexToECDSA(fundingWalletPK) + if ecdsaErr != nil { + log.Error().Err(ecdsaErr).Msg("Error getting ECDSA from funding wallet private key") + return 0, ecdsaErr + } + + fundingWalletPublicKey = &fundingWalletECDSA.PublicKey + // Convert ecdsa.PublicKey to common.Address + fundingAddress := crypto.PubkeyToAddress(*fundingWalletPublicKey) + + nonce, err := web3Client.Eth.GetNonce(fundingAddress, nil) + if err != nil { + log.Error().Err(err).Msg("Error getting nonce") + return 0, err + } + globalNonce = nonce + nonceInitialized = true + } + + return globalNonce, nil +} + +func generateWallets(numWallets int) ([]Wallet, error) { + wallets := make([]Wallet, numWallets) + + for i := 0; i < numWallets; i++ { + account, err := crypto.GenerateKey() + if err != nil { + log.Error().Err(err).Msg("Error generating key") + return nil, err + } + + addr := crypto.PubkeyToAddress(account.PublicKey) + wallet := Wallet{ + PublicKey: &account.PublicKey, + PrivateKey: account, + Address: addr, + } + + wallets[i] = wallet + } + return wallets, nil +} + +func fundWallets(web3Client *web3.Web3, wallets []Wallet, amountWei *big.Int, walletFundingGas uint64, concurrency int) error { + // Create a channel to control concurrency + walletChan := make(chan Wallet, len(wallets)) + for _, wallet := range wallets { + walletChan <- wallet + } + close(walletChan) + + // Wait group to ensure all goroutines finish before returning + var wg sync.WaitGroup + wg.Add(concurrency) + + // Function to fund wallets + fundWallet := func() { + defer wg.Done() + for wallet := range walletChan { + nonce, err := generateNonce(web3Client) + if err != nil { + log.Error().Err(err).Msg("Error getting nonce") + return + } + + // Fund the wallet using the obtained nonce + _, err = web3Client.Eth.SyncSendRawTransaction( + wallet.Address, + amountWei, + nonce, + walletFundingGas, + web3Client.Utils.ToGWei(1), + nil, + ) + if err != nil { + log.Error().Err(err).Str("wallet", wallet.Address.Hex()).Msg("Error funding wallet") + return + } + + log.Info().Str("wallet", wallet.Address.Hex()).Msgf("Funded with %s wei", amountWei.String()) + } + } + + // Start funding the wallets concurrently + for i := 0; i < concurrency; i++ { + go fundWallet() + } + + // Wait for all goroutines to finish + wg.Wait() + return nil +} + +// fundCmd represents the fund command +var FundCmd = &cobra.Command{ + Use: "fund", + Short: "Bulk fund many crypto wallets automatically.", + Long: usage, + Run: func(cmd *cobra.Command, args []string) { + if err := runFunding(cmd); err != nil { + log.Error().Err(err).Msg("Error funding wallets") + } + }, +} + +func runFunding(cmd *cobra.Command) error { + // Capture the start time + startTime := time.Now() + + // Remove '0x' prefix from fundingWalletPK if present + fundingWalletPK = strings.TrimPrefix(fundingWalletPK, "0x") + + // setup new web3 session with remote rpc node + web3Client, clientErr := web3.NewWeb3(chainRPC) + if clientErr != nil { + cmd.PrintErrf("There was an error creating web3 client: %s", clientErr.Error()) + return clientErr + } + + // add pk to session for sending signed transactions + if setAcctErr := web3Client.Eth.SetAccount(fundingWalletPK); setAcctErr != nil { + cmd.PrintErrf("There was an error setting account with pk: %s", setAcctErr.Error()) + return setAcctErr + } + + // Query the chain ID from the rpc node + chainID, chainIDErr := getChainIDFromNode(chainRPC) + if chainIDErr != nil { + log.Error().Err(chainIDErr).Msg("Error getting chain ID") + return chainIDErr + } + + // Set proper chainId for corresponding chainRPC + web3Client.Eth.SetChainId(chainID) + + // generate set of new wallet objects + wallets, genWalletErr := generateWallets(walletCount) + if genWalletErr != nil { + cmd.PrintErrf("There was an error generating wallet objects: %s", genWalletErr.Error()) + return genWalletErr + } + + // fund all crypto wallets + log.Info().Msg("Starting to fund loadtest wallets...") + fundWalletErr := fundWallets(web3Client, wallets, big.NewInt(int64(walletFundingAmt*1e18)), uint64(walletFundingGas), concurrencyLevel) + if fundWalletErr != nil { + log.Error().Err(fundWalletErr).Msg("Error funding wallets") + return fundWalletErr + } + + // Save wallet details to a file + outputFile := outputFileFlag // You can modify the file format or name as needed + + type WalletDetails struct { + Address string `json:"Address"` + PrivateKey string `json:"PrivateKey"` + } + + walletDetails := make([]WalletDetails, len(wallets)) + for i, w := range wallets { + privateKey := hex.EncodeToString(w.PrivateKey.D.Bytes()) // Convert private key to hex + walletDetails[i] = WalletDetails{ + Address: w.Address.Hex(), + PrivateKey: privateKey, + } + } + + // Convert walletDetails to JSON + walletsJSON, jsonErr := json.MarshalIndent(walletDetails, "", " ") + if jsonErr != nil { + log.Error().Err(jsonErr).Msg("Error converting wallet details to JSON") + return jsonErr + } + + // Write JSON data to a file + file, createErr := os.Create(outputFile) + if createErr != nil { + log.Error().Err(createErr).Msg("Error creating file") + return createErr + } + defer file.Close() + + _, writeErr := file.Write(walletsJSON) + if writeErr != nil { + log.Error().Err(writeErr).Msg("Error writing wallet details to file") + return writeErr + } + + log.Info().Msgf("Wallet details have been saved to %s", outputFile) + + // Calculate the duration + duration := time.Since(startTime) + log.Info().Msgf("Total execution time: %s", duration) + + return nil +} + +func init() { + // Configure zerolog to output to os.Stdout + log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stdout}) + + FundCmd.Flags().IntVar(&walletCount, "wallet-count", 2, "Number of wallets to fund") + FundCmd.Flags().StringVar(&fundingWalletPK, "funding-wallet-pk", "", "Corresponding private key for funding wallet address, ensure you remove leading 0x") + FundCmd.Flags().StringVar(&chainRPC, "rpc-url", "http://localhost:8545", "The RPC endpoint url") + FundCmd.Flags().IntVar(&concurrencyLevel, "concurrency", 2, "Concurrency level for speeding up funding wallets") + FundCmd.Flags().Float64Var(&walletFundingAmt, "wallet-funding-amt", 0.05, "Amount to fund each wallet with") + FundCmd.Flags().Uint64Var(&walletFundingGas, "wallet-funding-gas", 100000, "Gas for each wallet funding transaction") + FundCmd.Flags().StringVar(&outputFileFlag, "output-file", "funded_wallets.json", "Specify the output JSON file name") +} diff --git a/cmd/fund/usage.md b/cmd/fund/usage.md new file mode 100644 index 00000000..e1b50942 --- /dev/null +++ b/cmd/fund/usage.md @@ -0,0 +1,10 @@ +```bash +$ polycli fund \ + --rpc-url="https://rootchain-devnetsub.zkevmdev.net" \ + --funding-wallet-pk="REPLACE" \ + --wallet-count=5 \ + --wallet-funding-amt=0.00015 \ + --wallet-funding-gas=50000 \ + --concurrency=5 \ + --output-file="/opt/funded_wallets.json" +``` \ No newline at end of file diff --git a/cmd/root.go b/cmd/root.go index c534d962..b2547f59 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -16,6 +16,7 @@ import ( "github.com/maticnetwork/polygon-cli/cmd/abi" "github.com/maticnetwork/polygon-cli/cmd/dumpblocks" "github.com/maticnetwork/polygon-cli/cmd/enr" + "github.com/maticnetwork/polygon-cli/cmd/fund" "github.com/maticnetwork/polygon-cli/cmd/hash" "github.com/maticnetwork/polygon-cli/cmd/loadtest" "github.com/maticnetwork/polygon-cli/cmd/metricsToDash" @@ -106,6 +107,7 @@ func NewPolycliCommand() *cobra.Command { abi.ABICmd, dumpblocks.DumpblocksCmd, fork.ForkCmd, + fund.FundCmd, hash.HashCmd, enr.ENRCmd, dbbench.DBBenchCmd, diff --git a/doc/polycli.md b/doc/polycli.md index c5047876..1ab64525 100644 --- a/doc/polycli.md +++ b/doc/polycli.md @@ -44,6 +44,8 @@ Polycli is a collection of tools that are meant to be useful while building, tes - [polycli fork](polycli_fork.md) - Take a forked block and walk up the chain to do analysis. +- [polycli fund](polycli_fund.md) - Bulk fund many crypto wallets automatically. + - [polycli hash](polycli_hash.md) - Provide common crypto hashing functions. - [polycli loadtest](polycli_loadtest.md) - Run a generic load test against an Eth/EVM style JSON-RPC endpoint. diff --git a/doc/polycli_fund.md b/doc/polycli_fund.md new file mode 100644 index 00000000..dc4848b0 --- /dev/null +++ b/doc/polycli_fund.md @@ -0,0 +1,61 @@ +# `polycli fund` + +> Auto-generated documentation. + +## Table of Contents + +- [Description](#description) +- [Usage](#usage) +- [Flags](#flags) +- [See Also](#see-also) + +## Description + +Bulk fund many crypto wallets automatically. + +```bash +polycli fund [flags] +``` + +## Usage + +```bash +$ polycli fund \ + --rpc-url="https://rootchain-devnetsub.zkevmdev.net" \ + --funding-wallet-pk="REPLACE" \ + --wallet-count=5 \ + --wallet-funding-amt=0.00015 \ + --wallet-funding-gas=50000 \ + --concurrency=5 \ + --output-file="/opt/funded_wallets.json" +``` +## Flags + +```bash + --concurrency int Concurrency level for speeding up funding wallets (default 2) + --funding-wallet-pk string Corresponding private key for funding wallet address, ensure you remove leading 0x + -h, --help help for fund + --output-file string Specify the output JSON file name (default "funded_wallets.json") + --rpc-url string The RPC endpoint url (default "http://localhost:8545") + --wallet-count int Number of wallets to fund (default 2) + --wallet-funding-amt float Amount to fund each wallet with (default 0.05) + --wallet-funding-gas uint Gas for each wallet funding transaction (default 100000) +``` + +The command also inherits flags from parent commands. + +```bash + --config string config file (default is $HOME/.polygon-cli.yaml) + --pretty-logs Should logs be in pretty format or JSON (default true) + -v, --verbosity int 0 - Silent + 100 Fatal + 200 Error + 300 Warning + 400 Info + 500 Debug + 600 Trace (default 400) +``` + +## See also + +- [polycli](polycli.md) - A Swiss Army knife of blockchain tools. diff --git a/go.mod b/go.mod index 753880b3..81518afc 100644 --- a/go.mod +++ b/go.mod @@ -44,11 +44,13 @@ require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/andybalholm/brotli v1.0.4 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/chenzhijie/go-web3 v0.0.0-20230921142927-cd8f05f8d203 // indirect github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/redact v1.1.5 // indirect @@ -124,6 +126,8 @@ require ( github.com/supranational/blst v0.3.11 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.41.0 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect go.opencensus.io v0.24.0 // indirect diff --git a/go.sum b/go.sum index 08bcf33f..a08f60d6 100644 --- a/go.sum +++ b/go.sum @@ -61,6 +61,8 @@ github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWk github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= @@ -84,8 +86,11 @@ github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chenzhijie/go-web3 v0.0.0-20230921142927-cd8f05f8d203 h1:Y0ERn296o8ycmbqmnxONmNq2zvq39/votcf54Ql9o9M= +github.com/chenzhijie/go-web3 v0.0.0-20230921142927-cd8f05f8d203/go.mod h1:Ngj/3SKXcmcLheZuDTudxe/cvnl89m/3Rz39qrzAZiY= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -105,6 +110,8 @@ github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= @@ -126,6 +133,8 @@ github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5il github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -136,6 +145,7 @@ github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/ github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.2 h1:g9mCpfPWqCA1OL4e6C98PeVttb0HadfBRuKTGvMnOvw= github.com/ethereum/go-ethereum v1.13.2/go.mod h1:gkQ5Ygi64ZBh9M/4iXY1R8WqoNCx1Ey0CkYn2BD4/fw= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= @@ -155,6 +165,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= @@ -164,6 +176,7 @@ github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -179,6 +192,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -273,13 +287,17 @@ github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jedib0t/go-pretty/v6 v6.4.8 h1:HiNzyMSEpsBaduKhmK+CwcpulEeBrTmxutz4oX/oWkg= github.com/jedib0t/go-pretty/v6 v6.4.8/go.mod h1:Ndk3ase2CkQbXLLNf5QDHoYb6J9WtVfmHZu9n8rk2xs= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= @@ -315,10 +333,12 @@ github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWV github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -328,6 +348,8 @@ github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= @@ -344,6 +366,8 @@ github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7B github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d h1:x3S6kxmy49zXVVyhcnrFqxvNVCBPb2KZ9hV2RBdS840= github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= @@ -450,6 +474,12 @@ github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2n github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.41.0 h1:zeR0Z1my1wDHTRiamBCXVglQdbUwgb9uWG3k1HQz6jY= +github.com/valyala/fasthttp v1.41.0/go.mod h1:f6VbjjoI3z1NDOZOv17o6RvtRSWxC77seBFc2uWtgiY= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= @@ -481,6 +511,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= @@ -557,6 +588,7 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -625,6 +657,7 @@ golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -636,6 +669,7 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= From 2ae3960ffdcf10f5e3638673dce2d20372313c8e Mon Sep 17 00:00:00 2001 From: Dan Moore <100106211+rebelArtists@users.noreply.github.com> Date: Mon, 20 Nov 2023 12:02:27 -0600 Subject: [PATCH 5/5] fix: lint issue after merge (#163) * feature: bulk fund crypto wallets * gofmt * fix: errant print statements * fix: add gen docs * fix: unnecessary pause * fix: pr feedback * fix: lint issues * fix verbosity flag and default gas value * fix docs * fix: auto detect chain id * fix lint issue * fix lint --------- Co-authored-by: dan moore --- cmd/fund/fund.go | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/cmd/fund/fund.go b/cmd/fund/fund.go index 295ebee5..66f9dd22 100644 --- a/cmd/fund/fund.go +++ b/cmd/fund/fund.go @@ -5,7 +5,7 @@ import ( "encoding/hex" "encoding/json" "fmt" - "io/ioutil" + "io" "math/big" "net/http" "os" @@ -55,31 +55,30 @@ func getChainIDFromNode(chainRPC string) (int64, error) { payload := `{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}` // Create the HTTP request - req, err := http.NewRequest("POST", chainRPC, strings.NewReader(payload)) - if err != nil { - return 0, err + req, ReqErr := http.NewRequest("POST", chainRPC, strings.NewReader(payload)) + if ReqErr != nil { + return 0, ReqErr } // Set the required headers req.Header.Set("Content-Type", "application/json") // Send the request - resp, err := client.Do(req) - if err != nil { - return 0, err + resp, doErr := client.Do(req) + if doErr != nil { + return 0, doErr } defer resp.Body.Close() - // Read the response body - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return 0, err + body, readErr := io.ReadAll(resp.Body) // Replace ioutil.ReadAll with io.ReadAll + if readErr != nil { + return 0, readErr } // Parse the JSON response var result map[string]interface{} - if err := json.Unmarshal(body, &result); err != nil { - return 0, err + if jsonErr := json.Unmarshal(body, &result); jsonErr != nil { + return 0, jsonErr } // Extract the chain ID from the response @@ -89,9 +88,9 @@ func getChainIDFromNode(chainRPC string) (int64, error) { } // Convert the chain ID from hex to int64 - int64ChainID, err := strconv.ParseInt(chainIDHex, 0, 64) - if err != nil { - return 0, err + int64ChainID, parseErr := strconv.ParseInt(chainIDHex, 0, 64) + if parseErr != nil { + return 0, parseErr } return int64ChainID, nil