fix: chain-id in grpc query is not initialized without abci event (#1405)

* fix: chain-id in grpc query is not initialized without abci event

Closes: #1404

Solution:
- pass the chain-id from caller.

* Update CHANGELOG.md

* only override if input is not empty

* add comment to chain id

* pass chain-id to state transition

* Update x/evm/keeper/grpc_query.go

* Apply suggestions from code review

* fix golang lint

* update gomod2nix.toml

* fix unit tests

* update gomod2nix

* api breaking changelog

* add unit tests, and fix TraceBlock by the way

* Update CHANGELOG.md

* test --grpc-only mode in integration tests

* remove tmp var

* Update tests/integration_tests/test_grpc_only.py

* Update x/evm/keeper/grpc_query_test.go

Co-authored-by: mmsqe <tqd0800210105@gmail.com>

* fix linters

* fix nil pointer in tests

* fix conflicts

* fix conflicts

* fixes

* fix lint

* fix unit test

Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com>
Co-authored-by: mmsqe <tqd0800210105@gmail.com>
Co-authored-by: Freddy Caceres <facs95@gmail.com>
This commit is contained in:
yihuang
2022-11-18 13:19:09 -05:00
committed by GitHub
co-authored by mmsqe Federico Kunze Küllmer Freddy Caceres
parent e2939a3191
commit ebc47af0bd
24 changed files with 524 additions and 338 deletions
+34 -11
View File
@@ -8,9 +8,8 @@ import (
"math/big"
"time"
"github.com/ethereum/go-ethereum/eth/tracers/logger"
"github.com/ethereum/go-ethereum/eth/tracers"
"github.com/ethereum/go-ethereum/eth/tracers/logger"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
@@ -223,8 +222,11 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, req.ProposerAddress))
chainID, err := getChainID(ctx, req.ChainId)
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, req.ProposerAddress), chainID)
if err != nil {
return nil, status.Error(codes.Internal, err.Error())
}
@@ -256,13 +258,17 @@ func (k Keeper) EstimateGas(c context.Context, req *types.EthCallRequest) (*type
}
ctx := sdk.UnwrapSDKContext(c)
chainID, err := getChainID(ctx, req.ChainId)
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
if req.GasCap < ethparams.TxGas {
return nil, status.Error(codes.InvalidArgument, "gas cap cannot be lower than 21,000")
}
var args types.TransactionArgs
err := json.Unmarshal(req.Args, &args)
err = json.Unmarshal(req.Args, &args)
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
@@ -294,7 +300,7 @@ func (k Keeper) EstimateGas(c context.Context, req *types.EthCallRequest) (*type
hi = req.GasCap
}
cap = hi
cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, req.ProposerAddress))
cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, req.ProposerAddress), chainID)
if err != nil {
return nil, status.Error(codes.Internal, "failed to load evm config")
}
@@ -392,7 +398,11 @@ func (k Keeper) TraceTx(c context.Context, req *types.QueryTraceTxRequest) (*typ
ctx = ctx.WithBlockHeight(contextHeight)
ctx = ctx.WithBlockTime(req.BlockTime)
ctx = ctx.WithHeaderHash(common.Hex2Bytes(req.BlockHash))
cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, req.ProposerAddress))
chainID, err := getChainID(ctx, req.ChainId)
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, req.ProposerAddress), chainID)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to load evm config: %s", err.Error())
}
@@ -465,7 +475,12 @@ func (k Keeper) TraceBlock(c context.Context, req *types.QueryTraceBlockRequest)
ctx = ctx.WithBlockHeight(contextHeight)
ctx = ctx.WithBlockTime(req.BlockTime)
ctx = ctx.WithHeaderHash(common.Hex2Bytes(req.BlockHash))
cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, req.ProposerAddress))
chainID, err := getChainID(ctx, req.ChainId)
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
cfg, err := k.EVMConfig(ctx, GetProposerAddress(ctx, req.ProposerAddress), chainID)
if err != nil {
return nil, status.Error(codes.Internal, "failed to load evm config")
}
@@ -482,10 +497,10 @@ func (k Keeper) TraceBlock(c context.Context, req *types.QueryTraceBlockRequest)
traceResult, logIndex, err := k.traceTx(ctx, cfg, txConfig, signer, ethTx, req.TraceConfig, true, nil)
if err != nil {
result.Error = err.Error()
continue
} else {
txConfig.LogIndex = logIndex
result.Result = traceResult
}
txConfig.LogIndex = logIndex
result.Result = traceResult
results = append(results, &result)
}
@@ -602,3 +617,11 @@ func (k Keeper) BaseFee(c context.Context, _ *types.QueryBaseFeeRequest) (*types
return res, nil
}
// getChainID parse chainID from current context if not provided
func getChainID(ctx sdk.Context, chainID int64) (*big.Int, error) {
if chainID == 0 {
return ethermint.ParseChainID(ctx.ChainID())
}
return big.NewInt(chainID), nil
}
+38 -1
View File
@@ -758,6 +758,7 @@ func (suite *KeeperTestSuite) TestTraceTx() {
txMsg *types.MsgEthereumTx
traceConfig *types.TraceConfig
predecessors []*types.MsgEthereumTx
chainID *sdkmath.Int
)
testCases := []struct {
@@ -932,6 +933,16 @@ func (suite *KeeperTestSuite) TestTraceTx() {
expPass: true,
traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":",
},
{
msg: "invalid chain id",
malleate: func() {
traceConfig = nil
predecessors = []*types.MsgEthereumTx{}
tmp := sdkmath.NewInt(1)
chainID = &tmp
},
expPass: false,
},
}
for _, tc := range testCases {
@@ -951,6 +962,10 @@ func (suite *KeeperTestSuite) TestTraceTx() {
TraceConfig: traceConfig,
Predecessors: predecessors,
}
if chainID != nil {
traceReq.ChainId = chainID.Int64()
}
res, err := suite.queryClient.TraceTx(sdk.WrapSDKContext(suite.ctx), &traceReq)
if tc.expPass {
@@ -969,6 +984,8 @@ func (suite *KeeperTestSuite) TestTraceTx() {
} else {
suite.Require().Error(err)
}
// Reset for next test case
chainID = nil
})
}
@@ -979,6 +996,7 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
var (
txs []*types.MsgEthereumTx
traceConfig *types.TraceConfig
chainID *sdkmath.Int
)
testCases := []struct {
@@ -1088,7 +1106,17 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
}
},
expPass: true,
traceResponse: "[]",
traceResponse: "[{\"error\":\"rpc error: code = Internal desc = tracer not found\"}]",
},
{
msg: "invalid chain id",
malleate: func() {
traceConfig = nil
tmp := sdkmath.NewInt(1)
chainID = &tmp
},
expPass: true,
traceResponse: "[{\"error\":\"rpc error: code = Internal desc = invalid chain id for signer\"}]",
},
}
@@ -1111,6 +1139,11 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
Txs: txs,
TraceConfig: traceConfig,
}
if chainID != nil {
traceReq.ChainId = chainID.Int64()
}
res, err := suite.queryClient.TraceBlock(sdk.WrapSDKContext(suite.ctx), &traceReq)
if tc.expPass {
@@ -1124,6 +1157,8 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
} else {
suite.Require().Error(err)
}
// Reset for next case
chainID = nil
})
}
@@ -1140,6 +1175,8 @@ func (suite *KeeperTestSuite) TestNonceInQuery() {
// do an EthCall/EstimateGas with nonce 0
ctorArgs, err := types.ERC20Contract.ABI.Pack("", address, supply)
suite.Require().NoError(err)
data := append(types.ERC20Contract.Bin, ctorArgs...)
args, err := json.Marshal(&types.TransactionArgs{
From: &address,
+4 -4
View File
@@ -40,9 +40,9 @@ func GasToRefund(availableRefund, gasConsumed, refundQuotient uint64) uint64 {
}
// EVMConfig creates the EVMConfig based on current state
func (k *Keeper) EVMConfig(ctx sdk.Context, proposerAddress sdk.ConsAddress) (*types.EVMConfig, error) {
func (k *Keeper) EVMConfig(ctx sdk.Context, proposerAddress sdk.ConsAddress, chainID *big.Int) (*types.EVMConfig, error) {
params := k.GetParams(ctx)
ethCfg := params.ChainConfig.EthereumConfig(k.eip155ChainID)
ethCfg := params.ChainConfig.EthereumConfig(chainID)
// get the coinbase address from the block proposer
coinbase, err := k.GetCoinbaseAddress(ctx, proposerAddress)
@@ -200,7 +200,7 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t
bloomReceipt ethtypes.Bloom
)
cfg, err := k.EVMConfig(ctx, sdk.ConsAddress(ctx.BlockHeader().ProposerAddress))
cfg, err := k.EVMConfig(ctx, sdk.ConsAddress(ctx.BlockHeader().ProposerAddress), k.eip155ChainID)
if err != nil {
return nil, errorsmod.Wrap(err, "failed to load evm config")
}
@@ -466,7 +466,7 @@ func (k *Keeper) ApplyMessageWithConfig(ctx sdk.Context,
// ApplyMessage calls ApplyMessageWithConfig with default EVMConfig
func (k *Keeper) ApplyMessage(ctx sdk.Context, msg core.Message, tracer vm.EVMLogger, commit bool) (*types.MsgEthereumTxResponse, error) {
cfg, err := k.EVMConfig(ctx, sdk.ConsAddress(ctx.BlockHeader().ProposerAddress))
cfg, err := k.EVMConfig(ctx, sdk.ConsAddress(ctx.BlockHeader().ProposerAddress), k.eip155ChainID)
if err != nil {
return nil, errorsmod.Wrap(err, "failed to load evm config")
}
+3 -3
View File
@@ -517,7 +517,7 @@ func (suite *KeeperTestSuite) TestResetGasMeterAndConsumeGas() {
func (suite *KeeperTestSuite) TestEVMConfig() {
proposerAddress := suite.ctx.BlockHeader().ProposerAddress
cfg, err := suite.app.EvmKeeper.EVMConfig(suite.ctx, proposerAddress)
cfg, err := suite.app.EvmKeeper.EVMConfig(suite.ctx, proposerAddress, big.NewInt(9000))
suite.Require().NoError(err)
suite.Require().Equal(types.DefaultParams(), cfg.Params)
// london hardfork is enabled by default
@@ -537,7 +537,7 @@ func (suite *KeeperTestSuite) TestApplyMessage() {
var msg core.Message
proposerAddress := suite.ctx.BlockHeader().ProposerAddress
config, err := suite.app.EvmKeeper.EVMConfig(suite.ctx, proposerAddress)
config, err := suite.app.EvmKeeper.EVMConfig(suite.ctx, proposerAddress, big.NewInt(9000))
suite.Require().NoError(err)
keeperParams := suite.app.EvmKeeper.GetParams(suite.ctx)
@@ -638,7 +638,7 @@ func (suite *KeeperTestSuite) TestApplyMessageWithConfig() {
expectedGasUsed = params.TxGas
proposerAddress := suite.ctx.BlockHeader().ProposerAddress
config, err = suite.app.EvmKeeper.EVMConfig(suite.ctx, proposerAddress)
config, err = suite.app.EvmKeeper.EVMConfig(suite.ctx, proposerAddress, big.NewInt(9000))
suite.Require().NoError(err)
keeperParams = suite.app.EvmKeeper.GetParams(suite.ctx)
+198 -89
View File
@@ -794,6 +794,8 @@ type EthCallRequest struct {
GasCap uint64 `protobuf:"varint,2,opt,name=gas_cap,json=gasCap,proto3" json:"gas_cap,omitempty"`
// the proposer of the requested block
ProposerAddress github_com_cosmos_cosmos_sdk_types.ConsAddress `protobuf:"bytes,3,opt,name=proposer_address,json=proposerAddress,proto3,casttype=github.com/cosmos/cosmos-sdk/types.ConsAddress" json:"proposer_address,omitempty"`
// the eip155 chain id parsed from the requested block header
ChainId int64 `protobuf:"varint,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"`
}
func (m *EthCallRequest) Reset() { *m = EthCallRequest{} }
@@ -850,6 +852,13 @@ func (m *EthCallRequest) GetProposerAddress() github_com_cosmos_cosmos_sdk_types
return nil
}
func (m *EthCallRequest) GetChainId() int64 {
if m != nil {
return m.ChainId
}
return 0
}
// EstimateGasResponse defines EstimateGas response
type EstimateGasResponse struct {
// the estimated gas
@@ -913,6 +922,8 @@ type QueryTraceTxRequest struct {
BlockTime time.Time `protobuf:"bytes,7,opt,name=block_time,json=blockTime,proto3,stdtime" json:"block_time"`
// the proposer of the requested block
ProposerAddress github_com_cosmos_cosmos_sdk_types.ConsAddress `protobuf:"bytes,8,opt,name=proposer_address,json=proposerAddress,proto3,casttype=github.com/cosmos/cosmos-sdk/types.ConsAddress" json:"proposer_address,omitempty"`
// the eip155 chain id parsed from the requested block header
ChainId int64 `protobuf:"varint,9,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"`
}
func (m *QueryTraceTxRequest) Reset() { *m = QueryTraceTxRequest{} }
@@ -997,6 +1008,13 @@ func (m *QueryTraceTxRequest) GetProposerAddress() github_com_cosmos_cosmos_sdk_
return nil
}
func (m *QueryTraceTxRequest) GetChainId() int64 {
if m != nil {
return m.ChainId
}
return 0
}
// QueryTraceTxResponse defines TraceTx response
type QueryTraceTxResponse struct {
// response serialized in bytes
@@ -1057,6 +1075,8 @@ type QueryTraceBlockRequest struct {
BlockTime time.Time `protobuf:"bytes,7,opt,name=block_time,json=blockTime,proto3,stdtime" json:"block_time"`
// the proposer of the requested block
ProposerAddress github_com_cosmos_cosmos_sdk_types.ConsAddress `protobuf:"bytes,8,opt,name=proposer_address,json=proposerAddress,proto3,casttype=github.com/cosmos/cosmos-sdk/types.ConsAddress" json:"proposer_address,omitempty"`
// the eip155 chain id parsed from the requested block header
ChainId int64 `protobuf:"varint,9,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"`
}
func (m *QueryTraceBlockRequest) Reset() { *m = QueryTraceBlockRequest{} }
@@ -1134,6 +1154,13 @@ func (m *QueryTraceBlockRequest) GetProposerAddress() github_com_cosmos_cosmos_s
return nil
}
func (m *QueryTraceBlockRequest) GetChainId() int64 {
if m != nil {
return m.ChainId
}
return 0
}
// QueryTraceBlockResponse defines TraceBlock response
type QueryTraceBlockResponse struct {
Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
@@ -1285,96 +1312,97 @@ func init() {
func init() { proto.RegisterFile("ethermint/evm/v1/query.proto", fileDescriptor_e15a877459347994) }
var fileDescriptor_e15a877459347994 = []byte{
// 1415 bytes of a gzipped FileDescriptorProto
// 1434 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x56, 0xcd, 0x6f, 0x13, 0x47,
0x1b, 0xcf, 0xc6, 0x4e, 0x6c, 0xc6, 0x01, 0xfc, 0x0e, 0xe1, 0xc5, 0xec, 0x9b, 0xd8, 0x61, 0x21,
0x9f, 0x84, 0xdd, 0x37, 0x6e, 0x85, 0x54, 0x2e, 0x05, 0x5b, 0x81, 0xb6, 0x40, 0x45, 0xb7, 0x51,
0x0f, 0x95, 0x90, 0x35, 0x5e, 0x0f, 0x6b, 0x2b, 0xf6, 0x8e, 0xd9, 0x19, 0xbb, 0x0e, 0x94, 0x1e,
0x2a, 0x15, 0x51, 0x71, 0x41, 0xea, 0xb5, 0xaa, 0xf8, 0x0f, 0xfa, 0x57, 0x54, 0xe2, 0x88, 0xd4,
0x4b, 0xd5, 0x03, 0xad, 0xa0, 0x87, 0xde, 0x7a, 0xe8, 0xad, 0xa7, 0x6a, 0x3e, 0xd6, 0x5e, 0x7b,
0xbd, 0x76, 0xa8, 0xb8, 0xf5, 0xb4, 0x3b, 0x33, 0xcf, 0x3c, 0xcf, 0xef, 0xf9, 0x98, 0xe7, 0xf9,
0x81, 0x25, 0xcc, 0xea, 0xd8, 0x6f, 0x35, 0x3c, 0x66, 0xe1, 0x6e, 0xcb, 0xea, 0xee, 0x58, 0x77,
0x3b, 0xd8, 0x3f, 0x30, 0xdb, 0x3e, 0x61, 0x04, 0x66, 0xfb, 0xa7, 0x26, 0xee, 0xb6, 0xcc, 0xee,
0x8e, 0xbe, 0xe8, 0x12, 0x97, 0x88, 0x43, 0x8b, 0xff, 0x49, 0x39, 0x7d, 0xcb, 0x21, 0xb4, 0x45,
0xa8, 0x55, 0x45, 0x14, 0x4b, 0x05, 0x56, 0x77, 0xa7, 0x8a, 0x19, 0xda, 0xb1, 0xda, 0xc8, 0x6d,
0x78, 0x88, 0x35, 0x88, 0xa7, 0x64, 0x97, 0x5c, 0x42, 0xdc, 0x26, 0xb6, 0x50, 0xbb, 0x61, 0x21,
0xcf, 0x23, 0x4c, 0x1c, 0x52, 0x75, 0xaa, 0x47, 0xf0, 0x70, 0xc3, 0xf2, 0xec, 0x74, 0xe4, 0x8c,
0xf5, 0xd4, 0x51, 0x41, 0x29, 0x15, 0xab, 0x6a, 0xe7, 0x8e, 0xc5, 0x1a, 0x2d, 0x4c, 0x19, 0x6a,
0xb5, 0xa5, 0x80, 0xf1, 0x0e, 0x38, 0xf1, 0x11, 0xc7, 0x75, 0xc5, 0x71, 0x48, 0xc7, 0x63, 0x36,
0xbe, 0xdb, 0xc1, 0x94, 0xc1, 0x1c, 0x48, 0xa1, 0x5a, 0xcd, 0xc7, 0x94, 0xe6, 0xb4, 0x15, 0x6d,
0xe3, 0x88, 0x1d, 0x2c, 0x2f, 0xa5, 0x1f, 0x3d, 0x2d, 0xcc, 0xfc, 0xfe, 0xb4, 0x30, 0x63, 0x38,
0x60, 0x71, 0xf8, 0x2a, 0x6d, 0x13, 0x8f, 0x62, 0x7e, 0xb7, 0x8a, 0x9a, 0xc8, 0x73, 0x70, 0x70,
0x57, 0x2d, 0xe1, 0xff, 0xc0, 0x11, 0x87, 0xd4, 0x70, 0xa5, 0x8e, 0x68, 0x3d, 0x37, 0x2b, 0xce,
0xd2, 0x7c, 0xe3, 0x3d, 0x44, 0xeb, 0x70, 0x11, 0xcc, 0x79, 0x84, 0x5f, 0x4a, 0xac, 0x68, 0x1b,
0x49, 0x5b, 0x2e, 0x8c, 0x77, 0xc1, 0x69, 0x61, 0xa4, 0x2c, 0x02, 0xf9, 0x0f, 0x50, 0x3e, 0xd4,
0x80, 0x3e, 0x4e, 0x83, 0x02, 0xbb, 0x0a, 0x8e, 0xc9, 0x1c, 0x55, 0x86, 0x35, 0x1d, 0x95, 0xbb,
0x57, 0xe4, 0x26, 0xd4, 0x41, 0x9a, 0x72, 0xa3, 0x1c, 0xdf, 0xac, 0xc0, 0xd7, 0x5f, 0x73, 0x15,
0x48, 0x6a, 0xad, 0x78, 0x9d, 0x56, 0x15, 0xfb, 0xca, 0x83, 0xa3, 0x6a, 0xf7, 0x43, 0xb1, 0x69,
0x5c, 0x07, 0x4b, 0x02, 0xc7, 0x27, 0xa8, 0xd9, 0xa8, 0x21, 0x46, 0xfc, 0x11, 0x67, 0xce, 0x80,
0x05, 0x87, 0x78, 0xa3, 0x38, 0x32, 0x7c, 0xef, 0x4a, 0xc4, 0xab, 0xc7, 0x1a, 0x58, 0x8e, 0xd1,
0xa6, 0x1c, 0x5b, 0x07, 0xc7, 0x03, 0x54, 0xc3, 0x1a, 0x03, 0xb0, 0x6f, 0xd0, 0xb5, 0xa0, 0x88,
0x4a, 0x32, 0xcf, 0xaf, 0x93, 0x9e, 0xff, 0xab, 0x22, 0xea, 0x5f, 0x9d, 0x56, 0x44, 0xc6, 0x75,
0x65, 0xec, 0x63, 0x46, 0x7c, 0xe4, 0x4e, 0x37, 0x06, 0xb3, 0x20, 0xb1, 0x8f, 0x0f, 0x54, 0xbd,
0xf1, 0xdf, 0x90, 0xf9, 0x6d, 0x65, 0xbe, 0xaf, 0x4c, 0x99, 0x5f, 0x04, 0x73, 0x5d, 0xd4, 0xec,
0x04, 0xc6, 0xe5, 0xc2, 0xb8, 0x08, 0xb2, 0xaa, 0x94, 0x6a, 0xaf, 0xe5, 0xe4, 0x3a, 0xf8, 0x4f,
0xe8, 0x9e, 0x32, 0x01, 0x41, 0x92, 0xd7, 0xbe, 0xb8, 0xb5, 0x60, 0x8b, 0x7f, 0xe3, 0x1e, 0x80,
0x42, 0x70, 0xaf, 0x77, 0x83, 0xb8, 0x34, 0x30, 0x01, 0x41, 0x52, 0xbc, 0x18, 0xa9, 0x5f, 0xfc,
0xc3, 0xab, 0x00, 0x0c, 0x3a, 0x88, 0xf0, 0x2d, 0x53, 0x5c, 0x33, 0x65, 0xd1, 0x9a, 0xbc, 0xdd,
0x98, 0xb2, 0x5f, 0xa9, 0x76, 0x63, 0xde, 0x1a, 0x84, 0xca, 0x0e, 0xdd, 0x0c, 0x81, 0xfc, 0x5a,
0x53, 0x81, 0x0d, 0x8c, 0x2b, 0x9c, 0x9b, 0x20, 0xd9, 0x24, 0x2e, 0xf7, 0x2e, 0xb1, 0x91, 0x29,
0x9e, 0x34, 0x47, 0x5b, 0x9f, 0x79, 0x83, 0xb8, 0xb6, 0x10, 0x81, 0xd7, 0xc6, 0x80, 0x5a, 0x9f,
0x0a, 0x4a, 0xda, 0x09, 0xa3, 0x32, 0x16, 0x55, 0x1c, 0x6e, 0x21, 0x1f, 0xb5, 0x82, 0x38, 0x18,
0x37, 0x15, 0xc0, 0x60, 0x57, 0x01, 0xbc, 0x08, 0xe6, 0xdb, 0x62, 0x47, 0x04, 0x28, 0x53, 0xcc,
0x45, 0x21, 0xca, 0x1b, 0xa5, 0xe4, 0xb3, 0x17, 0x85, 0x19, 0x5b, 0x49, 0x1b, 0xdf, 0x6a, 0xe0,
0xd8, 0x2e, 0xab, 0x97, 0x51, 0xb3, 0x19, 0x8a, 0x34, 0xf2, 0x5d, 0x1a, 0xe4, 0x84, 0xff, 0xc3,
0x53, 0x20, 0xe5, 0x22, 0x5a, 0x71, 0x50, 0x5b, 0x3d, 0x8f, 0x79, 0x17, 0xd1, 0x32, 0x6a, 0xc3,
0xdb, 0x20, 0xdb, 0xf6, 0x49, 0x9b, 0x50, 0xec, 0xf7, 0x9f, 0x18, 0x7f, 0x1e, 0x0b, 0xa5, 0xe2,
0x5f, 0x2f, 0x0a, 0xa6, 0xdb, 0x60, 0xf5, 0x4e, 0xd5, 0x74, 0x48, 0xcb, 0x52, 0x53, 0x40, 0x7e,
0x2e, 0xd0, 0xda, 0xbe, 0xc5, 0x0e, 0xda, 0x98, 0x9a, 0xe5, 0xc1, 0xdb, 0xb6, 0x8f, 0x07, 0xba,
0xd4, 0x86, 0xb1, 0x0e, 0x4e, 0xec, 0x52, 0xd6, 0x68, 0x21, 0x86, 0xaf, 0xa1, 0x81, 0xb7, 0x59,
0x90, 0x70, 0x91, 0x44, 0x98, 0xb4, 0xf9, 0xaf, 0xf1, 0x43, 0x22, 0x48, 0x9c, 0x8f, 0x1c, 0xbc,
0xd7, 0x0b, 0x9c, 0xd9, 0x01, 0x89, 0x16, 0x75, 0x55, 0x50, 0x0a, 0xd1, 0xa0, 0xdc, 0xa4, 0xee,
0x2e, 0xdf, 0xc3, 0x9d, 0xd6, 0x5e, 0xcf, 0xe6, 0xb2, 0xf0, 0x32, 0x58, 0x60, 0x5c, 0x49, 0xc5,
0x21, 0xde, 0x9d, 0x86, 0x2b, 0xdc, 0xc9, 0x14, 0x97, 0xa3, 0x77, 0x85, 0xa9, 0xb2, 0x10, 0xb2,
0x33, 0x6c, 0xb0, 0x80, 0x65, 0xb0, 0xd0, 0xf6, 0x71, 0x0d, 0x3b, 0x98, 0x52, 0xe2, 0xd3, 0x5c,
0x52, 0x54, 0xcd, 0x54, 0xeb, 0x43, 0x97, 0x78, 0x2b, 0xac, 0x36, 0x89, 0xb3, 0x1f, 0x34, 0x9d,
0xb9, 0x15, 0x6d, 0x23, 0x61, 0x67, 0xc4, 0x9e, 0x6c, 0x39, 0x70, 0x19, 0x00, 0x29, 0x22, 0x5e,
0xc6, 0xbc, 0x78, 0x19, 0x47, 0xc4, 0x8e, 0x18, 0x26, 0xe5, 0xe0, 0x98, 0xcf, 0xbb, 0x5c, 0x4a,
0xb8, 0xa1, 0x9b, 0x72, 0x18, 0x9a, 0xc1, 0x30, 0x34, 0xf7, 0x82, 0x61, 0x58, 0x4a, 0xf3, 0xca,
0x78, 0xf2, 0x4b, 0x41, 0x53, 0x4a, 0xf8, 0xc9, 0xd8, 0x04, 0xa7, 0xdf, 0x58, 0x82, 0x3f, 0x48,
0xa6, 0x67, 0xb3, 0x09, 0x3b, 0xcd, 0x7a, 0x95, 0x86, 0x57, 0xc3, 0x3d, 0x63, 0x4b, 0xf5, 0xa2,
0x7e, 0x1a, 0x07, 0x8d, 0xa2, 0x86, 0x18, 0x0a, 0x8a, 0x92, 0xff, 0x1b, 0x7f, 0xce, 0x82, 0xff,
0x0e, 0x84, 0x4b, 0x1c, 0x72, 0x28, 0xed, 0xac, 0x17, 0x3c, 0xd7, 0xe9, 0x69, 0x67, 0x3d, 0xfa,
0x06, 0xd2, 0xfe, 0xaf, 0xc8, 0x98, 0x71, 0x01, 0x9c, 0x8a, 0x04, 0x7d, 0x42, 0x92, 0x4e, 0xf6,
0xc7, 0x22, 0xc5, 0x57, 0x71, 0xd0, 0x7e, 0x8d, 0xdb, 0xfd, 0x91, 0xa7, 0xb6, 0x95, 0x8a, 0x5d,
0x90, 0xe6, 0x3d, 0xb2, 0x72, 0x07, 0xab, 0xb1, 0x53, 0xda, 0xfa, 0xf9, 0x45, 0x61, 0xed, 0x10,
0xa0, 0xdf, 0xf7, 0x18, 0x9f, 0x8f, 0x42, 0x5d, 0xf1, 0x8f, 0x05, 0x30, 0x27, 0xf4, 0xc3, 0xaf,
0x34, 0x90, 0x52, 0xb4, 0x00, 0xae, 0x46, 0x93, 0x39, 0x86, 0xf7, 0xe9, 0x6b, 0xd3, 0xc4, 0x24,
0x56, 0xe3, 0xfc, 0x97, 0x3f, 0xfe, 0xf6, 0xcd, 0xec, 0x2a, 0x3c, 0x6b, 0x45, 0xb8, 0xa7, 0xa2,
0x06, 0xd6, 0x7d, 0x95, 0x80, 0x07, 0xf0, 0x3b, 0x0d, 0x1c, 0x1d, 0x62, 0x5f, 0xf0, 0x7c, 0x8c,
0x99, 0x71, 0x2c, 0x4f, 0xdf, 0x3e, 0x9c, 0xb0, 0x42, 0x56, 0x14, 0xc8, 0xb6, 0xe1, 0x56, 0x14,
0x59, 0x40, 0xf4, 0x22, 0x00, 0xbf, 0xd7, 0x40, 0x76, 0x94, 0x48, 0x41, 0x33, 0xc6, 0x6c, 0x0c,
0x7f, 0xd3, 0xad, 0x43, 0xcb, 0x2b, 0xa4, 0x97, 0x04, 0xd2, 0xb7, 0x61, 0x31, 0x8a, 0xb4, 0x1b,
0xdc, 0x19, 0x80, 0x0d, 0x73, 0xc3, 0x07, 0xf0, 0xa1, 0x06, 0x52, 0x8a, 0x32, 0xc5, 0xa6, 0x76,
0x98, 0x8d, 0xc5, 0xa6, 0x76, 0x84, 0x79, 0x19, 0xdb, 0x02, 0xd6, 0x1a, 0x3c, 0x17, 0x85, 0xa5,
0x28, 0x18, 0x0d, 0x85, 0xee, 0xb1, 0x06, 0x52, 0x8a, 0x3c, 0xc5, 0x02, 0x19, 0x66, 0x6a, 0xb1,
0x40, 0x46, 0x38, 0x98, 0xb1, 0x23, 0x80, 0x9c, 0x87, 0x9b, 0x51, 0x20, 0x54, 0x8a, 0x0e, 0x70,
0x58, 0xf7, 0xf7, 0xf1, 0xc1, 0x03, 0x78, 0x0f, 0x24, 0x39, 0xc7, 0x82, 0x46, 0x6c, 0xc9, 0xf4,
0x89, 0x9b, 0x7e, 0x76, 0xa2, 0x8c, 0xc2, 0xb0, 0x29, 0x30, 0x9c, 0x85, 0x67, 0xc6, 0x55, 0x53,
0x6d, 0x28, 0x12, 0x9f, 0x81, 0x79, 0x49, 0x33, 0xe0, 0xb9, 0x18, 0xcd, 0x43, 0x6c, 0x46, 0x5f,
0x9d, 0x22, 0xa5, 0x10, 0xac, 0x08, 0x04, 0x3a, 0xcc, 0x45, 0x11, 0x48, 0x1e, 0x03, 0x7b, 0x20,
0xa5, 0x68, 0x0c, 0x5c, 0x89, 0xea, 0x1c, 0x66, 0x38, 0xfa, 0xfa, 0xb4, 0x81, 0x10, 0xd8, 0x35,
0x84, 0xdd, 0x25, 0xa8, 0x47, 0xed, 0x62, 0x56, 0xaf, 0x38, 0xdc, 0xdc, 0x17, 0x20, 0x13, 0xa2,
0x28, 0x87, 0xb0, 0x3e, 0xc6, 0xe7, 0x31, 0x1c, 0xc7, 0x58, 0x13, 0xb6, 0x57, 0x60, 0x7e, 0x8c,
0x6d, 0x25, 0x5e, 0x71, 0x11, 0x85, 0x9f, 0x83, 0x94, 0x1a, 0x96, 0xb1, 0xb5, 0x37, 0xcc, 0x89,
0x62, 0x6b, 0x6f, 0x64, 0xe6, 0x4e, 0xf2, 0x5e, 0x4e, 0x4a, 0xd6, 0x83, 0x8f, 0x34, 0x00, 0x06,
0x93, 0x00, 0x6e, 0x4c, 0x52, 0x1d, 0x9e, 0xd0, 0xfa, 0xe6, 0x21, 0x24, 0x15, 0x8e, 0x55, 0x81,
0xa3, 0x00, 0x97, 0xe3, 0x70, 0x88, 0xd9, 0xc7, 0x03, 0xa1, 0xa6, 0xc9, 0x84, 0x6e, 0x10, 0x1e,
0x42, 0x13, 0xba, 0xc1, 0xd0, 0x50, 0x9a, 0x14, 0x88, 0x60, 0x58, 0x95, 0x2e, 0x3f, 0x7b, 0x99,
0xd7, 0x9e, 0xbf, 0xcc, 0x6b, 0xbf, 0xbe, 0xcc, 0x6b, 0x4f, 0x5e, 0xe5, 0x67, 0x9e, 0xbf, 0xca,
0xcf, 0xfc, 0xf4, 0x2a, 0x3f, 0xf3, 0x69, 0x78, 0x78, 0xe1, 0x2e, 0x9f, 0x5d, 0x03, 0x2d, 0x3d,
0xa1, 0x47, 0x0c, 0xb0, 0xea, 0xbc, 0x18, 0xf0, 0x6f, 0xfd, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xcd,
0x1e, 0xee, 0xb9, 0x76, 0x11, 0x00, 0x00,
0x14, 0xcf, 0xc6, 0x4e, 0xec, 0x3c, 0x07, 0x70, 0x87, 0x50, 0xcc, 0x36, 0xb1, 0xc3, 0x42, 0x3e,
0x09, 0xbb, 0x8d, 0x5b, 0x21, 0x95, 0x4b, 0xc1, 0x56, 0xa0, 0x14, 0xa8, 0xa8, 0x1b, 0xf5, 0x50,
0x09, 0x59, 0xe3, 0xf5, 0xb0, 0xb6, 0x62, 0xef, 0x9a, 0x9d, 0xb1, 0xeb, 0x40, 0xe9, 0xa1, 0x52,
0x11, 0x15, 0x52, 0x85, 0xd4, 0x7b, 0xc5, 0x7f, 0xd0, 0x63, 0xff, 0x05, 0x8e, 0x48, 0xbd, 0x54,
0x3d, 0x50, 0x44, 0x7a, 0xe8, 0xad, 0xf7, 0x9e, 0xaa, 0x99, 0x9d, 0xf1, 0xd7, 0xfa, 0x23, 0x54,
0xf4, 0xd4, 0xd3, 0xee, 0xcc, 0xbc, 0x79, 0xef, 0xf7, 0x3e, 0xe6, 0xbd, 0x1f, 0x2c, 0x12, 0x56,
0x21, 0x7e, 0xbd, 0xea, 0x32, 0x8b, 0xb4, 0xea, 0x56, 0x6b, 0xdb, 0xba, 0xdb, 0x24, 0xfe, 0xbe,
0xd9, 0xf0, 0x3d, 0xe6, 0xa1, 0x64, 0xe7, 0xd4, 0x24, 0xad, 0xba, 0xd9, 0xda, 0xd6, 0x17, 0x1c,
0xcf, 0xf1, 0xc4, 0xa1, 0xc5, 0xff, 0x02, 0x39, 0x7d, 0xd3, 0xf6, 0x68, 0xdd, 0xa3, 0x56, 0x09,
0x53, 0x12, 0x28, 0xb0, 0x5a, 0xdb, 0x25, 0xc2, 0xf0, 0xb6, 0xd5, 0xc0, 0x4e, 0xd5, 0xc5, 0xac,
0xea, 0xb9, 0x52, 0x76, 0xd1, 0xf1, 0x3c, 0xa7, 0x46, 0x2c, 0xdc, 0xa8, 0x5a, 0xd8, 0x75, 0x3d,
0x26, 0x0e, 0xa9, 0x3c, 0xd5, 0x43, 0x78, 0xb8, 0xe1, 0xe0, 0xec, 0x54, 0xe8, 0x8c, 0xb5, 0xe5,
0x51, 0x46, 0x2a, 0x15, 0xab, 0x52, 0xf3, 0x8e, 0xc5, 0xaa, 0x75, 0x42, 0x19, 0xae, 0x37, 0x02,
0x01, 0xe3, 0x03, 0x38, 0xfe, 0x29, 0xc7, 0x75, 0xd9, 0xb6, 0xbd, 0xa6, 0xcb, 0x0a, 0xe4, 0x6e,
0x93, 0x50, 0x86, 0x52, 0x10, 0xc3, 0xe5, 0xb2, 0x4f, 0x28, 0x4d, 0x69, 0xcb, 0xda, 0xfa, 0x5c,
0x41, 0x2d, 0x2f, 0xc6, 0x1f, 0x3d, 0xcd, 0x4c, 0xfd, 0xf9, 0x34, 0x33, 0x65, 0xd8, 0xb0, 0xd0,
0x7f, 0x95, 0x36, 0x3c, 0x97, 0x12, 0x7e, 0xb7, 0x84, 0x6b, 0xd8, 0xb5, 0x89, 0xba, 0x2b, 0x97,
0xe8, 0x1d, 0x98, 0xb3, 0xbd, 0x32, 0x29, 0x56, 0x30, 0xad, 0xa4, 0xa6, 0xc5, 0x59, 0x9c, 0x6f,
0x7c, 0x84, 0x69, 0x05, 0x2d, 0xc0, 0x8c, 0xeb, 0xf1, 0x4b, 0x91, 0x65, 0x6d, 0x3d, 0x5a, 0x08,
0x16, 0xc6, 0x87, 0x70, 0x4a, 0x18, 0xc9, 0x8b, 0x40, 0xfe, 0x0b, 0x94, 0x0f, 0x35, 0xd0, 0x87,
0x69, 0x90, 0x60, 0x57, 0xe0, 0x68, 0x90, 0xa3, 0x62, 0xbf, 0xa6, 0x23, 0xc1, 0xee, 0xe5, 0x60,
0x13, 0xe9, 0x10, 0xa7, 0xdc, 0x28, 0xc7, 0x37, 0x2d, 0xf0, 0x75, 0xd6, 0x5c, 0x05, 0x0e, 0xb4,
0x16, 0xdd, 0x66, 0xbd, 0x44, 0x7c, 0xe9, 0xc1, 0x11, 0xb9, 0xfb, 0x89, 0xd8, 0x34, 0xae, 0xc3,
0xa2, 0xc0, 0xf1, 0x39, 0xae, 0x55, 0xcb, 0x98, 0x79, 0xfe, 0x80, 0x33, 0xa7, 0x61, 0xde, 0xf6,
0xdc, 0x41, 0x1c, 0x09, 0xbe, 0x77, 0x39, 0xe4, 0xd5, 0x63, 0x0d, 0x96, 0x46, 0x68, 0x93, 0x8e,
0xad, 0xc1, 0x31, 0x85, 0xaa, 0x5f, 0xa3, 0x02, 0xfb, 0x06, 0x5d, 0x53, 0x45, 0x94, 0x0b, 0xf2,
0xfc, 0x3a, 0xe9, 0x79, 0x57, 0x16, 0x51, 0xe7, 0xea, 0xa4, 0x22, 0x32, 0xae, 0x4b, 0x63, 0x9f,
0x31, 0xcf, 0xc7, 0xce, 0x64, 0x63, 0x28, 0x09, 0x91, 0x3d, 0xb2, 0x2f, 0xeb, 0x8d, 0xff, 0xf6,
0x98, 0xdf, 0x92, 0xe6, 0x3b, 0xca, 0xa4, 0xf9, 0x05, 0x98, 0x69, 0xe1, 0x5a, 0x53, 0x19, 0x0f,
0x16, 0xc6, 0x05, 0x48, 0xca, 0x52, 0x2a, 0xbf, 0x96, 0x93, 0x6b, 0xf0, 0x56, 0xcf, 0x3d, 0x69,
0x02, 0x41, 0x94, 0xd7, 0xbe, 0xb8, 0x35, 0x5f, 0x10, 0xff, 0xc6, 0x3d, 0x40, 0x42, 0x70, 0xb7,
0x7d, 0xc3, 0x73, 0xa8, 0x32, 0x81, 0x20, 0x2a, 0x5e, 0x4c, 0xa0, 0x5f, 0xfc, 0xa3, 0x2b, 0x00,
0xdd, 0x0e, 0x22, 0x7c, 0x4b, 0x64, 0x57, 0xcd, 0xa0, 0x68, 0x4d, 0xde, 0x6e, 0xcc, 0xa0, 0x5f,
0xc9, 0x76, 0x63, 0xde, 0xea, 0x86, 0xaa, 0xd0, 0x73, 0xb3, 0x07, 0xe4, 0x77, 0x9a, 0x0c, 0xac,
0x32, 0x2e, 0x71, 0x6e, 0x40, 0xb4, 0xe6, 0x39, 0xdc, 0xbb, 0xc8, 0x7a, 0x22, 0x7b, 0xc2, 0x1c,
0x6c, 0x7d, 0xe6, 0x0d, 0xcf, 0x29, 0x08, 0x11, 0x74, 0x75, 0x08, 0xa8, 0xb5, 0x89, 0xa0, 0x02,
0x3b, 0xbd, 0xa8, 0x8c, 0x05, 0x19, 0x87, 0x5b, 0xd8, 0xc7, 0x75, 0x15, 0x07, 0xe3, 0xa6, 0x04,
0xa8, 0x76, 0x25, 0xc0, 0x0b, 0x30, 0xdb, 0x10, 0x3b, 0x22, 0x40, 0x89, 0x6c, 0x2a, 0x0c, 0x31,
0xb8, 0x91, 0x8b, 0x3e, 0x7b, 0x91, 0x99, 0x2a, 0x48, 0x69, 0xe3, 0x67, 0x0d, 0x8e, 0xee, 0xb0,
0x4a, 0x1e, 0xd7, 0x6a, 0x3d, 0x91, 0xc6, 0xbe, 0x43, 0x55, 0x4e, 0xf8, 0x3f, 0x3a, 0x09, 0x31,
0x07, 0xd3, 0xa2, 0x8d, 0x1b, 0xf2, 0x79, 0xcc, 0x3a, 0x98, 0xe6, 0x71, 0x03, 0xdd, 0x86, 0x64,
0xc3, 0xf7, 0x1a, 0x1e, 0x25, 0x7e, 0xe7, 0x89, 0xf1, 0xe7, 0x31, 0x9f, 0xcb, 0xfe, 0xfd, 0x22,
0x63, 0x3a, 0x55, 0x56, 0x69, 0x96, 0x4c, 0xdb, 0xab, 0x5b, 0x72, 0x0a, 0x04, 0x9f, 0xf3, 0xb4,
0xbc, 0x67, 0xb1, 0xfd, 0x06, 0xa1, 0x66, 0xbe, 0xfb, 0xb6, 0x0b, 0xc7, 0x94, 0x2e, 0xf5, 0x2e,
0x4f, 0x41, 0xdc, 0xae, 0xe0, 0xaa, 0x5b, 0xac, 0x96, 0x53, 0xd1, 0x65, 0x6d, 0x3d, 0x52, 0x88,
0x89, 0xf5, 0xb5, 0xb2, 0xb1, 0x06, 0xc7, 0x77, 0x28, 0xab, 0xd6, 0x31, 0x23, 0x57, 0x71, 0x37,
0x10, 0x49, 0x88, 0x38, 0x38, 0x00, 0x1f, 0x2d, 0xf0, 0x5f, 0xe3, 0x65, 0x44, 0xe5, 0xd4, 0xc7,
0x36, 0xd9, 0x6d, 0x2b, 0x3f, 0xb7, 0x21, 0x52, 0xa7, 0x8e, 0x8c, 0x57, 0x26, 0x1c, 0xaf, 0x9b,
0xd4, 0xd9, 0xe1, 0x7b, 0xa4, 0x59, 0xdf, 0x6d, 0x17, 0xb8, 0x2c, 0xba, 0x04, 0xf3, 0x8c, 0x2b,
0x29, 0xda, 0x9e, 0x7b, 0xa7, 0xea, 0x08, 0x4f, 0x13, 0xd9, 0xa5, 0xf0, 0x5d, 0x61, 0x2a, 0x2f,
0x84, 0x0a, 0x09, 0xd6, 0x5d, 0xa0, 0x3c, 0xcc, 0x37, 0x7c, 0x52, 0x26, 0x36, 0xa1, 0xd4, 0xf3,
0x69, 0x2a, 0x2a, 0x0a, 0x6a, 0xa2, 0xf5, 0xbe, 0x4b, 0xbc, 0x4b, 0x96, 0x6a, 0x9e, 0xbd, 0xa7,
0xfa, 0xd1, 0x8c, 0x88, 0x4c, 0x42, 0xec, 0x05, 0xdd, 0x08, 0x2d, 0x01, 0x04, 0x22, 0xe2, 0xd1,
0xcc, 0x8a, 0x47, 0x33, 0x27, 0x76, 0xc4, 0x9c, 0xc9, 0xab, 0x63, 0x3e, 0x0a, 0x53, 0x31, 0xe1,
0x86, 0x6e, 0x06, 0x73, 0xd2, 0x54, 0x73, 0xd2, 0xdc, 0x55, 0x73, 0x32, 0x17, 0xe7, 0x45, 0xf3,
0xe4, 0xf7, 0x8c, 0x26, 0x95, 0xf0, 0x93, 0xa1, 0xb9, 0x8f, 0xff, 0x37, 0xb9, 0x9f, 0xeb, 0xcb,
0xfd, 0xc7, 0xd1, 0xf8, 0x74, 0x32, 0x52, 0x88, 0xb3, 0x76, 0xb1, 0xea, 0x96, 0x49, 0xdb, 0xd8,
0x94, 0x1d, 0xac, 0x93, 0xe1, 0x6e, 0x7b, 0x29, 0x63, 0x86, 0x55, 0x29, 0xf3, 0x7f, 0xe3, 0xfb,
0x08, 0xbc, 0xdd, 0x15, 0xce, 0x71, 0x6f, 0x7a, 0x2a, 0x82, 0xb5, 0xd5, 0x23, 0x9f, 0x5c, 0x11,
0xac, 0x4d, 0xdf, 0x40, 0x45, 0xfc, 0xdf, 0x93, 0x69, 0x9c, 0x87, 0x93, 0xa1, 0x7c, 0x8c, 0xc9,
0xdf, 0x89, 0xce, 0x9c, 0xa5, 0xe4, 0x0a, 0x51, 0xfd, 0xdc, 0xb8, 0xdd, 0x99, 0xa1, 0x72, 0x5b,
0xaa, 0xd8, 0x81, 0x38, 0x6f, 0xba, 0xc5, 0x3b, 0x44, 0xce, 0xb1, 0xdc, 0xe6, 0x6f, 0x2f, 0x32,
0xab, 0x87, 0xf0, 0xe7, 0x9a, 0xcb, 0xf8, 0xc0, 0x15, 0xea, 0xb2, 0x7f, 0xcd, 0xc3, 0x8c, 0xd0,
0x8f, 0xbe, 0xd5, 0x20, 0x26, 0x79, 0x06, 0x5a, 0x09, 0xe7, 0x79, 0x08, 0x91, 0xd4, 0x57, 0x27,
0x89, 0x05, 0x58, 0x8d, 0x73, 0xdf, 0xfc, 0xf2, 0xc7, 0x0f, 0xd3, 0x2b, 0xe8, 0x8c, 0x15, 0x22,
0xb3, 0x92, 0x6b, 0x58, 0xf7, 0x65, 0x6e, 0x1e, 0xa0, 0x1f, 0x35, 0x38, 0xd2, 0x47, 0xe7, 0xd0,
0xb9, 0x11, 0x66, 0x86, 0xd1, 0x46, 0x7d, 0xeb, 0x70, 0xc2, 0x12, 0x59, 0x56, 0x20, 0xdb, 0x42,
0x9b, 0x61, 0x64, 0x8a, 0x39, 0x86, 0x00, 0xfe, 0xa4, 0x41, 0x72, 0x90, 0x99, 0x21, 0x73, 0x84,
0xd9, 0x11, 0x84, 0x50, 0xb7, 0x0e, 0x2d, 0x2f, 0x91, 0x5e, 0x14, 0x48, 0xdf, 0x47, 0xd9, 0x30,
0xd2, 0x96, 0xba, 0xd3, 0x05, 0xdb, 0x4b, 0x36, 0x1f, 0xa0, 0x87, 0x1a, 0xc4, 0x24, 0x07, 0x1b,
0x99, 0xda, 0x7e, 0x7a, 0x37, 0x32, 0xb5, 0x03, 0x54, 0xce, 0xd8, 0x12, 0xb0, 0x56, 0xd1, 0xd9,
0x30, 0x2c, 0xc9, 0xe9, 0x68, 0x4f, 0xe8, 0x1e, 0x6b, 0x10, 0x93, 0x6c, 0x6c, 0x24, 0x90, 0x7e,
0xea, 0x37, 0x12, 0xc8, 0x00, 0xa9, 0x33, 0xb6, 0x05, 0x90, 0x73, 0x68, 0x23, 0x0c, 0x84, 0x06,
0xa2, 0x5d, 0x1c, 0xd6, 0xfd, 0x3d, 0xb2, 0xff, 0x00, 0xdd, 0x83, 0x28, 0x27, 0x6d, 0xc8, 0x18,
0x59, 0x32, 0x1d, 0x26, 0xa8, 0x9f, 0x19, 0x2b, 0x23, 0x31, 0x6c, 0x08, 0x0c, 0x67, 0xd0, 0xe9,
0x61, 0xd5, 0x54, 0xee, 0x8b, 0xc4, 0x97, 0x30, 0x1b, 0xf0, 0x16, 0x74, 0x76, 0x84, 0xe6, 0x3e,
0x7a, 0xa4, 0xaf, 0x4c, 0x90, 0x92, 0x08, 0x96, 0x05, 0x02, 0x1d, 0xa5, 0xc2, 0x08, 0x02, 0x62,
0x84, 0xda, 0x10, 0x93, 0xbc, 0x08, 0x2d, 0x87, 0x75, 0xf6, 0x53, 0x26, 0x7d, 0x6d, 0xd2, 0xac,
0x50, 0x76, 0x0d, 0x61, 0x77, 0x11, 0xe9, 0x61, 0xbb, 0x84, 0x55, 0x8a, 0x36, 0x37, 0xf7, 0x35,
0x24, 0x7a, 0x88, 0xcd, 0x21, 0xac, 0x0f, 0xf1, 0x79, 0x08, 0x33, 0x32, 0x56, 0x85, 0xed, 0x65,
0x94, 0x1e, 0x62, 0x5b, 0x8a, 0x17, 0x1d, 0x4c, 0xd1, 0x57, 0x10, 0x93, 0x73, 0x74, 0x64, 0xed,
0xf5, 0x33, 0xa9, 0x91, 0xb5, 0x37, 0x30, 0x8e, 0xc7, 0x79, 0x1f, 0x0c, 0x51, 0xd6, 0x46, 0x8f,
0x34, 0x80, 0xee, 0x24, 0x40, 0xeb, 0xe3, 0x54, 0xf7, 0x0e, 0x6f, 0x7d, 0xe3, 0x10, 0x92, 0x12,
0xc7, 0x8a, 0xc0, 0x91, 0x41, 0x4b, 0xa3, 0x70, 0x88, 0xb1, 0xc8, 0x03, 0x21, 0xa7, 0xc9, 0x98,
0x6e, 0xd0, 0x3b, 0x84, 0xc6, 0x74, 0x83, 0xbe, 0xa1, 0x34, 0x2e, 0x10, 0x6a, 0x58, 0xe5, 0x2e,
0x3d, 0x7b, 0x95, 0xd6, 0x9e, 0xbf, 0x4a, 0x6b, 0x2f, 0x5f, 0xa5, 0xb5, 0x27, 0x07, 0xe9, 0xa9,
0xe7, 0x07, 0xe9, 0xa9, 0x5f, 0x0f, 0xd2, 0x53, 0x5f, 0xf4, 0x0e, 0x2f, 0xd2, 0xe2, 0xb3, 0xab,
0xab, 0xa5, 0x2d, 0xf4, 0x88, 0x01, 0x56, 0x9a, 0x15, 0xb3, 0xff, 0xbd, 0x7f, 0x02, 0x00, 0x00,
0xff, 0xff, 0x98, 0x6c, 0x20, 0x39, 0xc7, 0x11, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -2449,6 +2477,11 @@ func (m *EthCallRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.ChainId != 0 {
i = encodeVarintQuery(dAtA, i, uint64(m.ChainId))
i--
dAtA[i] = 0x20
}
if len(m.ProposerAddress) > 0 {
i -= len(m.ProposerAddress)
copy(dAtA[i:], m.ProposerAddress)
@@ -2519,6 +2552,11 @@ func (m *QueryTraceTxRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.ChainId != 0 {
i = encodeVarintQuery(dAtA, i, uint64(m.ChainId))
i--
dAtA[i] = 0x48
}
if len(m.ProposerAddress) > 0 {
i -= len(m.ProposerAddress)
copy(dAtA[i:], m.ProposerAddress)
@@ -2637,6 +2675,11 @@ func (m *QueryTraceBlockRequest) MarshalToSizedBuffer(dAtA []byte) (int, error)
_ = i
var l int
_ = l
if m.ChainId != 0 {
i = encodeVarintQuery(dAtA, i, uint64(m.ChainId))
i--
dAtA[i] = 0x48
}
if len(m.ProposerAddress) > 0 {
i -= len(m.ProposerAddress)
copy(dAtA[i:], m.ProposerAddress)
@@ -3044,6 +3087,9 @@ func (m *EthCallRequest) Size() (n int) {
if l > 0 {
n += 1 + l + sovQuery(uint64(l))
}
if m.ChainId != 0 {
n += 1 + sovQuery(uint64(m.ChainId))
}
return n
}
@@ -3092,6 +3138,9 @@ func (m *QueryTraceTxRequest) Size() (n int) {
if l > 0 {
n += 1 + l + sovQuery(uint64(l))
}
if m.ChainId != 0 {
n += 1 + sovQuery(uint64(m.ChainId))
}
return n
}
@@ -3137,6 +3186,9 @@ func (m *QueryTraceBlockRequest) Size() (n int) {
if l > 0 {
n += 1 + l + sovQuery(uint64(l))
}
if m.ChainId != 0 {
n += 1 + sovQuery(uint64(m.ChainId))
}
return n
}
@@ -4813,6 +4865,25 @@ func (m *EthCallRequest) Unmarshal(dAtA []byte) error {
m.ProposerAddress = []byte{}
}
iNdEx = postIndex
case 4:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType)
}
m.ChainId = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.ChainId |= int64(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
@@ -5156,6 +5227,25 @@ func (m *QueryTraceTxRequest) Unmarshal(dAtA []byte) error {
m.ProposerAddress = []byte{}
}
iNdEx = postIndex
case 9:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType)
}
m.ChainId = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.ChainId |= int64(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
@@ -5478,6 +5568,25 @@ func (m *QueryTraceBlockRequest) Unmarshal(dAtA []byte) error {
m.ProposerAddress = []byte{}
}
iNdEx = postIndex
case 9:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType)
}
m.ChainId = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.ChainId |= int64(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])