From 136f3ade88930e1645fcf350a75cccfdcbc4d246 Mon Sep 17 00:00:00 2001 From: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Date: Wed, 11 Nov 2020 12:07:29 +0100 Subject: [PATCH] ibc: client params allowlist (#7855) * ibc: client params allowlist * genesis and gRPC * client * lint * spec * fixes * validate localhost client * move client types back to exported * update genesis * sort clients by id --- proto/ibc/core/client/v1/client.proto | 91 +- proto/ibc/core/client/v1/genesis.proto | 8 +- proto/ibc/core/client/v1/query.proto | 19 +- proto/ibc/core/client/v1/tx.proto | 93 + simapp/app.go | 3 +- x/ibc/applications/transfer/client/cli/cli.go | 1 + .../applications/transfer/client/cli/query.go | 4 +- x/ibc/applications/transfer/handler_test.go | 3 +- .../transfer/keeper/relay_test.go | 19 +- x/ibc/applications/transfer/module_test.go | 7 +- x/ibc/core/02-client/client/cli/cli.go | 1 + x/ibc/core/02-client/client/cli/query.go | 27 + x/ibc/core/02-client/genesis.go | 11 + x/ibc/core/02-client/keeper/client.go | 8 + x/ibc/core/02-client/keeper/client_test.go | 10 +- x/ibc/core/02-client/keeper/grpc_query.go | 17 +- .../core/02-client/keeper/grpc_query_test.go | 24 +- x/ibc/core/02-client/keeper/keeper.go | 16 +- x/ibc/core/02-client/keeper/keeper_test.go | 34 +- x/ibc/core/02-client/keeper/params.go | 23 + x/ibc/core/02-client/keeper/params_test.go | 17 + x/ibc/core/02-client/keeper/proposal_test.go | 6 +- x/ibc/core/02-client/proposal_handler_test.go | 3 +- x/ibc/core/02-client/types/client.go | 21 + x/ibc/core/02-client/types/client.pb.go | 2558 +++-------------- x/ibc/core/02-client/types/client_test.go | 3 +- x/ibc/core/02-client/types/genesis.go | 13 +- x/ibc/core/02-client/types/genesis.pb.go | 107 +- x/ibc/core/02-client/types/genesis_test.go | 137 +- x/ibc/core/02-client/types/params.go | 71 + x/ibc/core/02-client/types/params_test.go | 29 + x/ibc/core/02-client/types/query.pb.go | 452 ++- x/ibc/core/02-client/types/query.pb.gw.go | 62 + x/ibc/core/02-client/types/tx.pb.go | 2128 ++++++++++++++ .../03-connection/keeper/grpc_query_test.go | 12 +- .../03-connection/keeper/handshake_test.go | 118 +- .../core/03-connection/keeper/keeper_test.go | 13 +- .../core/03-connection/keeper/verify_test.go | 14 +- .../core/04-channel/keeper/grpc_query_test.go | 6 +- .../core/04-channel/keeper/handshake_test.go | 66 +- x/ibc/core/04-channel/keeper/keeper_test.go | 3 +- x/ibc/core/04-channel/keeper/packet_test.go | 10 +- x/ibc/core/04-channel/keeper/timeout_test.go | 26 +- x/ibc/core/exported/client.go | 8 +- x/ibc/core/genesis_test.go | 7 +- x/ibc/core/keeper/grpc_query.go | 5 + x/ibc/core/keeper/keeper.go | 6 +- x/ibc/core/keeper/msg_server_test.go | 24 +- x/ibc/core/spec/07_params.md | 21 + x/ibc/core/spec/README.md | 1 + .../06-solomachine/types/client_state.go | 5 +- .../06-solomachine/types/client_state_test.go | 4 +- .../06-solomachine/types/consensus_state.go | 2 +- .../types/consensus_state_test.go | 3 +- .../06-solomachine/types/header.go | 2 +- .../06-solomachine/types/header_test.go | 3 +- .../06-solomachine/types/misbehaviour.go | 2 +- .../06-solomachine/types/misbehaviour_test.go | 3 +- .../06-solomachine/types/solomachine_test.go | 2 +- .../07-tendermint/types/client_state.go | 5 +- .../07-tendermint/types/client_state_test.go | 4 +- .../07-tendermint/types/consensus_state.go | 2 +- .../types/consensus_state_test.go | 9 +- .../07-tendermint/types/header.go | 2 +- .../07-tendermint/types/header_test.go | 3 +- .../07-tendermint/types/misbehaviour.go | 3 +- .../07-tendermint/types/misbehaviour_test.go | 3 +- .../types/proposal_handle_test.go | 7 +- .../07-tendermint/types/upgrade_test.go | 22 +- x/ibc/testing/chain.go | 11 +- x/ibc/testing/coordinator.go | 36 +- x/staking/types/staking.pb.go | 1184 ++++---- 72 files changed, 4453 insertions(+), 3230 deletions(-) create mode 100644 proto/ibc/core/client/v1/tx.proto create mode 100644 x/ibc/core/02-client/keeper/params.go create mode 100644 x/ibc/core/02-client/keeper/params_test.go create mode 100644 x/ibc/core/02-client/types/params.go create mode 100644 x/ibc/core/02-client/types/params_test.go create mode 100644 x/ibc/core/02-client/types/tx.pb.go create mode 100644 x/ibc/core/spec/07_params.md diff --git a/proto/ibc/core/client/v1/client.proto b/proto/ibc/core/client/v1/client.proto index 118318c246c..a5d2b0f19e7 100644 --- a/proto/ibc/core/client/v1/client.proto +++ b/proto/ibc/core/client/v1/client.proto @@ -6,91 +6,6 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types"; import "gogoproto/gogo.proto"; import "google/protobuf/any.proto"; -// Msg defines the ibc/client Msg service. -service Msg { - // CreateClient defines a rpc handler method for MsgCreateClient. - rpc CreateClient(MsgCreateClient) returns (MsgCreateClientResponse); - - // UpdateClient defines a rpc handler method for MsgUpdateClient. - rpc UpdateClient(MsgUpdateClient) returns (MsgUpdateClientResponse); - - // UpgradeClient defines a rpc handler method for MsgUpgradeClient. - rpc UpgradeClient(MsgUpgradeClient) returns (MsgUpgradeClientResponse); - - // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. - rpc SubmitMisbehaviour(MsgSubmitMisbehaviour) returns (MsgSubmitMisbehaviourResponse); -} - -// MsgCreateClient defines a message to create an IBC client -message MsgCreateClient { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // light client state - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; - // consensus state associated with the client that corresponds to a given - // height. - google.protobuf.Any consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; - // signer address - string signer = 4; -} - -// MsgCreateClientResponse defines the Msg/CreateClient response type. -message MsgCreateClientResponse { } - -// MsgUpdateClient defines an sdk.Msg to update a IBC client state using -// the given header. -message MsgUpdateClient { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // header to update the light client - google.protobuf.Any header = 2; - // signer address - string signer = 3; -} - -// MsgUpdateClientResponse defines the Msg/UpdateClient response type. -message MsgUpdateClientResponse { } - -// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client state -message MsgUpgradeClient { - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // upgraded client state - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; - // height at which old chain halts and upgrades (i.e last block executed) - Height upgrade_height = 3 [(gogoproto.moretags) = "yaml:\"upgrade_height\""]; - // proof that old chain committed to new client - bytes proof_upgrade = 4 [(gogoproto.moretags) = "yaml:\"proof_upgrade\""]; - // signer address - string signer = 5; -} - -// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. -message MsgUpgradeClientResponse { } - -// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for -// light client misbehaviour. -message MsgSubmitMisbehaviour { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // misbehaviour used for freezing the light client - google.protobuf.Any misbehaviour = 2; - // signer address - string signer = 3; -} - -// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response type. -message MsgSubmitMisbehaviourResponse { } - // IdentifiedClientState defines a client state with an additional client // identifier field. message IdentifiedClientState { @@ -151,3 +66,9 @@ message Height { // the height within the given version uint64 version_height = 2 [(gogoproto.moretags) = "yaml:\"version_height\""]; } + +// Params defines the set of IBC light client parameters. +message Params { + // allowed_clients defines the list of allowed client state types. + repeated string allowed_clients = 1 [(gogoproto.moretags) = "yaml:\"allowed_clients\""]; +} diff --git a/proto/ibc/core/client/v1/genesis.proto b/proto/ibc/core/client/v1/genesis.proto index 1041ca94489..110140e232e 100644 --- a/proto/ibc/core/client/v1/genesis.proto +++ b/proto/ibc/core/client/v1/genesis.proto @@ -9,13 +9,17 @@ import "gogoproto/gogo.proto"; // GenesisState defines the ibc client submodule's genesis state. message GenesisState { // client states with their corresponding identifiers - repeated IdentifiedClientState clients = 1 [(gogoproto.nullable) = false]; + repeated IdentifiedClientState clients = 1 [ + (gogoproto.nullable) = false, + (gogoproto.castrepeated) = "IdentifiedClientStates" + ]; // consensus states from each client repeated ClientConsensusStates clients_consensus = 2 [ (gogoproto.nullable) = false, (gogoproto.castrepeated) = "ClientsConsensusStates", (gogoproto.moretags) = "yaml:\"clients_consensus\"" ]; + Params params = 3 [ (gogoproto.nullable) = false]; // create localhost on initialization - bool create_localhost = 3 [(gogoproto.moretags) = "yaml:\"create_localhost\""]; + bool create_localhost = 4 [(gogoproto.moretags) = "yaml:\"create_localhost\""]; } diff --git a/proto/ibc/core/client/v1/query.proto b/proto/ibc/core/client/v1/query.proto index db580a260c9..038b97bc467 100644 --- a/proto/ibc/core/client/v1/query.proto +++ b/proto/ibc/core/client/v1/query.proto @@ -33,6 +33,11 @@ service Query { rpc ConsensusStates(QueryConsensusStatesRequest) returns (QueryConsensusStatesResponse) { option (google.api.http).get = "/ibc/core/client/v1beta1/consensus_states/{client_id}"; } + + // ClientParams queries all parameters of the ibc client. + rpc ClientParams(QueryClientParamsRequest) returns (QueryClientParamsResponse) { + option (google.api.http).get = "/ibc/client/v1beta1/params"; + } } // QueryClientStateRequest is the request type for the Query/ClientState RPC @@ -65,7 +70,10 @@ message QueryClientStatesRequest { // method. message QueryClientStatesResponse { // list of stored ClientStates of the chain. - repeated IdentifiedClientState client_states = 1; + repeated IdentifiedClientState client_states = 1 [ + (gogoproto.nullable) = false, + (gogoproto.castrepeated) = "IdentifiedClientStates" + ]; // pagination response cosmos.base.query.v1beta1.PageResponse pagination = 2; } @@ -113,3 +121,12 @@ message QueryConsensusStatesResponse { // pagination response cosmos.base.query.v1beta1.PageResponse pagination = 2; } + +// QueryClientParamsRequest is the request type for the Query/ClientParams RPC method. +message QueryClientParamsRequest {} + +// QueryClientParamsResponse is the response type for the Query/ClientParams RPC method. +message QueryClientParamsResponse { + // params defines the parameters of the module. + Params params = 1; +} diff --git a/proto/ibc/core/client/v1/tx.proto b/proto/ibc/core/client/v1/tx.proto new file mode 100644 index 00000000000..efe843cba4a --- /dev/null +++ b/proto/ibc/core/client/v1/tx.proto @@ -0,0 +1,93 @@ +syntax = "proto3"; +package ibc.core.client.v1; + +option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types"; + +import "gogoproto/gogo.proto"; +import "google/protobuf/any.proto"; +import "ibc/core/client/v1/client.proto"; + +// Msg defines the ibc/client Msg service. +service Msg { + // CreateClient defines a rpc handler method for MsgCreateClient. + rpc CreateClient(MsgCreateClient) returns (MsgCreateClientResponse); + + // UpdateClient defines a rpc handler method for MsgUpdateClient. + rpc UpdateClient(MsgUpdateClient) returns (MsgUpdateClientResponse); + + // UpgradeClient defines a rpc handler method for MsgUpgradeClient. + rpc UpgradeClient(MsgUpgradeClient) returns (MsgUpgradeClientResponse); + + // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. + rpc SubmitMisbehaviour(MsgSubmitMisbehaviour) returns (MsgSubmitMisbehaviourResponse); +} + +// MsgCreateClient defines a message to create an IBC client +message MsgCreateClient { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + // client unique identifier + string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; + // light client state + google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; + // consensus state associated with the client that corresponds to a given + // height. + google.protobuf.Any consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; + // signer address + string signer = 4; +} + +// MsgCreateClientResponse defines the Msg/CreateClient response type. +message MsgCreateClientResponse { } + +// MsgUpdateClient defines an sdk.Msg to update a IBC client state using +// the given header. +message MsgUpdateClient { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + // client unique identifier + string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; + // header to update the light client + google.protobuf.Any header = 2; + // signer address + string signer = 3; +} + +// MsgUpdateClientResponse defines the Msg/UpdateClient response type. +message MsgUpdateClientResponse { } + +// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client state +message MsgUpgradeClient { + // client unique identifier + string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; + // upgraded client state + google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; + // height at which old chain halts and upgrades (i.e last block executed) + Height upgrade_height = 3 [(gogoproto.moretags) = "yaml:\"upgrade_height\""]; + // proof that old chain committed to new client + bytes proof_upgrade = 4 [(gogoproto.moretags) = "yaml:\"proof_upgrade\""]; + // signer address + string signer = 5; +} + +// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. +message MsgUpgradeClientResponse { } + +// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for +// light client misbehaviour. +message MsgSubmitMisbehaviour { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + // client unique identifier + string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; + // misbehaviour used for freezing the light client + google.protobuf.Any misbehaviour = 2; + // signer address + string signer = 3; +} + +// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response type. +message MsgSubmitMisbehaviourResponse { } diff --git a/simapp/app.go b/simapp/app.go index a8c9e584be2..8aaa0073279 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -279,7 +279,7 @@ func NewSimApp( // Create IBC Keeper app.IBCKeeper = ibckeeper.NewKeeper( - appCodec, keys[ibchost.StoreKey], app.StakingKeeper, scopedIBCKeeper, + appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), app.StakingKeeper, scopedIBCKeeper, ) // register the proposal types @@ -609,6 +609,7 @@ func initParamsKeeper(appCodec codec.BinaryMarshaler, legacyAmino *codec.LegacyA paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable()) paramsKeeper.Subspace(crisistypes.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) + paramsKeeper.Subspace(ibchost.ModuleName) return paramsKeeper } diff --git a/x/ibc/applications/transfer/client/cli/cli.go b/x/ibc/applications/transfer/client/cli/cli.go index 9686afaa189..d3ca8341e95 100644 --- a/x/ibc/applications/transfer/client/cli/cli.go +++ b/x/ibc/applications/transfer/client/cli/cli.go @@ -18,6 +18,7 @@ func GetQueryCmd() *cobra.Command { queryCmd.AddCommand( GetCmdQueryDenomTrace(), GetCmdQueryDenomTraces(), + GetCmdParams(), ) return queryCmd diff --git a/x/ibc/applications/transfer/client/cli/query.go b/x/ibc/applications/transfer/client/cli/query.go index c0953d7ca66..3d158ed59ad 100644 --- a/x/ibc/applications/transfer/client/cli/query.go +++ b/x/ibc/applications/transfer/client/cli/query.go @@ -86,8 +86,8 @@ func GetCmdQueryDenomTraces() *cobra.Command { return cmd } -// QueryParamsCmd returns the command handler for ibc-transfer parameter querying. -func QueryParamsCmd() *cobra.Command { +// GetCmdParams returns the command handler for ibc-transfer parameter querying. +func GetCmdParams() *cobra.Command { cmd := &cobra.Command{ Use: "params", Short: "Query the current ibc-transfer parameters", diff --git a/x/ibc/applications/transfer/handler_test.go b/x/ibc/applications/transfer/handler_test.go index fd6b686fe2e..b1ee24f2edf 100644 --- a/x/ibc/applications/transfer/handler_test.go +++ b/x/ibc/applications/transfer/handler_test.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -31,7 +32,7 @@ func (suite *TransferTestSuite) SetupTest() { // constructs a send from chainA to chainB on the established channel/connection // and sends the same coin back from chainB to chainA. func (suite *TransferTestSuite) TestHandleMsgTransfer() { - clientA, clientB, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB := suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) originalBalance := suite.chainA.App.BankKeeper.GetBalance(suite.chainA.GetContext(), suite.chainA.SenderAccount.GetAddress(), sdk.DefaultBondDenom) timeoutHeight := clienttypes.NewHeight(0, 110) diff --git a/x/ibc/applications/transfer/keeper/relay_test.go b/x/ibc/applications/transfer/keeper/relay_test.go index 738de9e80a3..7878c593571 100644 --- a/x/ibc/applications/transfer/keeper/relay_test.go +++ b/x/ibc/applications/transfer/keeper/relay_test.go @@ -8,6 +8,7 @@ import ( clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types" host "github.com/cosmos/cosmos-sdk/x/ibc/core/24-host" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -28,28 +29,28 @@ func (suite *KeeperTestSuite) TestSendTransfer() { }{ {"successful transfer from source chain", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) amount = sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)) }, true, true}, {"successful transfer with coin from counterparty chain", func() { // send coin from chainA back to chainB - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) amount = types.GetTransferCoin(channelA.PortID, channelA.ID, sdk.DefaultBondDenom, 100) }, false, true}, {"source channel not found", func() { // channel references wrong ID - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) channelA.ID = ibctesting.InvalidID amount = sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)) }, true, false}, {"next seq send not found", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA = connA.NextTestChannel(ibctesting.TransferPort) channelB = connB.NextTestChannel(ibctesting.TransferPort) // manually create channel so next seq send is never set @@ -66,20 +67,20 @@ func (suite *KeeperTestSuite) TestSendTransfer() { // - source chain {"send coin failed", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) amount = sdk.NewCoin("randomdenom", sdk.NewInt(100)) }, true, false}, // - receiving chain {"send from module account failed", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) amount = types.GetTransferCoin(channelA.PortID, channelA.ID, " randomdenom", 100) }, false, false}, {"channel capability not found", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) cap := suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) @@ -177,7 +178,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { suite.SetupTest() // reset - clientA, clientB, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) receiver = suite.chainB.SenderAccount.GetAddress().String() // must be explicitly changed in malleate @@ -365,7 +366,7 @@ func (suite *KeeperTestSuite) TestOnTimeoutPacket() { suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { suite.SetupTest() // reset - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) amount = sdk.NewInt(100) // must be explicitly changed sender = suite.chainA.SenderAccount.GetAddress().String() diff --git a/x/ibc/applications/transfer/module_test.go b/x/ibc/applications/transfer/module_test.go index 7f3cec0bde4..b0d0fd10e4a 100644 --- a/x/ibc/applications/transfer/module_test.go +++ b/x/ibc/applications/transfer/module_test.go @@ -5,6 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/types" channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types" host "github.com/cosmos/cosmos-sdk/x/ibc/core/24-host" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -54,7 +55,7 @@ func (suite *TransferTestSuite) TestOnChanOpenInit() { suite.Run(tc.name, func() { suite.SetupTest() // reset - _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) testChannel = connA.NextTestChannel(ibctesting.TransferPort) counterparty := channeltypes.NewCounterparty(testChannel.PortID, testChannel.ID) channel = &channeltypes.Channel{ @@ -142,7 +143,7 @@ func (suite *TransferTestSuite) TestOnChanOpenTry() { suite.Run(tc.name, func() { suite.SetupTest() // reset - _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) testChannel = connA.NextTestChannel(ibctesting.TransferPort) counterparty := channeltypes.NewCounterparty(testChannel.PortID, testChannel.ID) channel = &channeltypes.Channel{ @@ -208,7 +209,7 @@ func (suite *TransferTestSuite) TestOnChanOpenAck() { suite.Run(tc.name, func() { suite.SetupTest() // reset - _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) testChannel = connA.NextTestChannel(ibctesting.TransferPort) counterpartyVersion = types.Version diff --git a/x/ibc/core/02-client/client/cli/cli.go b/x/ibc/core/02-client/client/cli/cli.go index 32aafc82c7f..375d8f63693 100644 --- a/x/ibc/core/02-client/client/cli/cli.go +++ b/x/ibc/core/02-client/client/cli/cli.go @@ -24,6 +24,7 @@ func GetQueryCmd() *cobra.Command { GetCmdQueryConsensusState(), GetCmdQueryHeader(), GetCmdNodeConsensusState(), + GetCmdParams(), ) return queryCmd diff --git a/x/ibc/core/02-client/client/cli/query.go b/x/ibc/core/02-client/client/cli/query.go index 9d4ad4c19d3..0140cb7850e 100644 --- a/x/ibc/core/02-client/client/cli/query.go +++ b/x/ibc/core/02-client/client/cli/query.go @@ -250,3 +250,30 @@ func GetCmdNodeConsensusState() *cobra.Command { return cmd } + +// GetCmdParams returns the command handler for ibc client parameter querying. +func GetCmdParams() *cobra.Command { + cmd := &cobra.Command{ + Use: "params", + Short: "Query the current ibc client parameters", + Long: "Query the current ibc client parameters", + Args: cobra.NoArgs, + Example: fmt.Sprintf("%s query %s %s params", version.AppName, host.ModuleName, types.SubModuleName), + RunE: func(cmd *cobra.Command, _ []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + clientCtx, err := client.ReadQueryCommandFlags(clientCtx, cmd.Flags()) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + res, _ := queryClient.ClientParams(context.Background(), &types.QueryClientParamsRequest{}) + return clientCtx.PrintOutput(res.Params) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/ibc/core/02-client/genesis.go b/x/ibc/core/02-client/genesis.go index cda4f7ed7fc..988e297c180 100644 --- a/x/ibc/core/02-client/genesis.go +++ b/x/ibc/core/02-client/genesis.go @@ -13,12 +13,18 @@ import ( // InitGenesis initializes the ibc client submodule's state from a provided genesis // state. func InitGenesis(ctx sdk.Context, k keeper.Keeper, gs types.GenesisState) { + k.SetParams(ctx, gs.Params) + for _, client := range gs.Clients { cs, ok := client.ClientState.GetCachedValue().(exported.ClientState) if !ok { panic("invalid client state") } + if !gs.Params.IsAllowedClient(cs.ClientType()) { + panic(fmt.Sprintf("client state type %s is not registered on the allowlist", cs.ClientType())) + } + k.SetClientState(ctx, client.ClientId, cs) } @@ -49,6 +55,10 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, gs types.GenesisState) { ctx.ChainID(), types.NewHeight(version, uint64(ctx.BlockHeight())), ) + if err := clientState.Validate(); err != nil { + panic(err) + } + if err := k.CreateClient(ctx, exported.Localhost, clientState, nil); err != nil { panic(err) } @@ -61,6 +71,7 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState { return types.GenesisState{ Clients: k.GetAllGenesisClients(ctx), ClientsConsensus: k.GetAllConsensusStates(ctx), + Params: k.GetParams(ctx), CreateLocalhost: false, } } diff --git a/x/ibc/core/02-client/keeper/client.go b/x/ibc/core/02-client/keeper/client.go index 49e9c62c881..83ecedc5354 100644 --- a/x/ibc/core/02-client/keeper/client.go +++ b/x/ibc/core/02-client/keeper/client.go @@ -17,6 +17,14 @@ import ( func (k Keeper) CreateClient( ctx sdk.Context, clientID string, clientState exported.ClientState, consensusState exported.ConsensusState, ) error { + params := k.GetParams(ctx) + if !params.IsAllowedClient(clientState.ClientType()) { + return sdkerrors.Wrapf( + types.ErrInvalidClientType, + "client state type %s is not registered in the allowlist", clientState.ClientType(), + ) + } + _, found := k.GetClientState(ctx, clientID) if found { return sdkerrors.Wrapf(types.ErrClientExists, "cannot create client with ID %s", clientID) diff --git a/x/ibc/core/02-client/keeper/client_test.go b/x/ibc/core/02-client/keeper/client_test.go index 30528b88ca7..0c700f907c1 100644 --- a/x/ibc/core/02-client/keeper/client_test.go +++ b/x/ibc/core/02-client/keeper/client_test.go @@ -261,7 +261,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -286,7 +286,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -313,7 +313,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -345,7 +345,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { upgradedClient = ibctmtypes.NewClientState("wrongchainID", ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, newClientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, true, true) suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -359,7 +359,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { for _, tc := range testCases { tc := tc - clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) tc.setup() diff --git a/x/ibc/core/02-client/keeper/grpc_query.go b/x/ibc/core/02-client/keeper/grpc_query.go index 8bb53068976..9f4bb6c8085 100644 --- a/x/ibc/core/02-client/keeper/grpc_query.go +++ b/x/ibc/core/02-client/keeper/grpc_query.go @@ -3,6 +3,7 @@ package keeper import ( "context" "fmt" + "sort" "strings" "google.golang.org/grpc/codes" @@ -58,7 +59,7 @@ func (q Keeper) ClientStates(c context.Context, req *types.QueryClientStatesRequ ctx := sdk.UnwrapSDKContext(c) - clientStates := []*types.IdentifiedClientState{} + clientStates := types.IdentifiedClientStates{} store := prefix.NewStore(ctx.KVStore(q.storeKey), host.KeyClientStorePrefix) pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { @@ -78,7 +79,7 @@ func (q Keeper) ClientStates(c context.Context, req *types.QueryClientStatesRequ } identifiedClient := types.NewIdentifiedClientState(clientID, clientState) - clientStates = append(clientStates, &identifiedClient) + clientStates = append(clientStates, identifiedClient) return nil }) @@ -86,6 +87,8 @@ func (q Keeper) ClientStates(c context.Context, req *types.QueryClientStatesRequ return nil, err } + sort.Sort(clientStates) + return &types.QueryClientStatesResponse{ ClientStates: clientStates, Pagination: pageRes, @@ -178,3 +181,13 @@ func (q Keeper) ConsensusStates(c context.Context, req *types.QueryConsensusStat Pagination: pageRes, }, nil } + +// ClientParams implements the Query/ClientParams gRPC method +func (q Keeper) ClientParams(c context.Context, _ *types.QueryClientParamsRequest) (*types.QueryClientParamsResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + params := q.GetParams(ctx) + + return &types.QueryClientParamsResponse{ + Params: ¶ms, + }, nil +} diff --git a/x/ibc/core/02-client/keeper/grpc_query_test.go b/x/ibc/core/02-client/keeper/grpc_query_test.go index b99d290f849..d111f540a9b 100644 --- a/x/ibc/core/02-client/keeper/grpc_query_test.go +++ b/x/ibc/core/02-client/keeper/grpc_query_test.go @@ -82,7 +82,7 @@ func (suite *KeeperTestSuite) TestQueryClientState() { func (suite *KeeperTestSuite) TestQueryClientStates() { var ( req *types.QueryClientStatesRequest - expClientStates = []*types.IdentifiedClientState(nil) + expClientStates = types.IdentifiedClientStates{} ) testCases := []struct { @@ -112,8 +112,8 @@ func (suite *KeeperTestSuite) TestQueryClientStates() { { "success", func() { - clientA1, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) - clientA2, _ := suite.coordinator.CreateClient(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA1, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) + clientA2, _ := suite.coordinator.CreateClient(suite.chainA, suite.chainB, exported.Tendermint) clientStateA1 := suite.chainA.GetClientState(clientA1) clientStateA2 := suite.chainA.GetClientState(clientA2) @@ -122,7 +122,7 @@ func (suite *KeeperTestSuite) TestQueryClientStates() { idcs2 := types.NewIdentifiedClientState(clientA2, clientStateA2) // order is sorted by client id, localhost is last - expClientStates = []*types.IdentifiedClientState{&idcs, &idcs2} + expClientStates = types.IdentifiedClientStates{idcs, idcs2}.Sort() req = &types.QueryClientStatesRequest{ Pagination: &query.PageRequest{ Limit: 7, @@ -144,7 +144,7 @@ func (suite *KeeperTestSuite) TestQueryClientStates() { // always add localhost which is created by default in init genesis localhostClientState := suite.chainA.GetClientState(exported.Localhost) identifiedLocalhost := types.NewIdentifiedClientState(exported.Localhost, localhostClientState) - expClientStates = append(expClientStates, &identifiedLocalhost) + expClientStates = append(expClientStates, identifiedLocalhost) ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) @@ -153,12 +153,7 @@ func (suite *KeeperTestSuite) TestQueryClientStates() { if tc.expPass { suite.Require().NoError(err) suite.Require().NotNil(res) - suite.Require().Equal(len(expClientStates), len(res.ClientStates)) - for i := range expClientStates { - suite.Require().Equal(expClientStates[i].ClientId, res.ClientStates[i].ClientId) - suite.Require().NotNil(res.ClientStates[i].ClientState) - suite.Require().Equal(expClientStates[i].ClientState, res.ClientStates[i].ClientState) - } + suite.Require().Equal(expClientStates.Sort(), res.ClientStates) } else { suite.Require().Error(err) } @@ -364,3 +359,10 @@ func (suite *KeeperTestSuite) TestQueryConsensusStates() { }) } } + +func (suite *KeeperTestSuite) TestQueryParams() { + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + expParams := types.DefaultParams() + res, _ := suite.queryClient.ClientParams(ctx, &types.QueryClientParamsRequest{}) + suite.Require().Equal(&expParams, res.Params) +} diff --git a/x/ibc/core/02-client/keeper/keeper.go b/x/ibc/core/02-client/keeper/keeper.go index 7c68499f8af..96632fc1710 100644 --- a/x/ibc/core/02-client/keeper/keeper.go +++ b/x/ibc/core/02-client/keeper/keeper.go @@ -18,6 +18,7 @@ import ( host "github.com/cosmos/cosmos-sdk/x/ibc/core/24-host" "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctmtypes "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" ) @@ -26,14 +27,21 @@ import ( type Keeper struct { storeKey sdk.StoreKey cdc codec.BinaryMarshaler + paramSpace paramtypes.Subspace stakingKeeper types.StakingKeeper } // NewKeeper creates a new NewKeeper instance -func NewKeeper(cdc codec.BinaryMarshaler, key sdk.StoreKey, sk types.StakingKeeper) Keeper { +func NewKeeper(cdc codec.BinaryMarshaler, key sdk.StoreKey, paramSpace paramtypes.Subspace, sk types.StakingKeeper) Keeper { + // set KeyTable if it has not already been set + if !paramSpace.HasKeyTable() { + paramSpace = paramSpace.WithKeyTable(types.ParamKeyTable()) + } + return Keeper{ storeKey: key, cdc: cdc, + paramSpace: paramSpace, stakingKeeper: sk, } } @@ -107,12 +115,14 @@ func (k Keeper) IterateConsensusStates(ctx sdk.Context, cb func(clientID string, } // GetAllGenesisClients returns all the clients in state with their client ids returned as IdentifiedClientState -func (k Keeper) GetAllGenesisClients(ctx sdk.Context) (genClients []types.IdentifiedClientState) { +func (k Keeper) GetAllGenesisClients(ctx sdk.Context) types.IdentifiedClientStates { + var genClients types.IdentifiedClientStates k.IterateClients(ctx, func(clientID string, cs exported.ClientState) bool { genClients = append(genClients, types.NewIdentifiedClientState(clientID, cs)) return false }) - return + + return genClients.Sort() } // GetAllConsensusStates returns all stored client consensus states. diff --git a/x/ibc/core/02-client/keeper/keeper_test.go b/x/ibc/core/02-client/keeper/keeper_test.go index d5e162b09ec..1f2c09ac5f7 100644 --- a/x/ibc/core/02-client/keeper/keeper_test.go +++ b/x/ibc/core/02-client/keeper/keeper_test.go @@ -243,30 +243,6 @@ func (suite *KeeperTestSuite) TestValidateSelfClient() { } } -func (suite KeeperTestSuite) TestGetAllClients() { - clientIDs := []string{ - testClientID2, testClientID3, testClientID, - } - expClients := []exported.ClientState{ - ibctmtypes.NewClientState(testChainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, types.ZeroHeight(), ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), - ibctmtypes.NewClientState(testChainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, types.ZeroHeight(), ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), - ibctmtypes.NewClientState(testChainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, types.ZeroHeight(), ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), - } - - for i := range expClients { - suite.chainA.App.IBCKeeper.ClientKeeper.SetClientState(suite.chainA.GetContext(), clientIDs[i], expClients[i]) - } - - // add localhost client - localHostClient, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), exported.Localhost) - suite.Require().True(found) - expClients = append(expClients, localHostClient) - - clients := suite.chainA.App.IBCKeeper.ClientKeeper.GetAllClients(suite.chainA.GetContext()) - suite.Require().Len(clients, len(expClients)) - suite.Require().Equal(expClients, clients) -} - func (suite KeeperTestSuite) TestGetAllGenesisClients() { clientIDs := []string{ testClientID2, testClientID3, testClientID, @@ -277,7 +253,7 @@ func (suite KeeperTestSuite) TestGetAllGenesisClients() { ibctmtypes.NewClientState(testChainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, types.ZeroHeight(), ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), } - expGenClients := make([]types.IdentifiedClientState, len(expClients)) + expGenClients := make(types.IdentifiedClientStates, len(expClients)) for i := range expClients { suite.chainA.App.IBCKeeper.ClientKeeper.SetClientState(suite.chainA.GetContext(), clientIDs[i], expClients[i]) @@ -291,7 +267,7 @@ func (suite KeeperTestSuite) TestGetAllGenesisClients() { genClients := suite.chainA.App.IBCKeeper.ClientKeeper.GetAllGenesisClients(suite.chainA.GetContext()) - suite.Require().Equal(expGenClients, genClients) + suite.Require().Equal(expGenClients.Sort(), genClients) } func (suite KeeperTestSuite) TestGetConsensusState() { @@ -347,7 +323,7 @@ func (suite KeeperTestSuite) TestConsensusStateHelpers() { // 2 clients in total are created on chainA. The first client is updated so it contains an initial consensus state // and a consensus state at the update height. func (suite KeeperTestSuite) TestGetAllConsensusStates() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) expConsensusHeight0 := clientState.GetLatestHeight() @@ -355,7 +331,7 @@ func (suite KeeperTestSuite) TestGetAllConsensusStates() { suite.Require().True(ok) // update client to create a second consensus state - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) clientState = suite.chainA.GetClientState(clientA) @@ -370,7 +346,7 @@ func (suite KeeperTestSuite) TestGetAllConsensusStates() { } // create second client on chainA - clientA2, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA2, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState = suite.chainA.GetClientState(clientA2) expConsensusHeight2 := clientState.GetLatestHeight() diff --git a/x/ibc/core/02-client/keeper/params.go b/x/ibc/core/02-client/keeper/params.go new file mode 100644 index 00000000000..04f4a256379 --- /dev/null +++ b/x/ibc/core/02-client/keeper/params.go @@ -0,0 +1,23 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" +) + +// GetAllowedClients retrieves the receive enabled boolean from the paramstore +func (k Keeper) GetAllowedClients(ctx sdk.Context) []string { + var res []string + k.paramSpace.Get(ctx, types.KeyAllowedClients, &res) + return res +} + +// GetParams returns the total set of ibc-transfer parameters. +func (k Keeper) GetParams(ctx sdk.Context) types.Params { + return types.NewParams(k.GetAllowedClients(ctx)...) +} + +// SetParams sets the total set of ibc-transfer parameters. +func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { + k.paramSpace.SetParamSet(ctx, ¶ms) +} diff --git a/x/ibc/core/02-client/keeper/params_test.go b/x/ibc/core/02-client/keeper/params_test.go new file mode 100644 index 00000000000..9df08597100 --- /dev/null +++ b/x/ibc/core/02-client/keeper/params_test.go @@ -0,0 +1,17 @@ +package keeper_test + +import ( + "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" +) + +func (suite *KeeperTestSuite) TestParams() { + expParams := types.DefaultParams() + + params := suite.chainA.App.IBCKeeper.ClientKeeper.GetParams(suite.chainA.GetContext()) + suite.Require().Equal(expParams, params) + + expParams.AllowedClients = []string{} + suite.chainA.App.IBCKeeper.ClientKeeper.SetParams(suite.chainA.GetContext(), expParams) + params = suite.chainA.App.IBCKeeper.ClientKeeper.GetParams(suite.chainA.GetContext()) + suite.Require().Empty(expParams.AllowedClients) +} diff --git a/x/ibc/core/02-client/keeper/proposal_test.go b/x/ibc/core/02-client/keeper/proposal_test.go index ea5cd372fa4..ada205402b3 100644 --- a/x/ibc/core/02-client/keeper/proposal_test.go +++ b/x/ibc/core/02-client/keeper/proposal_test.go @@ -21,7 +21,7 @@ func (suite *KeeperTestSuite) TestClientUpdateProposal() { }{ { "valid update client proposal", func() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) tmClientState, ok := clientState.(*ibctmtypes.ClientState) @@ -58,14 +58,14 @@ func (suite *KeeperTestSuite) TestClientUpdateProposal() { }, { "cannot unpack header, header is nil", func() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) content = &clienttypes.ClientUpdateProposal{ibctesting.Title, ibctesting.Description, clientA, nil} }, false, }, { "update fails", func() { header := &ibctmtypes.Header{} - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) content, err = clienttypes.NewClientUpdateProposal(ibctesting.Title, ibctesting.Description, clientA, header) suite.Require().NoError(err) }, false, diff --git a/x/ibc/core/02-client/proposal_handler_test.go b/x/ibc/core/02-client/proposal_handler_test.go index 839dd2e532a..91c1451b707 100644 --- a/x/ibc/core/02-client/proposal_handler_test.go +++ b/x/ibc/core/02-client/proposal_handler_test.go @@ -6,6 +6,7 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" client "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctmtypes "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -23,7 +24,7 @@ func (suite *ClientTestSuite) TestNewClientUpdateProposalHandler() { }{ { "valid update client proposal", func() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) tmClientState, ok := clientState.(*ibctmtypes.ClientState) diff --git a/x/ibc/core/02-client/types/client.go b/x/ibc/core/02-client/types/client.go index 99fe98e19ef..305b07cec47 100644 --- a/x/ibc/core/02-client/types/client.go +++ b/x/ibc/core/02-client/types/client.go @@ -2,6 +2,7 @@ package types import ( "fmt" + "sort" proto "github.com/gogo/protobuf/proto" @@ -37,6 +38,26 @@ func (ics IdentifiedClientState) UnpackInterfaces(unpacker codectypes.AnyUnpacke return unpacker.UnpackAny(ics.ClientState, new(exported.ClientState)) } +var _ sort.Interface = IdentifiedClientStates{} + +// IdentifiedClientStates defines a slice of ClientConsensusStates that supports the sort interface +type IdentifiedClientStates []IdentifiedClientState + +// Len implements sort.Interface +func (ics IdentifiedClientStates) Len() int { return len(ics) } + +// Less implements sort.Interface +func (ics IdentifiedClientStates) Less(i, j int) bool { return ics[i].ClientId < ics[j].ClientId } + +// Swap implements sort.Interface +func (ics IdentifiedClientStates) Swap(i, j int) { ics[i], ics[j] = ics[j], ics[i] } + +// Sort is a helper function to sort the set of IdentifiedClientStates in place +func (ics IdentifiedClientStates) Sort() IdentifiedClientStates { + sort.Sort(ics) + return ics +} + // NewConsensusStateWithHeight creates a new ConsensusStateWithHeight instance func NewConsensusStateWithHeight(height Height, consensusState exported.ConsensusState) ConsensusStateWithHeight { msg, ok := consensusState.(proto.Message) diff --git a/x/ibc/core/02-client/types/client.pb.go b/x/ibc/core/02-client/types/client.pb.go index aa9bd5c3d3b..95fc58c339e 100644 --- a/x/ibc/core/02-client/types/client.pb.go +++ b/x/ibc/core/02-client/types/client.pb.go @@ -4,15 +4,10 @@ package types import ( - context "context" fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" io "io" math "math" math_bits "math/bits" @@ -29,370 +24,6 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// MsgCreateClient defines a message to create an IBC client -type MsgCreateClient struct { - // client unique identifier - ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` - // light client state - ClientState *types.Any `protobuf:"bytes,2,opt,name=client_state,json=clientState,proto3" json:"client_state,omitempty" yaml:"client_state"` - // consensus state associated with the client that corresponds to a given - // height. - ConsensusState *types.Any `protobuf:"bytes,3,opt,name=consensus_state,json=consensusState,proto3" json:"consensus_state,omitempty" yaml:"consensus_state"` - // signer address - Signer string `protobuf:"bytes,4,opt,name=signer,proto3" json:"signer,omitempty"` -} - -func (m *MsgCreateClient) Reset() { *m = MsgCreateClient{} } -func (m *MsgCreateClient) String() string { return proto.CompactTextString(m) } -func (*MsgCreateClient) ProtoMessage() {} -func (*MsgCreateClient) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{0} -} -func (m *MsgCreateClient) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgCreateClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgCreateClient.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgCreateClient) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgCreateClient.Merge(m, src) -} -func (m *MsgCreateClient) XXX_Size() int { - return m.Size() -} -func (m *MsgCreateClient) XXX_DiscardUnknown() { - xxx_messageInfo_MsgCreateClient.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgCreateClient proto.InternalMessageInfo - -// MsgCreateClientResponse defines the Msg/CreateClient response type. -type MsgCreateClientResponse struct { -} - -func (m *MsgCreateClientResponse) Reset() { *m = MsgCreateClientResponse{} } -func (m *MsgCreateClientResponse) String() string { return proto.CompactTextString(m) } -func (*MsgCreateClientResponse) ProtoMessage() {} -func (*MsgCreateClientResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{1} -} -func (m *MsgCreateClientResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgCreateClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgCreateClientResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgCreateClientResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgCreateClientResponse.Merge(m, src) -} -func (m *MsgCreateClientResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgCreateClientResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgCreateClientResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgCreateClientResponse proto.InternalMessageInfo - -// MsgUpdateClient defines an sdk.Msg to update a IBC client state using -// the given header. -type MsgUpdateClient struct { - // client unique identifier - ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` - // header to update the light client - Header *types.Any `protobuf:"bytes,2,opt,name=header,proto3" json:"header,omitempty"` - // signer address - Signer string `protobuf:"bytes,3,opt,name=signer,proto3" json:"signer,omitempty"` -} - -func (m *MsgUpdateClient) Reset() { *m = MsgUpdateClient{} } -func (m *MsgUpdateClient) String() string { return proto.CompactTextString(m) } -func (*MsgUpdateClient) ProtoMessage() {} -func (*MsgUpdateClient) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{2} -} -func (m *MsgUpdateClient) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpdateClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpdateClient.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgUpdateClient) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpdateClient.Merge(m, src) -} -func (m *MsgUpdateClient) XXX_Size() int { - return m.Size() -} -func (m *MsgUpdateClient) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpdateClient.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpdateClient proto.InternalMessageInfo - -// MsgUpdateClientResponse defines the Msg/UpdateClient response type. -type MsgUpdateClientResponse struct { -} - -func (m *MsgUpdateClientResponse) Reset() { *m = MsgUpdateClientResponse{} } -func (m *MsgUpdateClientResponse) String() string { return proto.CompactTextString(m) } -func (*MsgUpdateClientResponse) ProtoMessage() {} -func (*MsgUpdateClientResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{3} -} -func (m *MsgUpdateClientResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpdateClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpdateClientResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgUpdateClientResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpdateClientResponse.Merge(m, src) -} -func (m *MsgUpdateClientResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgUpdateClientResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpdateClientResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpdateClientResponse proto.InternalMessageInfo - -// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client state -type MsgUpgradeClient struct { - // client unique identifier - ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` - // upgraded client state - ClientState *types.Any `protobuf:"bytes,2,opt,name=client_state,json=clientState,proto3" json:"client_state,omitempty" yaml:"client_state"` - // height at which old chain halts and upgrades (i.e last block executed) - UpgradeHeight *Height `protobuf:"bytes,3,opt,name=upgrade_height,json=upgradeHeight,proto3" json:"upgrade_height,omitempty" yaml:"upgrade_height"` - // proof that old chain committed to new client - ProofUpgrade []byte `protobuf:"bytes,4,opt,name=proof_upgrade,json=proofUpgrade,proto3" json:"proof_upgrade,omitempty" yaml:"proof_upgrade"` - // signer address - Signer string `protobuf:"bytes,5,opt,name=signer,proto3" json:"signer,omitempty"` -} - -func (m *MsgUpgradeClient) Reset() { *m = MsgUpgradeClient{} } -func (m *MsgUpgradeClient) String() string { return proto.CompactTextString(m) } -func (*MsgUpgradeClient) ProtoMessage() {} -func (*MsgUpgradeClient) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{4} -} -func (m *MsgUpgradeClient) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpgradeClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpgradeClient.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgUpgradeClient) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpgradeClient.Merge(m, src) -} -func (m *MsgUpgradeClient) XXX_Size() int { - return m.Size() -} -func (m *MsgUpgradeClient) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpgradeClient.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpgradeClient proto.InternalMessageInfo - -func (m *MsgUpgradeClient) GetClientId() string { - if m != nil { - return m.ClientId - } - return "" -} - -func (m *MsgUpgradeClient) GetClientState() *types.Any { - if m != nil { - return m.ClientState - } - return nil -} - -func (m *MsgUpgradeClient) GetUpgradeHeight() *Height { - if m != nil { - return m.UpgradeHeight - } - return nil -} - -func (m *MsgUpgradeClient) GetProofUpgrade() []byte { - if m != nil { - return m.ProofUpgrade - } - return nil -} - -func (m *MsgUpgradeClient) GetSigner() string { - if m != nil { - return m.Signer - } - return "" -} - -// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. -type MsgUpgradeClientResponse struct { -} - -func (m *MsgUpgradeClientResponse) Reset() { *m = MsgUpgradeClientResponse{} } -func (m *MsgUpgradeClientResponse) String() string { return proto.CompactTextString(m) } -func (*MsgUpgradeClientResponse) ProtoMessage() {} -func (*MsgUpgradeClientResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{5} -} -func (m *MsgUpgradeClientResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpgradeClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpgradeClientResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgUpgradeClientResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpgradeClientResponse.Merge(m, src) -} -func (m *MsgUpgradeClientResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgUpgradeClientResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpgradeClientResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpgradeClientResponse proto.InternalMessageInfo - -// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for -// light client misbehaviour. -type MsgSubmitMisbehaviour struct { - // client unique identifier - ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` - // misbehaviour used for freezing the light client - Misbehaviour *types.Any `protobuf:"bytes,2,opt,name=misbehaviour,proto3" json:"misbehaviour,omitempty"` - // signer address - Signer string `protobuf:"bytes,3,opt,name=signer,proto3" json:"signer,omitempty"` -} - -func (m *MsgSubmitMisbehaviour) Reset() { *m = MsgSubmitMisbehaviour{} } -func (m *MsgSubmitMisbehaviour) String() string { return proto.CompactTextString(m) } -func (*MsgSubmitMisbehaviour) ProtoMessage() {} -func (*MsgSubmitMisbehaviour) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{6} -} -func (m *MsgSubmitMisbehaviour) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgSubmitMisbehaviour) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgSubmitMisbehaviour.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgSubmitMisbehaviour) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgSubmitMisbehaviour.Merge(m, src) -} -func (m *MsgSubmitMisbehaviour) XXX_Size() int { - return m.Size() -} -func (m *MsgSubmitMisbehaviour) XXX_DiscardUnknown() { - xxx_messageInfo_MsgSubmitMisbehaviour.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgSubmitMisbehaviour proto.InternalMessageInfo - -// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response type. -type MsgSubmitMisbehaviourResponse struct { -} - -func (m *MsgSubmitMisbehaviourResponse) Reset() { *m = MsgSubmitMisbehaviourResponse{} } -func (m *MsgSubmitMisbehaviourResponse) String() string { return proto.CompactTextString(m) } -func (*MsgSubmitMisbehaviourResponse) ProtoMessage() {} -func (*MsgSubmitMisbehaviourResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{7} -} -func (m *MsgSubmitMisbehaviourResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgSubmitMisbehaviourResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgSubmitMisbehaviourResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgSubmitMisbehaviourResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgSubmitMisbehaviourResponse.Merge(m, src) -} -func (m *MsgSubmitMisbehaviourResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgSubmitMisbehaviourResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgSubmitMisbehaviourResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgSubmitMisbehaviourResponse proto.InternalMessageInfo - // IdentifiedClientState defines a client state with an additional client // identifier field. type IdentifiedClientState struct { @@ -406,7 +37,7 @@ func (m *IdentifiedClientState) Reset() { *m = IdentifiedClientState{} } func (m *IdentifiedClientState) String() string { return proto.CompactTextString(m) } func (*IdentifiedClientState) ProtoMessage() {} func (*IdentifiedClientState) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{8} + return fileDescriptor_b6bc4c8185546947, []int{0} } func (m *IdentifiedClientState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -461,7 +92,7 @@ func (m *ConsensusStateWithHeight) Reset() { *m = ConsensusStateWithHeig func (m *ConsensusStateWithHeight) String() string { return proto.CompactTextString(m) } func (*ConsensusStateWithHeight) ProtoMessage() {} func (*ConsensusStateWithHeight) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{9} + return fileDescriptor_b6bc4c8185546947, []int{1} } func (m *ConsensusStateWithHeight) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -517,7 +148,7 @@ func (m *ClientConsensusStates) Reset() { *m = ClientConsensusStates{} } func (m *ClientConsensusStates) String() string { return proto.CompactTextString(m) } func (*ClientConsensusStates) ProtoMessage() {} func (*ClientConsensusStates) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{10} + return fileDescriptor_b6bc4c8185546947, []int{2} } func (m *ClientConsensusStates) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -578,7 +209,7 @@ func (m *ClientUpdateProposal) Reset() { *m = ClientUpdateProposal{} } func (m *ClientUpdateProposal) String() string { return proto.CompactTextString(m) } func (*ClientUpdateProposal) ProtoMessage() {} func (*ClientUpdateProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{11} + return fileDescriptor_b6bc4c8185546947, []int{3} } func (m *ClientUpdateProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -626,7 +257,7 @@ type Height struct { func (m *Height) Reset() { *m = Height{} } func (*Height) ProtoMessage() {} func (*Height) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{12} + return fileDescriptor_b6bc4c8185546947, []int{4} } func (m *Height) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -655,315 +286,124 @@ func (m *Height) XXX_DiscardUnknown() { var xxx_messageInfo_Height proto.InternalMessageInfo +// Params defines the set of IBC light client parameters. +type Params struct { + // allowed_clients defines the list of allowed client state types. + AllowedClients []string `protobuf:"bytes,1,rep,name=allowed_clients,json=allowedClients,proto3" json:"allowed_clients,omitempty" yaml:"allowed_clients"` +} + +func (m *Params) Reset() { *m = Params{} } +func (m *Params) String() string { return proto.CompactTextString(m) } +func (*Params) ProtoMessage() {} +func (*Params) Descriptor() ([]byte, []int) { + return fileDescriptor_b6bc4c8185546947, []int{5} +} +func (m *Params) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Params.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Params) XXX_Merge(src proto.Message) { + xxx_messageInfo_Params.Merge(m, src) +} +func (m *Params) XXX_Size() int { + return m.Size() +} +func (m *Params) XXX_DiscardUnknown() { + xxx_messageInfo_Params.DiscardUnknown(m) +} + +var xxx_messageInfo_Params proto.InternalMessageInfo + +func (m *Params) GetAllowedClients() []string { + if m != nil { + return m.AllowedClients + } + return nil +} + func init() { - proto.RegisterType((*MsgCreateClient)(nil), "ibc.core.client.v1.MsgCreateClient") - proto.RegisterType((*MsgCreateClientResponse)(nil), "ibc.core.client.v1.MsgCreateClientResponse") - proto.RegisterType((*MsgUpdateClient)(nil), "ibc.core.client.v1.MsgUpdateClient") - proto.RegisterType((*MsgUpdateClientResponse)(nil), "ibc.core.client.v1.MsgUpdateClientResponse") - proto.RegisterType((*MsgUpgradeClient)(nil), "ibc.core.client.v1.MsgUpgradeClient") - proto.RegisterType((*MsgUpgradeClientResponse)(nil), "ibc.core.client.v1.MsgUpgradeClientResponse") - proto.RegisterType((*MsgSubmitMisbehaviour)(nil), "ibc.core.client.v1.MsgSubmitMisbehaviour") - proto.RegisterType((*MsgSubmitMisbehaviourResponse)(nil), "ibc.core.client.v1.MsgSubmitMisbehaviourResponse") proto.RegisterType((*IdentifiedClientState)(nil), "ibc.core.client.v1.IdentifiedClientState") proto.RegisterType((*ConsensusStateWithHeight)(nil), "ibc.core.client.v1.ConsensusStateWithHeight") proto.RegisterType((*ClientConsensusStates)(nil), "ibc.core.client.v1.ClientConsensusStates") proto.RegisterType((*ClientUpdateProposal)(nil), "ibc.core.client.v1.ClientUpdateProposal") proto.RegisterType((*Height)(nil), "ibc.core.client.v1.Height") + proto.RegisterType((*Params)(nil), "ibc.core.client.v1.Params") } func init() { proto.RegisterFile("ibc/core/client/v1/client.proto", fileDescriptor_b6bc4c8185546947) } var fileDescriptor_b6bc4c8185546947 = []byte{ - // 827 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0x3f, 0x6f, 0x1a, 0x49, - 0x14, 0x67, 0x01, 0x23, 0x7b, 0x00, 0xdb, 0xda, 0x03, 0x1b, 0xaf, 0x74, 0x2c, 0x9a, 0xbb, 0xc2, - 0xa7, 0xb3, 0x77, 0x0f, 0xae, 0x38, 0xcb, 0xd2, 0x49, 0x77, 0xd0, 0x9c, 0x0b, 0x4e, 0xbe, 0xb5, - 0x4e, 0xf9, 0xa3, 0x48, 0x64, 0xff, 0x8c, 0x97, 0x51, 0x60, 0x07, 0xed, 0x2c, 0xc8, 0x7c, 0x83, - 0x94, 0x91, 0x12, 0x45, 0x29, 0x52, 0x58, 0x29, 0x52, 0xa6, 0xcb, 0x37, 0x48, 0xe1, 0x22, 0x85, - 0xcb, 0x54, 0x28, 0xb2, 0x9b, 0xd4, 0x7c, 0x82, 0x68, 0x77, 0xc6, 0xab, 0x5d, 0x0c, 0x98, 0x38, - 0x8d, 0x2b, 0xf6, 0xbd, 0xf9, 0xcd, 0xef, 0xbd, 0xf7, 0x9b, 0x37, 0x6f, 0x00, 0x32, 0x36, 0x4c, - 0xd5, 0x24, 0x2e, 0x52, 0xcd, 0x0e, 0x46, 0x8e, 0xa7, 0x0e, 0xaa, 0xfc, 0x4b, 0xe9, 0xb9, 0xc4, - 0x23, 0xa2, 0x88, 0x0d, 0x53, 0xf1, 0x01, 0x0a, 0x77, 0x0f, 0xaa, 0x52, 0xc1, 0x26, 0x36, 0x09, - 0x96, 0x55, 0xff, 0x8b, 0x21, 0xa5, 0x2d, 0x9b, 0x10, 0xbb, 0x83, 0xd4, 0xc0, 0x32, 0xfa, 0xc7, - 0xaa, 0xee, 0x0c, 0xd9, 0x12, 0x7c, 0x9e, 0x04, 0x6b, 0x4d, 0x6a, 0x37, 0x5c, 0xa4, 0x7b, 0xa8, - 0x11, 0xf0, 0x88, 0x55, 0xb0, 0xc2, 0x18, 0x5b, 0xd8, 0x2a, 0x09, 0x15, 0x61, 0x7b, 0xa5, 0x5e, - 0x18, 0x8f, 0xe4, 0xf5, 0xa1, 0xde, 0xed, 0xec, 0xc3, 0x70, 0x09, 0x6a, 0xcb, 0xec, 0xfb, 0xc0, - 0x12, 0x0f, 0x41, 0x8e, 0xfb, 0xa9, 0xa7, 0x7b, 0xa8, 0x94, 0xac, 0x08, 0xdb, 0xd9, 0x5a, 0x41, - 0x61, 0x81, 0x95, 0xab, 0xc0, 0xca, 0xdf, 0xce, 0xb0, 0xbe, 0x39, 0x1e, 0xc9, 0x3f, 0xc4, 0xb8, - 0x82, 0x3d, 0x50, 0xcb, 0x32, 0xf3, 0xc8, 0xb7, 0xc4, 0x07, 0x60, 0xcd, 0x24, 0x0e, 0x45, 0x0e, - 0xed, 0x53, 0x4e, 0x9a, 0x9a, 0x43, 0x2a, 0x8d, 0x47, 0xf2, 0x06, 0x27, 0x8d, 0x6f, 0x83, 0xda, - 0x6a, 0xe8, 0x61, 0xd4, 0x1b, 0x20, 0x43, 0xb1, 0xed, 0x20, 0xb7, 0x94, 0xf6, 0x8b, 0xd3, 0xb8, - 0xb5, 0xbf, 0xfc, 0xf4, 0x54, 0x4e, 0x7c, 0x39, 0x95, 0x13, 0x70, 0x0b, 0x6c, 0x4e, 0x88, 0xa2, - 0x21, 0xda, 0xf3, 0x59, 0xe0, 0x0b, 0x21, 0x10, 0xec, 0xff, 0x9e, 0xf5, 0x5d, 0x82, 0xed, 0x80, - 0x4c, 0x1b, 0xe9, 0x16, 0x72, 0xe7, 0x49, 0xa5, 0x71, 0x4c, 0x24, 0xe3, 0xd4, 0xdc, 0x8c, 0xa3, - 0x59, 0x85, 0x19, 0x7f, 0x4c, 0x82, 0xf5, 0x60, 0xcd, 0x76, 0x75, 0xeb, 0x4e, 0x9d, 0xf1, 0x23, - 0xb0, 0xda, 0x67, 0x59, 0xb5, 0xda, 0x08, 0xdb, 0x6d, 0x8f, 0x1f, 0xb1, 0xa4, 0x5c, 0x6f, 0x6d, - 0xe5, 0x9f, 0x00, 0x51, 0xdf, 0x1a, 0x8f, 0xe4, 0x22, 0x63, 0x8e, 0xef, 0x85, 0x5a, 0x9e, 0x3b, - 0x18, 0x52, 0xfc, 0x13, 0xe4, 0x7b, 0x2e, 0x21, 0xc7, 0x2d, 0xee, 0x0e, 0x4e, 0x3b, 0x57, 0x2f, - 0x8d, 0x47, 0x72, 0x81, 0x11, 0xc4, 0x96, 0xa1, 0x96, 0x0b, 0x6c, 0xae, 0x53, 0x44, 0xf3, 0xa5, - 0xa8, 0xe6, 0x50, 0x02, 0xa5, 0x49, 0x35, 0x43, 0xa9, 0xdf, 0x0a, 0xa0, 0xd8, 0xa4, 0xf6, 0x51, - 0xdf, 0xe8, 0x62, 0xaf, 0x89, 0xa9, 0x81, 0xda, 0xfa, 0x00, 0x93, 0xbe, 0x7b, 0x1b, 0xbd, 0xf7, - 0x40, 0xae, 0x1b, 0xa1, 0x98, 0xdb, 0x28, 0x31, 0xe4, 0x02, 0xed, 0x22, 0x83, 0x1f, 0xa7, 0xe6, - 0x19, 0x56, 0xf2, 0x5a, 0x00, 0xc5, 0x03, 0x0b, 0x39, 0x1e, 0x3e, 0xc6, 0xc8, 0x6a, 0x44, 0x0e, - 0xed, 0x2e, 0x74, 0x0e, 0x7c, 0x27, 0x80, 0x52, 0x23, 0x76, 0xab, 0xef, 0x61, 0xaf, 0xcd, 0x0f, - 0x7e, 0xcf, 0xbf, 0x5b, 0x41, 0x3b, 0x09, 0x37, 0xb6, 0x53, 0xfa, 0x6c, 0x24, 0x27, 0x34, 0x8e, - 0x17, 0xef, 0x5f, 0x1f, 0x3a, 0xf3, 0x72, 0x0d, 0x7b, 0xf1, 0xc6, 0x99, 0x03, 0x3f, 0x08, 0xa0, - 0xc8, 0x54, 0x8c, 0xa7, 0x4d, 0x6f, 0xa3, 0xe7, 0x09, 0x58, 0x9f, 0x08, 0x48, 0x4b, 0xc9, 0x4a, - 0x6a, 0x3b, 0x5b, 0xdb, 0x99, 0x56, 0xea, 0x2c, 0xa1, 0xea, 0xb2, 0x5f, 0xfc, 0x78, 0x24, 0x6f, - 0x4e, 0x1d, 0x9c, 0x14, 0x6a, 0x6b, 0xf1, 0x2a, 0x28, 0x7c, 0x2f, 0x80, 0x02, 0x2b, 0x83, 0x8d, - 0x9a, 0x43, 0x97, 0xf4, 0x08, 0xd5, 0x3b, 0x62, 0x01, 0x2c, 0x79, 0xd8, 0xeb, 0x20, 0x56, 0x81, - 0xc6, 0x0c, 0xb1, 0x02, 0xb2, 0x16, 0xa2, 0xa6, 0x8b, 0x7b, 0x1e, 0x26, 0x4e, 0xa0, 0xe5, 0x8a, - 0x16, 0x75, 0xc5, 0xab, 0x4f, 0x7d, 0xe3, 0xe8, 0x4c, 0xdf, 0x3c, 0x3a, 0xf7, 0xd3, 0x7e, 0xcf, - 0xc3, 0x97, 0x02, 0xc8, 0xf0, 0xee, 0xf8, 0x0b, 0xac, 0x0e, 0x90, 0x4b, 0x31, 0x71, 0x5a, 0x4e, - 0xbf, 0x6b, 0x20, 0x37, 0x48, 0x39, 0x1d, 0x1d, 0x2c, 0xf1, 0x75, 0xa8, 0xe5, 0xb9, 0xe3, 0xdf, - 0xc0, 0x8e, 0x32, 0xf0, 0x3e, 0x4b, 0xce, 0x62, 0x08, 0x47, 0x13, 0x77, 0xb0, 0x1c, 0xd8, 0x45, - 0x7c, 0x75, 0x2a, 0x27, 0x6a, 0x6f, 0x52, 0x20, 0xd5, 0xa4, 0xb6, 0xf8, 0x18, 0xe4, 0x62, 0x6f, - 0xf0, 0x4f, 0xd3, 0x0e, 0x72, 0xe2, 0x4d, 0x92, 0x7e, 0x5d, 0x00, 0x74, 0x75, 0xa3, 0xfd, 0x08, - 0xb1, 0x47, 0x6b, 0x56, 0x84, 0x28, 0x68, 0x66, 0x84, 0x69, 0x0f, 0x8d, 0x68, 0x82, 0x7c, 0xfc, - 0x91, 0xf9, 0x79, 0xe6, 0xee, 0x08, 0x4a, 0xda, 0x59, 0x04, 0x15, 0x06, 0x71, 0x81, 0x38, 0x65, - 0xbc, 0xfe, 0x32, 0x83, 0xe3, 0x3a, 0x54, 0xaa, 0x2e, 0x0c, 0xbd, 0x8a, 0x59, 0xff, 0xef, 0xec, - 0xa2, 0x2c, 0x9c, 0x5f, 0x94, 0x85, 0xcf, 0x17, 0x65, 0xe1, 0xd9, 0x65, 0x39, 0x71, 0x7e, 0x59, - 0x4e, 0x7c, 0xba, 0x2c, 0x27, 0x1e, 0xfe, 0x61, 0x63, 0xaf, 0xdd, 0x37, 0x14, 0x93, 0x74, 0x55, - 0x93, 0xd0, 0x2e, 0xa1, 0xfc, 0x67, 0x97, 0x5a, 0x4f, 0xd4, 0x13, 0x35, 0xfc, 0x0f, 0xf7, 0x5b, - 0x6d, 0x97, 0xff, 0x8d, 0xf3, 0x86, 0x3d, 0x44, 0x8d, 0x4c, 0xd0, 0xac, 0xbf, 0x7f, 0x0d, 0x00, - 0x00, 0xff, 0xff, 0x06, 0xa7, 0xa2, 0x16, 0xe6, 0x09, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// MsgClient is the client API for Msg service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type MsgClient interface { - // CreateClient defines a rpc handler method for MsgCreateClient. - CreateClient(ctx context.Context, in *MsgCreateClient, opts ...grpc.CallOption) (*MsgCreateClientResponse, error) - // UpdateClient defines a rpc handler method for MsgUpdateClient. - UpdateClient(ctx context.Context, in *MsgUpdateClient, opts ...grpc.CallOption) (*MsgUpdateClientResponse, error) - // UpgradeClient defines a rpc handler method for MsgUpgradeClient. - UpgradeClient(ctx context.Context, in *MsgUpgradeClient, opts ...grpc.CallOption) (*MsgUpgradeClientResponse, error) - // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. - SubmitMisbehaviour(ctx context.Context, in *MsgSubmitMisbehaviour, opts ...grpc.CallOption) (*MsgSubmitMisbehaviourResponse, error) -} - -type msgClient struct { - cc grpc1.ClientConn -} - -func NewMsgClient(cc grpc1.ClientConn) MsgClient { - return &msgClient{cc} + // 579 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xbd, 0x8e, 0xd3, 0x4c, + 0x14, 0xcd, 0x6c, 0xf2, 0x45, 0x9b, 0xc9, 0x47, 0xb2, 0x32, 0x09, 0xeb, 0x4d, 0x61, 0x47, 0x53, + 0xa5, 0xd8, 0xb5, 0x49, 0x28, 0x40, 0xa9, 0xc0, 0x69, 0xd8, 0x02, 0x14, 0x8c, 0x10, 0x88, 0x26, + 0xf2, 0xcf, 0xac, 0x33, 0xc2, 0xf1, 0x44, 0x9e, 0x49, 0xd8, 0xbc, 0x01, 0x25, 0x15, 0xa2, 0xa0, + 0xe0, 0x09, 0xe8, 0x78, 0x03, 0x8a, 0x2d, 0xb7, 0xa4, 0xb2, 0x50, 0xf2, 0x06, 0x79, 0x02, 0x64, + 0xcf, 0xec, 0x66, 0x1d, 0x88, 0xb4, 0xa2, 0xf2, 0x9d, 0x7b, 0xaf, 0xcf, 0x3d, 0xe7, 0xdc, 0xd1, + 0x40, 0x9d, 0xb8, 0x9e, 0xe9, 0xd1, 0x18, 0x9b, 0x5e, 0x48, 0x70, 0xc4, 0xcd, 0x79, 0x57, 0x46, + 0xc6, 0x34, 0xa6, 0x9c, 0x2a, 0x0a, 0x71, 0x3d, 0x23, 0x6d, 0x30, 0x64, 0x7a, 0xde, 0x6d, 0x35, + 0x02, 0x1a, 0xd0, 0xac, 0x6c, 0xa6, 0x91, 0xe8, 0x6c, 0x1d, 0x05, 0x94, 0x06, 0x21, 0x36, 0xb3, + 0x93, 0x3b, 0x3b, 0x33, 0x9d, 0x68, 0x21, 0x4a, 0xe8, 0x0b, 0x80, 0xcd, 0x53, 0x1f, 0x47, 0x9c, + 0x9c, 0x11, 0xec, 0x0f, 0x32, 0xa0, 0x97, 0xdc, 0xe1, 0x58, 0xe9, 0xc2, 0x8a, 0xc0, 0x1d, 0x11, + 0x5f, 0x05, 0x6d, 0xd0, 0xa9, 0x58, 0x8d, 0x75, 0xa2, 0x1f, 0x2c, 0x9c, 0x49, 0xd8, 0x47, 0xd7, + 0x25, 0x64, 0xef, 0x8b, 0xf8, 0xd4, 0x57, 0x86, 0xf0, 0x7f, 0x99, 0x67, 0x29, 0x84, 0xba, 0xd7, + 0x06, 0x9d, 0x6a, 0xaf, 0x61, 0x88, 0xf1, 0xc6, 0xd5, 0x78, 0xe3, 0x49, 0xb4, 0xb0, 0x0e, 0xd7, + 0x89, 0x7e, 0x37, 0x87, 0x95, 0xfd, 0x83, 0xec, 0xaa, 0xb7, 0x21, 0x81, 0xbe, 0x01, 0xa8, 0x0e, + 0x68, 0xc4, 0x70, 0xc4, 0x66, 0x2c, 0x4b, 0xbd, 0x26, 0x7c, 0xfc, 0x14, 0x93, 0x60, 0xcc, 0x95, + 0x47, 0xb0, 0x3c, 0xce, 0xa2, 0x8c, 0x5e, 0xb5, 0xd7, 0x32, 0xfe, 0x74, 0xc4, 0x10, 0xbd, 0x56, + 0xe9, 0x22, 0xd1, 0x0b, 0xb6, 0xec, 0x57, 0xde, 0xc0, 0xba, 0x77, 0x85, 0x7a, 0x0b, 0xae, 0x47, + 0xeb, 0x44, 0x6f, 0xa6, 0x5c, 0xd1, 0xd6, 0x5f, 0xc8, 0xae, 0x79, 0x39, 0x76, 0xe8, 0x07, 0x80, + 0x4d, 0xe1, 0x62, 0x9e, 0x36, 0xfb, 0x17, 0x3f, 0xcf, 0xe1, 0xc1, 0xd6, 0x40, 0xa6, 0xee, 0xb5, + 0x8b, 0x9d, 0x6a, 0xef, 0xf8, 0x6f, 0x52, 0x77, 0x19, 0x65, 0xe9, 0xa9, 0xf8, 0x75, 0xa2, 0x1f, + 0xca, 0x59, 0x5b, 0x98, 0xc8, 0xae, 0xe7, 0x55, 0x30, 0xf4, 0x1d, 0xc0, 0x86, 0x90, 0xf1, 0x6a, + 0xea, 0x3b, 0x1c, 0x0f, 0x63, 0x3a, 0xa5, 0xcc, 0x09, 0x95, 0x06, 0xfc, 0x8f, 0x13, 0x1e, 0x62, + 0xa1, 0xc0, 0x16, 0x07, 0xa5, 0x0d, 0xab, 0x3e, 0x66, 0x5e, 0x4c, 0xa6, 0x9c, 0xd0, 0x28, 0xf3, + 0xb2, 0x62, 0xdf, 0x4c, 0xe5, 0xd5, 0x17, 0x6f, 0xa5, 0xfe, 0x38, 0x5d, 0xaf, 0xe3, 0xe3, 0x58, + 0x2d, 0xed, 0xde, 0x8d, 0x2d, 0x7b, 0xfa, 0xa5, 0x0f, 0x5f, 0xf5, 0x02, 0xfa, 0x04, 0x60, 0x59, + 0xde, 0x8e, 0xc7, 0xb0, 0x36, 0xc7, 0x31, 0x23, 0x34, 0x1a, 0x45, 0xb3, 0x89, 0x8b, 0xe3, 0x8c, + 0x72, 0x69, 0xb3, 0xcc, 0x3e, 0xca, 0xd7, 0x91, 0x7d, 0x47, 0x26, 0x9e, 0x67, 0xe7, 0x9b, 0x08, + 0xf2, 0x9e, 0xed, 0xed, 0x42, 0x10, 0xf5, 0x0d, 0x82, 0xe0, 0xd0, 0xdf, 0x4f, 0x49, 0x7d, 0x4e, + 0x89, 0x3d, 0x83, 0xe5, 0xa1, 0x13, 0x3b, 0x13, 0xa6, 0x0c, 0x60, 0xdd, 0x09, 0x43, 0xfa, 0x1e, + 0xfb, 0x23, 0x21, 0x95, 0xa9, 0xa0, 0x5d, 0xec, 0x54, 0xac, 0xd6, 0x3a, 0xd1, 0xef, 0x09, 0xd8, + 0xad, 0x06, 0x64, 0xd7, 0x64, 0x46, 0xec, 0x84, 0x59, 0x2f, 0x2e, 0x96, 0x1a, 0xb8, 0x5c, 0x6a, + 0xe0, 0xd7, 0x52, 0x03, 0x1f, 0x57, 0x5a, 0xe1, 0x72, 0xa5, 0x15, 0x7e, 0xae, 0xb4, 0xc2, 0xdb, + 0x87, 0x01, 0xe1, 0xe3, 0x99, 0x6b, 0x78, 0x74, 0x62, 0x7a, 0x94, 0x4d, 0x28, 0x93, 0x9f, 0x13, + 0xe6, 0xbf, 0x33, 0xcf, 0xcd, 0xeb, 0x57, 0xe5, 0x7e, 0xef, 0x44, 0x3e, 0x2c, 0x7c, 0x31, 0xc5, + 0xcc, 0x2d, 0x67, 0xb6, 0x3e, 0xf8, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x91, 0xd2, 0x2f, 0x3f, 0x78, + 0x04, 0x00, 0x00, } -func (c *msgClient) CreateClient(ctx context.Context, in *MsgCreateClient, opts ...grpc.CallOption) (*MsgCreateClientResponse, error) { - out := new(MsgCreateClientResponse) - err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/CreateClient", in, out, opts...) +func (m *IdentifiedClientState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } - return out, nil + return dAtA[:n], nil } -func (c *msgClient) UpdateClient(ctx context.Context, in *MsgUpdateClient, opts ...grpc.CallOption) (*MsgUpdateClientResponse, error) { - out := new(MsgUpdateClientResponse) - err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/UpdateClient", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) UpgradeClient(ctx context.Context, in *MsgUpgradeClient, opts ...grpc.CallOption) (*MsgUpgradeClientResponse, error) { - out := new(MsgUpgradeClientResponse) - err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/UpgradeClient", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) SubmitMisbehaviour(ctx context.Context, in *MsgSubmitMisbehaviour, opts ...grpc.CallOption) (*MsgSubmitMisbehaviourResponse, error) { - out := new(MsgSubmitMisbehaviourResponse) - err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/SubmitMisbehaviour", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MsgServer is the server API for Msg service. -type MsgServer interface { - // CreateClient defines a rpc handler method for MsgCreateClient. - CreateClient(context.Context, *MsgCreateClient) (*MsgCreateClientResponse, error) - // UpdateClient defines a rpc handler method for MsgUpdateClient. - UpdateClient(context.Context, *MsgUpdateClient) (*MsgUpdateClientResponse, error) - // UpgradeClient defines a rpc handler method for MsgUpgradeClient. - UpgradeClient(context.Context, *MsgUpgradeClient) (*MsgUpgradeClientResponse, error) - // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. - SubmitMisbehaviour(context.Context, *MsgSubmitMisbehaviour) (*MsgSubmitMisbehaviourResponse, error) -} - -// UnimplementedMsgServer can be embedded to have forward compatible implementations. -type UnimplementedMsgServer struct { -} - -func (*UnimplementedMsgServer) CreateClient(ctx context.Context, req *MsgCreateClient) (*MsgCreateClientResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateClient not implemented") -} -func (*UnimplementedMsgServer) UpdateClient(ctx context.Context, req *MsgUpdateClient) (*MsgUpdateClientResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateClient not implemented") -} -func (*UnimplementedMsgServer) UpgradeClient(ctx context.Context, req *MsgUpgradeClient) (*MsgUpgradeClientResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpgradeClient not implemented") -} -func (*UnimplementedMsgServer) SubmitMisbehaviour(ctx context.Context, req *MsgSubmitMisbehaviour) (*MsgSubmitMisbehaviourResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SubmitMisbehaviour not implemented") -} - -func RegisterMsgServer(s grpc1.Server, srv MsgServer) { - s.RegisterService(&_Msg_serviceDesc, srv) -} - -func _Msg_CreateClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgCreateClient) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).CreateClient(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/ibc.core.client.v1.Msg/CreateClient", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).CreateClient(ctx, req.(*MsgCreateClient)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_UpdateClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgUpdateClient) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).UpdateClient(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/ibc.core.client.v1.Msg/UpdateClient", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).UpdateClient(ctx, req.(*MsgUpdateClient)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_UpgradeClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgUpgradeClient) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).UpgradeClient(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/ibc.core.client.v1.Msg/UpgradeClient", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).UpgradeClient(ctx, req.(*MsgUpgradeClient)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_SubmitMisbehaviour_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgSubmitMisbehaviour) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).SubmitMisbehaviour(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/ibc.core.client.v1.Msg/SubmitMisbehaviour", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).SubmitMisbehaviour(ctx, req.(*MsgSubmitMisbehaviour)) - } - return interceptor(ctx, in, info, handler) -} - -var _Msg_serviceDesc = grpc.ServiceDesc{ - ServiceName: "ibc.core.client.v1.Msg", - HandlerType: (*MsgServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "CreateClient", - Handler: _Msg_CreateClient_Handler, - }, - { - MethodName: "UpdateClient", - Handler: _Msg_UpdateClient_Handler, - }, - { - MethodName: "UpgradeClient", - Handler: _Msg_UpgradeClient_Handler, - }, - { - MethodName: "SubmitMisbehaviour", - Handler: _Msg_SubmitMisbehaviour_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "ibc/core/client/v1/client.proto", -} - -func (m *MsgCreateClient) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgCreateClient) MarshalTo(dAtA []byte) (int, error) { +func (m *IdentifiedClientState) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgCreateClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *IdentifiedClientState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Signer) > 0 { - i -= len(m.Signer) - copy(dAtA[i:], m.Signer) - i = encodeVarintClient(dAtA, i, uint64(len(m.Signer))) - i-- - dAtA[i] = 0x22 - } - if m.ConsensusState != nil { - { - size, err := m.ConsensusState.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } if m.ClientState != nil { { size, err := m.ClientState.MarshalToSizedBuffer(dAtA[:i]) @@ -986,30 +426,7 @@ func (m *MsgCreateClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *MsgCreateClientResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgCreateClientResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgCreateClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *MsgUpdateClient) Marshal() (dAtA []byte, err error) { +func (m *ConsensusStateWithHeight) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1019,26 +436,19 @@ func (m *MsgUpdateClient) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgUpdateClient) MarshalTo(dAtA []byte) (int, error) { +func (m *ConsensusStateWithHeight) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgUpdateClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ConsensusStateWithHeight) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Signer) > 0 { - i -= len(m.Signer) - copy(dAtA[i:], m.Signer) - i = encodeVarintClient(dAtA, i, uint64(len(m.Signer))) - i-- - dAtA[i] = 0x1a - } - if m.Header != nil { + if m.ConsensusState != nil { { - size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ConsensusState.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1048,40 +458,20 @@ func (m *MsgUpdateClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if len(m.ClientId) > 0 { - i -= len(m.ClientId) - copy(dAtA[i:], m.ClientId) - i = encodeVarintClient(dAtA, i, uint64(len(m.ClientId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgUpdateClientResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + { + size, err := m.Height.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintClient(dAtA, i, uint64(size)) } - return dAtA[:n], nil -} - -func (m *MsgUpdateClientResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgUpdateClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *MsgUpgradeClient) Marshal() (dAtA []byte, err error) { +func (m *ClientConsensusStates) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1091,53 +481,29 @@ func (m *MsgUpgradeClient) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgUpgradeClient) MarshalTo(dAtA []byte) (int, error) { +func (m *ClientConsensusStates) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgUpgradeClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ClientConsensusStates) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Signer) > 0 { - i -= len(m.Signer) - copy(dAtA[i:], m.Signer) - i = encodeVarintClient(dAtA, i, uint64(len(m.Signer))) - i-- - dAtA[i] = 0x2a - } - if len(m.ProofUpgrade) > 0 { - i -= len(m.ProofUpgrade) - copy(dAtA[i:], m.ProofUpgrade) - i = encodeVarintClient(dAtA, i, uint64(len(m.ProofUpgrade))) - i-- - dAtA[i] = 0x22 - } - if m.UpgradeHeight != nil { - { - size, err := m.UpgradeHeight.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.ClientState != nil { - { - size, err := m.ClientState.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.ConsensusStates) > 0 { + for iNdEx := len(m.ConsensusStates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ConsensusStates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintClient(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 } - i-- - dAtA[i] = 0x12 } if len(m.ClientId) > 0 { i -= len(m.ClientId) @@ -1149,30 +515,7 @@ func (m *MsgUpgradeClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *MsgUpgradeClientResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgUpgradeClientResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgUpgradeClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *MsgSubmitMisbehaviour) Marshal() (dAtA []byte, err error) { +func (m *ClientUpdateProposal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1182,26 +525,19 @@ func (m *MsgSubmitMisbehaviour) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgSubmitMisbehaviour) MarshalTo(dAtA []byte) (int, error) { +func (m *ClientUpdateProposal) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgSubmitMisbehaviour) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ClientUpdateProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Signer) > 0 { - i -= len(m.Signer) - copy(dAtA[i:], m.Signer) - i = encodeVarintClient(dAtA, i, uint64(len(m.Signer))) - i-- - dAtA[i] = 0x1a - } - if m.Misbehaviour != nil { + if m.Header != nil { { - size, err := m.Misbehaviour.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1209,19 +545,33 @@ func (m *MsgSubmitMisbehaviour) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintClient(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x22 } if len(m.ClientId) > 0 { i -= len(m.ClientId) copy(dAtA[i:], m.ClientId) i = encodeVarintClient(dAtA, i, uint64(len(m.ClientId))) i-- + dAtA[i] = 0x1a + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintClient(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if len(m.Title) > 0 { + i -= len(m.Title) + copy(dAtA[i:], m.Title) + i = encodeVarintClient(dAtA, i, uint64(len(m.Title))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *MsgSubmitMisbehaviourResponse) Marshal() (dAtA []byte, err error) { +func (m *Height) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1231,1408 +581,183 @@ func (m *MsgSubmitMisbehaviourResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgSubmitMisbehaviourResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *Height) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgSubmitMisbehaviourResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Height) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l + if m.VersionHeight != 0 { + i = encodeVarintClient(dAtA, i, uint64(m.VersionHeight)) + i-- + dAtA[i] = 0x10 + } + if m.VersionNumber != 0 { + i = encodeVarintClient(dAtA, i, uint64(m.VersionNumber)) + i-- + dAtA[i] = 0x8 + } return len(dAtA) - i, nil } -func (m *IdentifiedClientState) Marshal() (dAtA []byte, err error) { +func (m *Params) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *IdentifiedClientState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *IdentifiedClientState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.ClientState != nil { - { - size, err := m.ClientState.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.ClientId) > 0 { - i -= len(m.ClientId) - copy(dAtA[i:], m.ClientId) - i = encodeVarintClient(dAtA, i, uint64(len(m.ClientId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ConsensusStateWithHeight) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ConsensusStateWithHeight) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ConsensusStateWithHeight) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.ConsensusState != nil { - { - size, err := m.ConsensusState.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - { - size, err := m.Height.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ClientConsensusStates) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ClientConsensusStates) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ClientConsensusStates) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ConsensusStates) > 0 { - for iNdEx := len(m.ConsensusStates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ConsensusStates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.ClientId) > 0 { - i -= len(m.ClientId) - copy(dAtA[i:], m.ClientId) - i = encodeVarintClient(dAtA, i, uint64(len(m.ClientId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ClientUpdateProposal) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ClientUpdateProposal) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ClientUpdateProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Header != nil { - { - size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if len(m.ClientId) > 0 { - i -= len(m.ClientId) - copy(dAtA[i:], m.ClientId) - i = encodeVarintClient(dAtA, i, uint64(len(m.ClientId))) - i-- - dAtA[i] = 0x1a - } - if len(m.Description) > 0 { - i -= len(m.Description) - copy(dAtA[i:], m.Description) - i = encodeVarintClient(dAtA, i, uint64(len(m.Description))) - i-- - dAtA[i] = 0x12 - } - if len(m.Title) > 0 { - i -= len(m.Title) - copy(dAtA[i:], m.Title) - i = encodeVarintClient(dAtA, i, uint64(len(m.Title))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Height) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Height) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Height) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.VersionHeight != 0 { - i = encodeVarintClient(dAtA, i, uint64(m.VersionHeight)) - i-- - dAtA[i] = 0x10 - } - if m.VersionNumber != 0 { - i = encodeVarintClient(dAtA, i, uint64(m.VersionNumber)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintClient(dAtA []byte, offset int, v uint64) int { - offset -= sovClient(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *MsgCreateClient) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ClientId) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - if m.ClientState != nil { - l = m.ClientState.Size() - n += 1 + l + sovClient(uint64(l)) - } - if m.ConsensusState != nil { - l = m.ConsensusState.Size() - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.Signer) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - return n -} - -func (m *MsgCreateClientResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgUpdateClient) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ClientId) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - if m.Header != nil { - l = m.Header.Size() - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.Signer) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - return n -} - -func (m *MsgUpdateClientResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgUpgradeClient) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ClientId) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - if m.ClientState != nil { - l = m.ClientState.Size() - n += 1 + l + sovClient(uint64(l)) - } - if m.UpgradeHeight != nil { - l = m.UpgradeHeight.Size() - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.ProofUpgrade) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.Signer) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - return n -} - -func (m *MsgUpgradeClientResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgSubmitMisbehaviour) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ClientId) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - if m.Misbehaviour != nil { - l = m.Misbehaviour.Size() - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.Signer) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - return n -} - -func (m *MsgSubmitMisbehaviourResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *IdentifiedClientState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ClientId) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - if m.ClientState != nil { - l = m.ClientState.Size() - n += 1 + l + sovClient(uint64(l)) - } - return n -} - -func (m *ConsensusStateWithHeight) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Height.Size() - n += 1 + l + sovClient(uint64(l)) - if m.ConsensusState != nil { - l = m.ConsensusState.Size() - n += 1 + l + sovClient(uint64(l)) - } - return n -} - -func (m *ClientConsensusStates) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ClientId) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - if len(m.ConsensusStates) > 0 { - for _, e := range m.ConsensusStates { - l = e.Size() - n += 1 + l + sovClient(uint64(l)) - } - } - return n -} - -func (m *ClientUpdateProposal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Title) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.Description) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.ClientId) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - if m.Header != nil { - l = m.Header.Size() - n += 1 + l + sovClient(uint64(l)) - } - return n -} - -func (m *Height) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.VersionNumber != 0 { - n += 1 + sovClient(uint64(m.VersionNumber)) - } - if m.VersionHeight != 0 { - n += 1 + sovClient(uint64(m.VersionHeight)) - } - return n -} - -func sovClient(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozClient(x uint64) (n int) { - return sovClient(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *MsgCreateClient) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgCreateClient: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgCreateClient: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClientId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientState", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ClientState == nil { - m.ClientState = &types.Any{} - } - if err := m.ClientState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConsensusState", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ConsensusState == nil { - m.ConsensusState = &types.Any{} - } - if err := m.ConsensusState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgCreateClientResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgCreateClientResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgCreateClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpdateClient) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgUpdateClient: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpdateClient: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClientId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Header == nil { - m.Header = &types.Any{} - } - if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpdateClientResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgUpdateClientResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpdateClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpgradeClient) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgUpgradeClient: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpgradeClient: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClientId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientState", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ClientState == nil { - m.ClientState = &types.Any{} - } - if err := m.ClientState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpgradeHeight", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UpgradeHeight == nil { - m.UpgradeHeight = &Height{} - } - if err := m.UpgradeHeight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProofUpgrade", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ProofUpgrade = append(m.ProofUpgrade[:0], dAtA[iNdEx:postIndex]...) - if m.ProofUpgrade == nil { - m.ProofUpgrade = []byte{} - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpgradeClientResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgUpgradeClientResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpgradeClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgSubmitMisbehaviour) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgSubmitMisbehaviour: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgSubmitMisbehaviour: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClientId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Misbehaviour", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Misbehaviour == nil { - m.Misbehaviour = &types.Any{} - } - if err := m.Misbehaviour.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy + return nil, err + } + return dAtA[:n], nil +} + +func (m *Params) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.AllowedClients) > 0 { + for iNdEx := len(m.AllowedClients) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AllowedClients[iNdEx]) + copy(dAtA[i:], m.AllowedClients[iNdEx]) + i = encodeVarintClient(dAtA, i, uint64(len(m.AllowedClients[iNdEx]))) + i-- + dAtA[i] = 0xa } } + return len(dAtA) - i, nil +} - if iNdEx > l { - return io.ErrUnexpectedEOF +func encodeVarintClient(dAtA []byte, offset int, v uint64) int { + offset -= sovClient(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ } - return nil + dAtA[offset] = uint8(v) + return base } -func (m *MsgSubmitMisbehaviourResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgSubmitMisbehaviourResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgSubmitMisbehaviourResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy +func (m *IdentifiedClientState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovClient(uint64(l)) + } + if m.ClientState != nil { + l = m.ClientState.Size() + n += 1 + l + sovClient(uint64(l)) + } + return n +} + +func (m *ConsensusStateWithHeight) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Height.Size() + n += 1 + l + sovClient(uint64(l)) + if m.ConsensusState != nil { + l = m.ConsensusState.Size() + n += 1 + l + sovClient(uint64(l)) + } + return n +} + +func (m *ClientConsensusStates) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovClient(uint64(l)) + } + if len(m.ConsensusStates) > 0 { + for _, e := range m.ConsensusStates { + l = e.Size() + n += 1 + l + sovClient(uint64(l)) } } + return n +} - if iNdEx > l { - return io.ErrUnexpectedEOF +func (m *ClientUpdateProposal) Size() (n int) { + if m == nil { + return 0 } - return nil + var l int + _ = l + l = len(m.Title) + if l > 0 { + n += 1 + l + sovClient(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovClient(uint64(l)) + } + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovClient(uint64(l)) + } + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovClient(uint64(l)) + } + return n +} + +func (m *Height) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.VersionNumber != 0 { + n += 1 + sovClient(uint64(m.VersionNumber)) + } + if m.VersionHeight != 0 { + n += 1 + sovClient(uint64(m.VersionHeight)) + } + return n +} + +func (m *Params) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.AllowedClients) > 0 { + for _, s := range m.AllowedClients { + l = len(s) + n += 1 + l + sovClient(uint64(l)) + } + } + return n +} + +func sovClient(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozClient(x uint64) (n int) { + return sovClient(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } func (m *IdentifiedClientState) Unmarshal(dAtA []byte) error { l := len(dAtA) @@ -3272,6 +1397,91 @@ func (m *Height) Unmarshal(dAtA []byte) error { } return nil } +func (m *Params) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowClient + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Params: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedClients", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowClient + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthClient + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthClient + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedClients = append(m.AllowedClients, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipClient(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthClient + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthClient + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipClient(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/ibc/core/02-client/types/client_test.go b/x/ibc/core/02-client/types/client_test.go index 3028980b89d..409ab53050a 100644 --- a/x/ibc/core/02-client/types/client_test.go +++ b/x/ibc/core/02-client/types/client_test.go @@ -2,6 +2,7 @@ package types_test import ( "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -22,7 +23,7 @@ func (suite *TypesTestSuite) TestMarshalConsensusStateWithHeight() { }, { "tendermint client", func() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) consensusState, ok := suite.chainA.GetConsensusState(clientA, clientState.GetLatestHeight()) suite.Require().True(ok) diff --git a/x/ibc/core/02-client/types/genesis.go b/x/ibc/core/02-client/types/genesis.go index c9be22f8212..fc3ba12d195 100644 --- a/x/ibc/core/02-client/types/genesis.go +++ b/x/ibc/core/02-client/types/genesis.go @@ -66,11 +66,13 @@ func (ccs ClientConsensusStates) UnpackInterfaces(unpacker codectypes.AnyUnpacke // NewGenesisState creates a GenesisState instance. func NewGenesisState( - clients []IdentifiedClientState, clientsConsensus ClientsConsensusStates, createLocalhost bool, + clients []IdentifiedClientState, clientsConsensus ClientsConsensusStates, + params Params, createLocalhost bool, ) GenesisState { return GenesisState{ Clients: clients, ClientsConsensus: clientsConsensus, + Params: params, CreateLocalhost: createLocalhost, } } @@ -80,6 +82,7 @@ func DefaultGenesisState() GenesisState { return GenesisState{ Clients: []IdentifiedClientState{}, ClientsConsensus: ClientsConsensusStates{}, + Params: DefaultParams(), CreateLocalhost: false, } } @@ -133,5 +136,13 @@ func (gs GenesisState) Validate() error { } } + if err := gs.Params.Validate(); err != nil { + return err + } + + if gs.CreateLocalhost && !gs.Params.IsAllowedClient(exported.Localhost) { + return fmt.Errorf("localhost client is not registered on the allowlist") + } + return nil } diff --git a/x/ibc/core/02-client/types/genesis.pb.go b/x/ibc/core/02-client/types/genesis.pb.go index 8d16b4519ab..4c72edfe5e7 100644 --- a/x/ibc/core/02-client/types/genesis.pb.go +++ b/x/ibc/core/02-client/types/genesis.pb.go @@ -26,11 +26,12 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // GenesisState defines the ibc client submodule's genesis state. type GenesisState struct { // client states with their corresponding identifiers - Clients []IdentifiedClientState `protobuf:"bytes,1,rep,name=clients,proto3" json:"clients"` + Clients IdentifiedClientStates `protobuf:"bytes,1,rep,name=clients,proto3,castrepeated=IdentifiedClientStates" json:"clients"` // consensus states from each client ClientsConsensus ClientsConsensusStates `protobuf:"bytes,2,rep,name=clients_consensus,json=clientsConsensus,proto3,castrepeated=ClientsConsensusStates" json:"clients_consensus" yaml:"clients_consensus"` + Params Params `protobuf:"bytes,3,opt,name=params,proto3" json:"params"` // create localhost on initialization - CreateLocalhost bool `protobuf:"varint,3,opt,name=create_localhost,json=createLocalhost,proto3" json:"create_localhost,omitempty" yaml:"create_localhost"` + CreateLocalhost bool `protobuf:"varint,4,opt,name=create_localhost,json=createLocalhost,proto3" json:"create_localhost,omitempty" yaml:"create_localhost"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -66,7 +67,7 @@ func (m *GenesisState) XXX_DiscardUnknown() { var xxx_messageInfo_GenesisState proto.InternalMessageInfo -func (m *GenesisState) GetClients() []IdentifiedClientState { +func (m *GenesisState) GetClients() IdentifiedClientStates { if m != nil { return m.Clients } @@ -80,6 +81,13 @@ func (m *GenesisState) GetClientsConsensus() ClientsConsensusStates { return nil } +func (m *GenesisState) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + func (m *GenesisState) GetCreateLocalhost() bool { if m != nil { return m.CreateLocalhost @@ -94,28 +102,30 @@ func init() { func init() { proto.RegisterFile("ibc/core/client/v1/genesis.proto", fileDescriptor_bcd0c0f1f2e6a91a) } var fileDescriptor_bcd0c0f1f2e6a91a = []byte{ - // 328 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xc8, 0x4c, 0x4a, 0xd6, - 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xc9, 0x4c, 0xcd, 0x2b, 0xd1, 0x2f, 0x33, 0xd4, 0x4f, - 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0xca, 0x4c, - 0x4a, 0xd6, 0x03, 0xa9, 0xd0, 0x83, 0xa8, 0xd0, 0x2b, 0x33, 0x94, 0x92, 0xc7, 0xa2, 0x0b, 0x2a, - 0x0b, 0xd6, 0x24, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x66, 0xea, 0x83, 0x58, 0x10, 0x51, 0xa5, - 0x6d, 0x4c, 0x5c, 0x3c, 0xee, 0x10, 0xc3, 0x83, 0x4b, 0x12, 0x4b, 0x52, 0x85, 0x3c, 0xb9, 0xd8, - 0x21, 0xda, 0x8a, 0x25, 0x18, 0x15, 0x98, 0x35, 0xb8, 0x8d, 0x34, 0xf5, 0x30, 0x6d, 0xd3, 0xf3, - 0x4c, 0x49, 0xcd, 0x2b, 0xc9, 0x4c, 0xcb, 0x4c, 0x4d, 0x71, 0x06, 0x8b, 0x81, 0xf5, 0x3a, 0xb1, - 0x9c, 0xb8, 0x27, 0xcf, 0x10, 0x04, 0xd3, 0x2f, 0x34, 0x89, 0x91, 0x4b, 0x10, 0xca, 0x8e, 0x4f, - 0xce, 0xcf, 0x2b, 0x4e, 0xcd, 0x2b, 0x2e, 0x2d, 0x96, 0x60, 0xc2, 0x6d, 0x2a, 0xc4, 0x2c, 0x67, - 0x98, 0x52, 0xb0, 0xa1, 0xc5, 0x4e, 0x56, 0x20, 0x53, 0x3f, 0xdd, 0x93, 0x97, 0xa8, 0x4c, 0xcc, - 0xcd, 0xb1, 0x52, 0xc2, 0x30, 0x51, 0x69, 0xd5, 0x7d, 0x79, 0x31, 0x88, 0xd6, 0x62, 0x34, 0xbd, - 0x41, 0x02, 0xc9, 0x68, 0xe2, 0x42, 0x6e, 0x5c, 0x02, 0xc9, 0x45, 0xa9, 0x89, 0x25, 0xa9, 0xf1, - 0x39, 0xf9, 0xc9, 0x89, 0x39, 0x19, 0xf9, 0xc5, 0x25, 0x12, 0xcc, 0x0a, 0x8c, 0x1a, 0x1c, 0x4e, - 0xd2, 0x9f, 0xee, 0xc9, 0x8b, 0x43, 0xed, 0x40, 0x53, 0xa1, 0x14, 0xc4, 0x0f, 0x11, 0xf2, 0x81, - 0x89, 0x38, 0x05, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, - 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x79, 0x7a, - 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x72, 0x7e, 0x71, 0x6e, 0x7e, 0x31, - 0x94, 0xd2, 0x2d, 0x4e, 0xc9, 0xd6, 0xaf, 0xd0, 0x87, 0x47, 0x94, 0x81, 0x91, 0x2e, 0x34, 0xae, - 0x4a, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x51, 0x62, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, - 0x5b, 0xe3, 0x61, 0x24, 0x01, 0x02, 0x00, 0x00, + // 362 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0xc1, 0x4e, 0xea, 0x40, + 0x14, 0x86, 0xdb, 0x0b, 0xe1, 0xde, 0x94, 0x9b, 0x88, 0x8d, 0xd1, 0x06, 0x93, 0xb6, 0xe9, 0x0a, + 0x17, 0xcc, 0x08, 0x2e, 0x34, 0x2c, 0x4b, 0xa2, 0x31, 0x71, 0xa1, 0x75, 0xe7, 0x86, 0xb4, 0xc3, + 0x58, 0x26, 0xb6, 0x1d, 0xd2, 0x33, 0x10, 0x79, 0x05, 0x57, 0xc6, 0xc7, 0xf0, 0x49, 0x58, 0xb2, + 0x74, 0x85, 0x06, 0xde, 0x80, 0x27, 0x30, 0xed, 0x14, 0x17, 0x80, 0xab, 0x39, 0xf9, 0xe7, 0xff, + 0xfe, 0xff, 0x24, 0x47, 0xb3, 0x59, 0x40, 0x30, 0xe1, 0x29, 0xc5, 0x24, 0x62, 0x34, 0x11, 0x78, + 0xdc, 0xc2, 0x21, 0x4d, 0x28, 0x30, 0x40, 0xc3, 0x94, 0x0b, 0xae, 0xeb, 0x2c, 0x20, 0x28, 0x73, + 0x20, 0xe9, 0x40, 0xe3, 0x56, 0xdd, 0xda, 0x41, 0x15, 0xbf, 0x39, 0x54, 0x3f, 0x08, 0x79, 0xc8, + 0xf3, 0x11, 0x67, 0x93, 0x54, 0x9d, 0x97, 0x92, 0xf6, 0xff, 0x4a, 0x86, 0xdf, 0x0b, 0x5f, 0x50, + 0x9d, 0x68, 0x7f, 0x25, 0x06, 0x86, 0x6a, 0x97, 0x1a, 0xd5, 0xf6, 0x09, 0xda, 0x6e, 0x43, 0xd7, + 0x7d, 0x9a, 0x08, 0xf6, 0xc8, 0x68, 0xbf, 0x9b, 0x6b, 0x39, 0xeb, 0x9a, 0xd3, 0xb9, 0xa5, 0xbc, + 0x7f, 0x5a, 0x87, 0x3b, 0xbf, 0xc1, 0x5b, 0x27, 0xeb, 0x6f, 0xaa, 0xb6, 0x5f, 0xcc, 0x3d, 0xc2, + 0x13, 0xa0, 0x09, 0x8c, 0xc0, 0xf8, 0xf3, 0x7b, 0x9f, 0x8c, 0xe9, 0xae, 0xad, 0x32, 0xcf, 0xed, + 0x64, 0x7d, 0xab, 0xb9, 0x65, 0x4c, 0xfc, 0x38, 0xea, 0x38, 0x5b, 0x89, 0x4e, 0xb6, 0x8b, 0x44, + 0x61, 0x83, 0xf5, 0x6a, 0x64, 0x43, 0xd7, 0x2f, 0xb4, 0xca, 0xd0, 0x4f, 0xfd, 0x18, 0x8c, 0x92, + 0xad, 0x36, 0xaa, 0xed, 0xfa, 0xae, 0x45, 0x6e, 0x73, 0x87, 0x5b, 0xce, 0x9a, 0xbd, 0xc2, 0xaf, + 0x5f, 0x6a, 0x35, 0x92, 0x52, 0x5f, 0xd0, 0x5e, 0xc4, 0x89, 0x1f, 0x0d, 0x38, 0x08, 0xa3, 0x6c, + 0xab, 0x8d, 0x7f, 0xee, 0xf1, 0x6a, 0x6e, 0x1d, 0x15, 0xdb, 0x6d, 0x38, 0x1c, 0x6f, 0x4f, 0x4a, + 0x37, 0x6b, 0xc5, 0xbd, 0x9b, 0x2e, 0x4c, 0x75, 0xb6, 0x30, 0xd5, 0xaf, 0x85, 0xa9, 0xbe, 0x2e, + 0x4d, 0x65, 0xb6, 0x34, 0x95, 0x8f, 0xa5, 0xa9, 0x3c, 0x9c, 0x87, 0x4c, 0x0c, 0x46, 0x01, 0x22, + 0x3c, 0xc6, 0x84, 0x43, 0xcc, 0xa1, 0x78, 0x9a, 0xd0, 0x7f, 0xc2, 0xcf, 0xf8, 0xe7, 0xf8, 0xa7, + 0xed, 0x66, 0x71, 0x7f, 0x31, 0x19, 0x52, 0x08, 0x2a, 0xf9, 0x99, 0xcf, 0xbe, 0x03, 0x00, 0x00, + 0xff, 0xff, 0x8d, 0xa4, 0x74, 0xd6, 0x55, 0x02, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -146,8 +156,18 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0 } i-- - dAtA[i] = 0x18 + dAtA[i] = 0x20 + } + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x1a if len(m.ClientsConsensus) > 0 { for iNdEx := len(m.ClientsConsensus) - 1; iNdEx >= 0; iNdEx-- { { @@ -208,6 +228,8 @@ func (m *GenesisState) Size() (n int) { n += 1 + l + sovGenesis(uint64(l)) } } + l = m.Params.Size() + n += 1 + l + sovGenesis(uint64(l)) if m.CreateLocalhost { n += 2 } @@ -318,6 +340,39 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field CreateLocalhost", wireType) } diff --git a/x/ibc/core/02-client/types/genesis_test.go b/x/ibc/core/02-client/types/genesis_test.go index 41d88edae89..296bceb1299 100644 --- a/x/ibc/core/02-client/types/genesis_test.go +++ b/x/ibc/core/02-client/types/genesis_test.go @@ -28,7 +28,7 @@ var clientHeight = types.NewHeight(0, 10) func (suite *TypesTestSuite) TestMarshalGenesisState() { cdc := suite.chainA.App.AppCodec() clientA, _, _, _, _, _ := suite.coordinator.Setup(suite.chainA, suite.chainB, channeltypes.ORDERED) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) genesis := client.ExportGenesis(suite.chainA.GetContext(), suite.chainA.App.IBCKeeper.ClientKeeper) @@ -65,7 +65,7 @@ func (suite *TypesTestSuite) TestValidateGenesis() { expPass: true, }, { - name: "valid genesis", + name: "valid custom genesis", genState: types.NewGenesisState( []types.IdentifiedClientState{ types.NewIdentifiedClientState( @@ -88,7 +88,8 @@ func (suite *TypesTestSuite) TestValidateGenesis() { }, ), }, - true, + types.NewParams(exported.Tendermint), + false, ), expPass: true, }, @@ -116,7 +117,8 @@ func (suite *TypesTestSuite) TestValidateGenesis() { }, ), }, - true, + types.NewParams(exported.Tendermint), + false, ), expPass: false, }, @@ -130,12 +132,13 @@ func (suite *TypesTestSuite) TestValidateGenesis() { types.NewIdentifiedClientState(exported.Localhost, localhosttypes.NewClientState("chaindID", types.ZeroHeight())), }, nil, - true, + types.NewParams(exported.Tendermint), + false, ), expPass: false, }, { - name: "invalid consensus state", + name: "invalid consensus state client id", genState: types.NewGenesisState( []types.IdentifiedClientState{ types.NewIdentifiedClientState( @@ -158,12 +161,13 @@ func (suite *TypesTestSuite) TestValidateGenesis() { }, ), }, - true, + types.NewParams(exported.Tendermint), + false, ), expPass: false, }, { - name: "invalid consensus state", + name: "invalid consensus state height", genState: types.NewGenesisState( []types.IdentifiedClientState{ types.NewIdentifiedClientState( @@ -186,6 +190,123 @@ func (suite *TypesTestSuite) TestValidateGenesis() { }, ), }, + types.NewParams(exported.Tendermint), + false, + ), + expPass: false, + }, + { + name: "invalid consensus state", + genState: types.NewGenesisState( + []types.IdentifiedClientState{ + types.NewIdentifiedClientState( + clientID, ibctmtypes.NewClientState(chainID, ibctmtypes.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod, ibctesting.MaxClockDrift, clientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), + ), + types.NewIdentifiedClientState( + exported.Localhost, localhosttypes.NewClientState("chaindID", clientHeight), + ), + }, + []types.ClientConsensusStates{ + types.NewClientConsensusStates( + clientID, + []types.ConsensusStateWithHeight{ + types.NewConsensusStateWithHeight( + types.NewHeight(0, 1), + ibctmtypes.NewConsensusState( + time.Time{}, commitmenttypes.NewMerkleRoot(header.Header.GetAppHash()), header.Header.NextValidatorsHash, + ), + ), + }, + ), + }, + types.NewParams(exported.Tendermint), + false, + ), + expPass: false, + }, + { + name: "invalid params", + genState: types.NewGenesisState( + []types.IdentifiedClientState{ + types.NewIdentifiedClientState( + clientID, ibctmtypes.NewClientState(chainID, ibctesting.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod, ibctesting.MaxClockDrift, clientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), + ), + types.NewIdentifiedClientState( + exported.Localhost, localhosttypes.NewClientState("chainID", clientHeight), + ), + }, + []types.ClientConsensusStates{ + types.NewClientConsensusStates( + clientID, + []types.ConsensusStateWithHeight{ + types.NewConsensusStateWithHeight( + header.GetHeight().(types.Height), + ibctmtypes.NewConsensusState( + header.GetTime(), commitmenttypes.NewMerkleRoot(header.Header.GetAppHash()), header.Header.NextValidatorsHash, + ), + ), + }, + ), + }, + types.NewParams(" "), + false, + ), + expPass: false, + }, + { + name: "invalid param", + genState: types.NewGenesisState( + []types.IdentifiedClientState{ + types.NewIdentifiedClientState( + clientID, ibctmtypes.NewClientState(chainID, ibctesting.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod, ibctesting.MaxClockDrift, clientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), + ), + types.NewIdentifiedClientState( + exported.Localhost, localhosttypes.NewClientState("chainID", clientHeight), + ), + }, + []types.ClientConsensusStates{ + types.NewClientConsensusStates( + clientID, + []types.ConsensusStateWithHeight{ + types.NewConsensusStateWithHeight( + header.GetHeight().(types.Height), + ibctmtypes.NewConsensusState( + header.GetTime(), commitmenttypes.NewMerkleRoot(header.Header.GetAppHash()), header.Header.NextValidatorsHash, + ), + ), + }, + ), + }, + types.NewParams(" "), + true, + ), + expPass: false, + }, + { + name: "localhost client not registered on allowlist", + genState: types.NewGenesisState( + []types.IdentifiedClientState{ + types.NewIdentifiedClientState( + clientID, ibctmtypes.NewClientState(chainID, ibctesting.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod, ibctesting.MaxClockDrift, clientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), + ), + types.NewIdentifiedClientState( + exported.Localhost, localhosttypes.NewClientState("chainID", clientHeight), + ), + }, + []types.ClientConsensusStates{ + types.NewClientConsensusStates( + clientID, + []types.ConsensusStateWithHeight{ + types.NewConsensusStateWithHeight( + header.GetHeight().(types.Height), + ibctmtypes.NewConsensusState( + header.GetTime(), commitmenttypes.NewMerkleRoot(header.Header.GetAppHash()), header.Header.NextValidatorsHash, + ), + ), + }, + ), + }, + types.NewParams(exported.Tendermint), true, ), expPass: false, diff --git a/x/ibc/core/02-client/types/params.go b/x/ibc/core/02-client/types/params.go new file mode 100644 index 00000000000..6477e3f6f4f --- /dev/null +++ b/x/ibc/core/02-client/types/params.go @@ -0,0 +1,71 @@ +package types + +import ( + "fmt" + "strings" + + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" +) + +var ( + // DefaultAllowedClients are "06-solomachine" and "07-tendermint" + DefaultAllowedClients = []string{exported.Solomachine, exported.Tendermint} + + // KeyAllowedClients is store's key for AllowedClients Params + KeyAllowedClients = []byte("AllowedClients") +) + +// ParamKeyTable type declaration for parameters +func ParamKeyTable() paramtypes.KeyTable { + return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) +} + +// NewParams creates a new parameter configuration for the ibc transfer module +func NewParams(allowedClients ...string) Params { + return Params{ + AllowedClients: allowedClients, + } +} + +// DefaultParams is the default parameter configuration for the ibc-transfer module +func DefaultParams() Params { + return NewParams(DefaultAllowedClients...) +} + +// Validate all ibc-transfer module parameters +func (p Params) Validate() error { + return validateClients(p.AllowedClients) +} + +// ParamSetPairs implements params.ParamSet +func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { + return paramtypes.ParamSetPairs{ + paramtypes.NewParamSetPair(KeyAllowedClients, p.AllowedClients, validateClients), + } +} + +// IsAllowedClient checks if the given client type is registered on the allowlist. +func (p Params) IsAllowedClient(clientType string) bool { + for _, allowedClient := range p.AllowedClients { + if allowedClient == clientType { + return true + } + } + return false +} + +func validateClients(i interface{}) error { + clients, ok := i.([]string) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + for i, clientType := range clients { + if strings.TrimSpace(clientType) == "" { + return fmt.Errorf("client type %d cannot be blank", i) + } + } + + return nil +} diff --git a/x/ibc/core/02-client/types/params_test.go b/x/ibc/core/02-client/types/params_test.go new file mode 100644 index 00000000000..9484e48b4ad --- /dev/null +++ b/x/ibc/core/02-client/types/params_test.go @@ -0,0 +1,29 @@ +package types + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" + "github.com/stretchr/testify/require" +) + +func TestValidateParams(t *testing.T) { + testCases := []struct { + name string + params Params + expPass bool + }{ + {"default params", DefaultParams(), true}, + {"custom params", NewParams(exported.Tendermint), true}, + {"blank client", NewParams(" "), false}, + } + + for _, tc := range testCases { + err := tc.params.Validate() + if tc.expPass { + require.NoError(t, err, tc.name) + } else { + require.Error(t, err, tc.name) + } + } +} diff --git a/x/ibc/core/02-client/types/query.pb.go b/x/ibc/core/02-client/types/query.pb.go index 3e250c9ead5..755d401802a 100644 --- a/x/ibc/core/02-client/types/query.pb.go +++ b/x/ibc/core/02-client/types/query.pb.go @@ -195,7 +195,7 @@ func (m *QueryClientStatesRequest) GetPagination() *query.PageRequest { // method. type QueryClientStatesResponse struct { // list of stored ClientStates of the chain. - ClientStates []*IdentifiedClientState `protobuf:"bytes,1,rep,name=client_states,json=clientStates,proto3" json:"client_states,omitempty"` + ClientStates IdentifiedClientStates `protobuf:"bytes,1,rep,name=client_states,json=clientStates,proto3,castrepeated=IdentifiedClientStates" json:"client_states"` // pagination response Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` } @@ -233,7 +233,7 @@ func (m *QueryClientStatesResponse) XXX_DiscardUnknown() { var xxx_messageInfo_QueryClientStatesResponse proto.InternalMessageInfo -func (m *QueryClientStatesResponse) GetClientStates() []*IdentifiedClientState { +func (m *QueryClientStatesResponse) GetClientStates() IdentifiedClientStates { if m != nil { return m.ClientStates } @@ -500,6 +500,89 @@ func (m *QueryConsensusStatesResponse) GetPagination() *query.PageResponse { return nil } +// QueryClientParamsRequest is the request type for the Query/ClientParams RPC method. +type QueryClientParamsRequest struct { +} + +func (m *QueryClientParamsRequest) Reset() { *m = QueryClientParamsRequest{} } +func (m *QueryClientParamsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryClientParamsRequest) ProtoMessage() {} +func (*QueryClientParamsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_dc42cdfd1d52d76e, []int{8} +} +func (m *QueryClientParamsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryClientParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryClientParamsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryClientParamsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryClientParamsRequest.Merge(m, src) +} +func (m *QueryClientParamsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryClientParamsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryClientParamsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryClientParamsRequest proto.InternalMessageInfo + +// QueryClientParamsResponse is the response type for the Query/ClientParams RPC method. +type QueryClientParamsResponse struct { + // params defines the parameters of the module. + Params *Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"` +} + +func (m *QueryClientParamsResponse) Reset() { *m = QueryClientParamsResponse{} } +func (m *QueryClientParamsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryClientParamsResponse) ProtoMessage() {} +func (*QueryClientParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dc42cdfd1d52d76e, []int{9} +} +func (m *QueryClientParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryClientParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryClientParamsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryClientParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryClientParamsResponse.Merge(m, src) +} +func (m *QueryClientParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryClientParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryClientParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryClientParamsResponse proto.InternalMessageInfo + +func (m *QueryClientParamsResponse) GetParams() *Params { + if m != nil { + return m.Params + } + return nil +} + func init() { proto.RegisterType((*QueryClientStateRequest)(nil), "ibc.core.client.v1.QueryClientStateRequest") proto.RegisterType((*QueryClientStateResponse)(nil), "ibc.core.client.v1.QueryClientStateResponse") @@ -509,59 +592,66 @@ func init() { proto.RegisterType((*QueryConsensusStateResponse)(nil), "ibc.core.client.v1.QueryConsensusStateResponse") proto.RegisterType((*QueryConsensusStatesRequest)(nil), "ibc.core.client.v1.QueryConsensusStatesRequest") proto.RegisterType((*QueryConsensusStatesResponse)(nil), "ibc.core.client.v1.QueryConsensusStatesResponse") + proto.RegisterType((*QueryClientParamsRequest)(nil), "ibc.core.client.v1.QueryClientParamsRequest") + proto.RegisterType((*QueryClientParamsResponse)(nil), "ibc.core.client.v1.QueryClientParamsResponse") } func init() { proto.RegisterFile("ibc/core/client/v1/query.proto", fileDescriptor_dc42cdfd1d52d76e) } var fileDescriptor_dc42cdfd1d52d76e = []byte{ - // 746 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x4d, 0x6b, 0x13, 0x4f, - 0x18, 0xcf, 0xf4, 0xe5, 0x4f, 0x3b, 0x49, 0xdb, 0x3f, 0x43, 0xc1, 0x74, 0x5b, 0xb6, 0x21, 0x62, - 0x8d, 0xda, 0xce, 0x34, 0xf1, 0xa5, 0x20, 0xf4, 0x60, 0x0b, 0xd5, 0x5e, 0x8a, 0x5d, 0x0f, 0x82, - 0x20, 0x65, 0x77, 0x33, 0xd9, 0x2c, 0xb6, 0x3b, 0x69, 0x66, 0x12, 0x2c, 0xa5, 0x97, 0x7e, 0x02, - 0xc1, 0xa3, 0x57, 0x8f, 0xe2, 0x45, 0xc1, 0x6f, 0x20, 0x3d, 0x16, 0xbc, 0x78, 0x12, 0x6d, 0xc5, - 0xcf, 0x21, 0x3b, 0x33, 0xdb, 0xec, 0x36, 0x5b, 0x5c, 0x8a, 0x9e, 0xb2, 0xfb, 0xbc, 0xfe, 0x9e, - 0xdf, 0xef, 0xd9, 0x87, 0x40, 0xd3, 0x77, 0x5c, 0xe2, 0xb2, 0x36, 0x25, 0xee, 0xb6, 0x4f, 0x03, - 0x41, 0xba, 0x55, 0xb2, 0xdb, 0xa1, 0xed, 0x3d, 0xdc, 0x6a, 0x33, 0xc1, 0x10, 0xf2, 0x1d, 0x17, - 0x87, 0x7e, 0xac, 0xfc, 0xb8, 0x5b, 0x35, 0x6e, 0xba, 0x8c, 0xef, 0x30, 0x4e, 0x1c, 0x9b, 0x53, - 0x15, 0x4c, 0xba, 0x55, 0x87, 0x0a, 0xbb, 0x4a, 0x5a, 0xb6, 0xe7, 0x07, 0xb6, 0xf0, 0x59, 0xa0, - 0xf2, 0x8d, 0xd9, 0x94, 0xfa, 0xba, 0x92, 0x0a, 0x98, 0xf2, 0x18, 0xf3, 0xb6, 0x29, 0x91, 0x6f, - 0x4e, 0xa7, 0x41, 0xec, 0x40, 0xf7, 0x36, 0x66, 0xb4, 0xcb, 0x6e, 0xf9, 0xc4, 0x0e, 0x02, 0x26, - 0x64, 0x61, 0xae, 0xbd, 0x93, 0x1e, 0xf3, 0x98, 0x7c, 0x24, 0xe1, 0x93, 0xb2, 0x96, 0xef, 0xc1, - 0x2b, 0x9b, 0x21, 0xa2, 0x55, 0xd9, 0xe3, 0x89, 0xb0, 0x05, 0xb5, 0xe8, 0x6e, 0x87, 0x72, 0x81, - 0xa6, 0xe1, 0xa8, 0xea, 0xbc, 0xe5, 0xd7, 0x8b, 0xa0, 0x04, 0x2a, 0xa3, 0xd6, 0x88, 0x32, 0xac, - 0xd7, 0xcb, 0xef, 0x01, 0x2c, 0xf6, 0x27, 0xf2, 0x16, 0x0b, 0x38, 0x45, 0x4b, 0xb0, 0xa0, 0x33, - 0x79, 0x68, 0x97, 0xc9, 0xf9, 0xda, 0x24, 0x56, 0xf8, 0x70, 0x04, 0x1d, 0x3f, 0x08, 0xf6, 0xac, - 0xbc, 0xdb, 0x2b, 0x80, 0x26, 0xe1, 0x70, 0xab, 0xcd, 0x58, 0xa3, 0x38, 0x50, 0x02, 0x95, 0x82, - 0xa5, 0x5e, 0xd0, 0x2a, 0x2c, 0xc8, 0x87, 0xad, 0x26, 0xf5, 0xbd, 0xa6, 0x28, 0x0e, 0xca, 0x72, - 0x06, 0xee, 0xa7, 0x1a, 0x3f, 0x92, 0x11, 0x2b, 0x43, 0x47, 0xdf, 0x66, 0x73, 0x56, 0x5e, 0x66, - 0x29, 0x53, 0xd9, 0xe9, 0xc7, 0xcb, 0xa3, 0x49, 0xd7, 0x20, 0xec, 0x09, 0xa1, 0xd1, 0xce, 0x61, - 0xa5, 0x1a, 0x0e, 0x55, 0xc3, 0x4a, 0x62, 0xad, 0x1a, 0x7e, 0x6c, 0x7b, 0x11, 0x4b, 0x56, 0x2c, - 0xb3, 0xfc, 0x11, 0xc0, 0xa9, 0x94, 0x26, 0x9a, 0x95, 0x0d, 0x38, 0x16, 0x67, 0x85, 0x17, 0x41, - 0x69, 0xb0, 0x92, 0xaf, 0xdd, 0x48, 0x9b, 0x63, 0xbd, 0x4e, 0x03, 0xe1, 0x37, 0x7c, 0x5a, 0x8f, - 0xf3, 0x5b, 0x88, 0x71, 0xc5, 0xd1, 0xc3, 0x04, 0xea, 0x01, 0x89, 0xfa, 0xfa, 0x1f, 0x51, 0x2b, - 0x30, 0x09, 0xd8, 0xef, 0x00, 0x34, 0x14, 0xec, 0xd0, 0x15, 0xf0, 0x0e, 0xcf, 0xbc, 0x07, 0xe8, - 0x1a, 0x1c, 0xef, 0xd2, 0x36, 0xf7, 0x59, 0xb0, 0x15, 0x74, 0x76, 0x1c, 0xda, 0x96, 0x40, 0x86, - 0xac, 0x31, 0x6d, 0xdd, 0x90, 0xc6, 0x78, 0x58, 0x4c, 0xc4, 0x5e, 0x98, 0x12, 0x09, 0x5d, 0x85, - 0x63, 0xdb, 0xe1, 0x6c, 0x22, 0x8a, 0x1a, 0x2a, 0x81, 0xca, 0x88, 0x55, 0x50, 0x46, 0xad, 0xe4, - 0x27, 0x00, 0xa7, 0x53, 0xe1, 0x6a, 0x9e, 0x97, 0xe1, 0x84, 0x1b, 0x79, 0x32, 0x2c, 0xe0, 0xb8, - 0x9b, 0x28, 0xf3, 0x2f, 0x77, 0xf0, 0x30, 0x1d, 0x39, 0xcf, 0xc4, 0xf4, 0x5a, 0x8a, 0xdc, 0x97, - 0x59, 0xd2, 0xcf, 0x00, 0xce, 0xa4, 0x83, 0xd0, 0xfc, 0x3d, 0x87, 0xff, 0x9f, 0xe3, 0x2f, 0x5a, - 0xd5, 0xf9, 0xb4, 0x71, 0x93, 0x65, 0x9e, 0xfa, 0xa2, 0x99, 0x20, 0x60, 0x22, 0x49, 0xef, 0xdf, - 0x5b, 0xdb, 0xda, 0xaf, 0x61, 0x38, 0x2c, 0x07, 0x41, 0x6f, 0x01, 0xcc, 0xc7, 0xbe, 0x13, 0x74, - 0x2b, 0x0d, 0xe7, 0x05, 0x67, 0xce, 0x98, 0xcf, 0x16, 0xac, 0x00, 0x94, 0xef, 0x1f, 0x7e, 0xf9, - 0xf9, 0x7a, 0xe0, 0x0e, 0xaa, 0x91, 0xfe, 0x43, 0xad, 0x4e, 0x7a, 0xe2, 0x1b, 0x27, 0xfb, 0x67, - 0x82, 0x1e, 0xa0, 0x37, 0x00, 0x16, 0xe2, 0x97, 0x01, 0x65, 0x6a, 0x1d, 0x6d, 0x87, 0xb1, 0x90, - 0x31, 0x5a, 0x23, 0xc5, 0x12, 0x69, 0x05, 0xcd, 0x65, 0x43, 0x8a, 0x7e, 0x00, 0x38, 0x9e, 0xd4, - 0x12, 0xe1, 0x8b, 0x3b, 0xa6, 0x5d, 0x0a, 0x83, 0x64, 0x8e, 0xd7, 0x18, 0x03, 0x89, 0xb1, 0x89, - 0x1a, 0x17, 0x63, 0x3c, 0xb7, 0x89, 0x71, 0x42, 0x89, 0x3e, 0x1e, 0x64, 0x3f, 0x79, 0x82, 0x0e, - 0x88, 0xfa, 0x48, 0x7b, 0x76, 0xf5, 0x7e, 0x80, 0x3e, 0x00, 0x38, 0x71, 0x6e, 0xed, 0x51, 0x56, - 0xd0, 0x67, 0x3a, 0x2c, 0x66, 0x4f, 0xd0, 0x63, 0x2e, 0xcb, 0x31, 0x97, 0xd0, 0xdd, 0x4b, 0x8d, - 0xb9, 0xb2, 0x79, 0x74, 0x62, 0x82, 0xe3, 0x13, 0x13, 0x7c, 0x3f, 0x31, 0xc1, 0xab, 0x53, 0x33, - 0x77, 0x7c, 0x6a, 0xe6, 0xbe, 0x9e, 0x9a, 0xb9, 0x67, 0x4b, 0x9e, 0x2f, 0x9a, 0x1d, 0x07, 0xbb, - 0x6c, 0x87, 0xe8, 0x3f, 0x19, 0xea, 0x67, 0x81, 0xd7, 0x5f, 0x90, 0x97, 0xbd, 0x76, 0x8b, 0xb5, - 0x05, 0xdd, 0x51, 0xec, 0xb5, 0x28, 0x77, 0xfe, 0x93, 0x27, 0xf0, 0xf6, 0xef, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x71, 0x1f, 0x83, 0xc2, 0xcf, 0x08, 0x00, 0x00, + // 823 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x4d, 0x4f, 0xdb, 0x48, + 0x18, 0xce, 0xf0, 0x25, 0x98, 0x04, 0x58, 0x8d, 0xd0, 0x6e, 0x30, 0xc8, 0x44, 0x5e, 0x2d, 0x9b, + 0xdd, 0x85, 0x19, 0x92, 0xdd, 0x2d, 0x52, 0x25, 0x0e, 0x05, 0x89, 0x96, 0x4b, 0x0b, 0xee, 0xa1, + 0x52, 0xa5, 0x0a, 0xd9, 0xce, 0xc4, 0xb1, 0x4a, 0x3c, 0x21, 0xe3, 0x44, 0x45, 0x88, 0x0b, 0x7f, + 0xa0, 0x95, 0x7a, 0xec, 0xb5, 0xa7, 0xaa, 0xea, 0xa5, 0x87, 0xfe, 0x83, 0x8a, 0x23, 0x52, 0x7b, + 0xe8, 0xa9, 0x1f, 0xd0, 0x1f, 0xd1, 0x63, 0xe5, 0x99, 0x31, 0xb1, 0x89, 0x11, 0x16, 0x6a, 0x4f, + 0xb1, 0xdf, 0xaf, 0x79, 0x9e, 0xe7, 0x7d, 0xdf, 0x71, 0xa0, 0xee, 0xd9, 0x0e, 0x71, 0x58, 0x9b, + 0x12, 0x67, 0xc7, 0xa3, 0x7e, 0x40, 0xba, 0x15, 0xb2, 0xdb, 0xa1, 0xed, 0x3d, 0xdc, 0x6a, 0xb3, + 0x80, 0x21, 0xe4, 0xd9, 0x0e, 0x0e, 0xfd, 0x58, 0xfa, 0x71, 0xb7, 0xa2, 0xfd, 0xed, 0x30, 0xde, + 0x64, 0x9c, 0xd8, 0x16, 0xa7, 0x32, 0x98, 0x74, 0x2b, 0x36, 0x0d, 0xac, 0x0a, 0x69, 0x59, 0xae, + 0xe7, 0x5b, 0x81, 0xc7, 0x7c, 0x99, 0xaf, 0xcd, 0xa5, 0xd4, 0x57, 0x95, 0x64, 0xc0, 0xb4, 0xcb, + 0x98, 0xbb, 0x43, 0x89, 0x78, 0xb3, 0x3b, 0x75, 0x62, 0xf9, 0xea, 0x6c, 0x6d, 0x56, 0xb9, 0xac, + 0x96, 0x47, 0x2c, 0xdf, 0x67, 0x81, 0x28, 0xcc, 0x95, 0x77, 0xca, 0x65, 0x2e, 0x13, 0x8f, 0x24, + 0x7c, 0x92, 0x56, 0xe3, 0x1a, 0xfc, 0x6d, 0x2b, 0x44, 0xb4, 0x26, 0xce, 0xb8, 0x1b, 0x58, 0x01, + 0x35, 0xe9, 0x6e, 0x87, 0xf2, 0x00, 0xcd, 0xc0, 0x31, 0x79, 0xf2, 0xb6, 0x57, 0x2b, 0x82, 0x12, + 0x28, 0x8f, 0x99, 0xa3, 0xd2, 0xb0, 0x51, 0x33, 0x5e, 0x01, 0x58, 0xec, 0x4f, 0xe4, 0x2d, 0xe6, + 0x73, 0x8a, 0x96, 0x61, 0x41, 0x65, 0xf2, 0xd0, 0x2e, 0x92, 0xf3, 0xd5, 0x29, 0x2c, 0xf1, 0xe1, + 0x08, 0x3a, 0xbe, 0xe1, 0xef, 0x99, 0x79, 0xa7, 0x57, 0x00, 0x4d, 0xc1, 0xe1, 0x56, 0x9b, 0xb1, + 0x7a, 0x71, 0xa0, 0x04, 0xca, 0x05, 0x53, 0xbe, 0xa0, 0x35, 0x58, 0x10, 0x0f, 0xdb, 0x0d, 0xea, + 0xb9, 0x8d, 0xa0, 0x38, 0x28, 0xca, 0x69, 0xb8, 0x5f, 0x6a, 0x7c, 0x4b, 0x44, 0xac, 0x0e, 0x1d, + 0x7d, 0x9c, 0xcb, 0x99, 0x79, 0x91, 0x25, 0x4d, 0x86, 0xdd, 0x8f, 0x97, 0x47, 0x4c, 0xd7, 0x21, + 0xec, 0x35, 0x42, 0xa1, 0x9d, 0xc7, 0xb2, 0x6b, 0x38, 0xec, 0x1a, 0x96, 0x2d, 0x56, 0x5d, 0xc3, + 0x9b, 0x96, 0x1b, 0xa9, 0x64, 0xc6, 0x32, 0x8d, 0xf7, 0x00, 0x4e, 0xa7, 0x1c, 0xa2, 0x54, 0xf1, + 0xe1, 0x78, 0x5c, 0x15, 0x5e, 0x04, 0xa5, 0xc1, 0x72, 0xbe, 0xfa, 0x57, 0x1a, 0x8f, 0x8d, 0x1a, + 0xf5, 0x03, 0xaf, 0xee, 0xd1, 0x5a, 0xac, 0xd4, 0xaa, 0x1e, 0xd2, 0x7a, 0xf1, 0x69, 0xee, 0xd7, + 0x54, 0x37, 0x37, 0x0b, 0x31, 0x2d, 0x39, 0xba, 0x99, 0x60, 0x35, 0x20, 0x58, 0xfd, 0x79, 0x29, + 0x2b, 0x09, 0x36, 0x41, 0xeb, 0x25, 0x80, 0x9a, 0xa4, 0x15, 0xba, 0x7c, 0xde, 0xe1, 0x99, 0xe7, + 0x04, 0xfd, 0x01, 0x27, 0xba, 0xb4, 0xcd, 0x3d, 0xe6, 0x6f, 0xfb, 0x9d, 0xa6, 0x4d, 0xdb, 0x02, + 0xc8, 0x90, 0x39, 0xae, 0xac, 0xb7, 0x85, 0x31, 0x1e, 0x16, 0x6b, 0x72, 0x2f, 0x4c, 0x36, 0x11, + 0xfd, 0x0e, 0xc7, 0x77, 0x42, 0x6e, 0x41, 0x14, 0x35, 0x54, 0x02, 0xe5, 0x51, 0xb3, 0x20, 0x8d, + 0xaa, 0xd3, 0x6f, 0x00, 0x9c, 0x49, 0x85, 0xab, 0xfa, 0xb0, 0x02, 0x27, 0x9d, 0xc8, 0x93, 0x61, + 0x40, 0x27, 0x9c, 0x44, 0x99, 0x9f, 0x39, 0xa3, 0x87, 0xe9, 0xc8, 0x79, 0x26, 0xa5, 0xd7, 0x53, + 0xda, 0x7d, 0x95, 0x21, 0x7e, 0x0b, 0xe0, 0x6c, 0x3a, 0x08, 0xa5, 0xdf, 0x03, 0xf8, 0xcb, 0x39, + 0xfd, 0xa2, 0x51, 0x5e, 0x48, 0xa3, 0x9b, 0x2c, 0x73, 0xcf, 0x0b, 0x1a, 0x09, 0x01, 0x26, 0x93, + 0xf2, 0xfe, 0xc0, 0xb1, 0xd5, 0x12, 0x1b, 0xbf, 0x69, 0xb5, 0xad, 0x66, 0xa4, 0xa4, 0x71, 0x27, + 0xb1, 0xa8, 0x91, 0x4f, 0x11, 0xac, 0xc2, 0x91, 0x96, 0xb0, 0xa8, 0xb9, 0x48, 0xed, 0xa2, 0xca, + 0x51, 0x91, 0xd5, 0x6f, 0x23, 0x70, 0x58, 0x54, 0x44, 0xcf, 0x01, 0xcc, 0xc7, 0xb6, 0x12, 0xfd, + 0x93, 0x96, 0x7d, 0xc1, 0x9d, 0xab, 0x2d, 0x64, 0x0b, 0x96, 0x40, 0x8d, 0xeb, 0x87, 0xef, 0xbe, + 0x3e, 0x1d, 0xf8, 0x0f, 0x55, 0x49, 0xff, 0x57, 0x43, 0x7e, 0x5f, 0x12, 0x17, 0x0e, 0xd9, 0x3f, + 0x9b, 0x9e, 0x03, 0xf4, 0x0c, 0xc0, 0x42, 0xfc, 0xf2, 0x40, 0x99, 0x8e, 0x8e, 0x04, 0xd4, 0x16, + 0x33, 0x46, 0x2b, 0xa4, 0x58, 0x20, 0x2d, 0xa3, 0xf9, 0x6c, 0x48, 0xd1, 0x17, 0x00, 0x27, 0x92, + 0x83, 0x83, 0xf0, 0xc5, 0x27, 0xa6, 0x5d, 0x4b, 0x1a, 0xc9, 0x1c, 0xaf, 0x30, 0xfa, 0x02, 0x63, + 0x03, 0xd5, 0x2f, 0xc6, 0x78, 0x6e, 0xec, 0xe3, 0x82, 0x12, 0x75, 0x53, 0x91, 0xfd, 0xe4, 0x7d, + 0x77, 0x40, 0xe4, 0x8d, 0xd0, 0xb3, 0xcb, 0xf7, 0x03, 0xf4, 0x1a, 0xc0, 0xc9, 0x73, 0x3b, 0x86, + 0xb2, 0x82, 0x3e, 0xeb, 0xc3, 0x52, 0xf6, 0x04, 0x45, 0x73, 0x45, 0xd0, 0x5c, 0x46, 0xff, 0x5f, + 0x89, 0x26, 0x7a, 0x7c, 0x36, 0x37, 0x72, 0x03, 0x2e, 0x9d, 0x9b, 0xc4, 0xe2, 0x5d, 0x3a, 0x37, + 0xc9, 0x55, 0x34, 0x0c, 0x01, 0x76, 0x16, 0x69, 0x12, 0x6c, 0x12, 0xa7, 0x5c, 0xbd, 0xd5, 0xad, + 0xa3, 0x13, 0x1d, 0x1c, 0x9f, 0xe8, 0xe0, 0xf3, 0x89, 0x0e, 0x9e, 0x9c, 0xea, 0xb9, 0xe3, 0x53, + 0x3d, 0xf7, 0xe1, 0x54, 0xcf, 0xdd, 0x5f, 0x76, 0xbd, 0xa0, 0xd1, 0xb1, 0xb1, 0xc3, 0x9a, 0x44, + 0xfd, 0x07, 0x93, 0x3f, 0x8b, 0xbc, 0xf6, 0x90, 0x3c, 0xea, 0x09, 0xb0, 0x54, 0x5d, 0x54, 0xb5, + 0x83, 0xbd, 0x16, 0xe5, 0xf6, 0x88, 0xf8, 0x02, 0xfc, 0xfb, 0x3d, 0x00, 0x00, 0xff, 0xff, 0xca, + 0xdc, 0xd5, 0x38, 0xee, 0x09, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -586,6 +676,8 @@ type QueryClient interface { // ConsensusStates queries all the consensus state associated with a given // client. ConsensusStates(ctx context.Context, in *QueryConsensusStatesRequest, opts ...grpc.CallOption) (*QueryConsensusStatesResponse, error) + // ClientParams queries all parameters of the ibc client. + ClientParams(ctx context.Context, in *QueryClientParamsRequest, opts ...grpc.CallOption) (*QueryClientParamsResponse, error) } type queryClient struct { @@ -632,6 +724,15 @@ func (c *queryClient) ConsensusStates(ctx context.Context, in *QueryConsensusSta return out, nil } +func (c *queryClient) ClientParams(ctx context.Context, in *QueryClientParamsRequest, opts ...grpc.CallOption) (*QueryClientParamsResponse, error) { + out := new(QueryClientParamsResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Query/ClientParams", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // ClientState queries an IBC light client. @@ -644,6 +745,8 @@ type QueryServer interface { // ConsensusStates queries all the consensus state associated with a given // client. ConsensusStates(context.Context, *QueryConsensusStatesRequest) (*QueryConsensusStatesResponse, error) + // ClientParams queries all parameters of the ibc client. + ClientParams(context.Context, *QueryClientParamsRequest) (*QueryClientParamsResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -662,6 +765,9 @@ func (*UnimplementedQueryServer) ConsensusState(ctx context.Context, req *QueryC func (*UnimplementedQueryServer) ConsensusStates(ctx context.Context, req *QueryConsensusStatesRequest) (*QueryConsensusStatesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ConsensusStates not implemented") } +func (*UnimplementedQueryServer) ClientParams(ctx context.Context, req *QueryClientParamsRequest) (*QueryClientParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ClientParams not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -739,6 +845,24 @@ func _Query_ConsensusStates_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _Query_ClientParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryClientParamsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ClientParams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ibc.core.client.v1.Query/ClientParams", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ClientParams(ctx, req.(*QueryClientParamsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "ibc.core.client.v1.Query", HandlerType: (*QueryServer)(nil), @@ -759,6 +883,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "ConsensusStates", Handler: _Query_ConsensusStates_Handler, }, + { + MethodName: "ClientParams", + Handler: _Query_ClientParams_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "ibc/core/client/v1/query.proto", @@ -1123,6 +1251,64 @@ func (m *QueryConsensusStatesResponse) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } +func (m *QueryClientParamsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryClientParamsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryClientParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryClientParamsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryClientParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryClientParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Params != nil { + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -1275,6 +1461,28 @@ func (m *QueryConsensusStatesResponse) Size() (n int) { return n } +func (m *QueryClientParamsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryClientParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Params != nil { + l = m.Params.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1669,7 +1877,7 @@ func (m *QueryClientStatesResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientStates = append(m.ClientStates, &IdentifiedClientState{}) + m.ClientStates = append(m.ClientStates, IdentifiedClientState{}) if err := m.ClientStates[len(m.ClientStates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -2277,6 +2485,148 @@ func (m *QueryConsensusStatesResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryClientParamsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryClientParamsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryClientParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryClientParamsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryClientParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryClientParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Params == nil { + m.Params = &Params{} + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/ibc/core/02-client/types/query.pb.gw.go b/x/ibc/core/02-client/types/query.pb.gw.go index 4d1cce8361a..77b3df69a8a 100644 --- a/x/ibc/core/02-client/types/query.pb.gw.go +++ b/x/ibc/core/02-client/types/query.pb.gw.go @@ -309,6 +309,24 @@ func local_request_Query_ConsensusStates_0(ctx context.Context, marshaler runtim } +func request_Query_ClientParams_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryClientParamsRequest + var metadata runtime.ServerMetadata + + msg, err := client.ClientParams(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ClientParams_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryClientParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.ClientParams(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -395,6 +413,26 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_ClientParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ClientParams_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ClientParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -516,6 +554,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_ClientParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_ClientParams_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ClientParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -527,6 +585,8 @@ var ( pattern_Query_ConsensusState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8, 1, 0, 4, 1, 5, 9}, []string{"ibc", "core", "client", "v1beta1", "consensus_states", "client_id", "version", "version_number", "height", "version_height"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Query_ConsensusStates_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"ibc", "core", "client", "v1beta1", "consensus_states", "client_id"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_ClientParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ibc", "client", "v1beta1", "params"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -537,4 +597,6 @@ var ( forward_Query_ConsensusState_0 = runtime.ForwardResponseMessage forward_Query_ConsensusStates_0 = runtime.ForwardResponseMessage + + forward_Query_ClientParams_0 = runtime.ForwardResponseMessage ) diff --git a/x/ibc/core/02-client/types/tx.pb.go b/x/ibc/core/02-client/types/tx.pb.go new file mode 100644 index 00000000000..4b637e5ba63 --- /dev/null +++ b/x/ibc/core/02-client/types/tx.pb.go @@ -0,0 +1,2128 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: ibc/core/client/v1/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + types "github.com/cosmos/cosmos-sdk/codec/types" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// MsgCreateClient defines a message to create an IBC client +type MsgCreateClient struct { + // client unique identifier + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` + // light client state + ClientState *types.Any `protobuf:"bytes,2,opt,name=client_state,json=clientState,proto3" json:"client_state,omitempty" yaml:"client_state"` + // consensus state associated with the client that corresponds to a given + // height. + ConsensusState *types.Any `protobuf:"bytes,3,opt,name=consensus_state,json=consensusState,proto3" json:"consensus_state,omitempty" yaml:"consensus_state"` + // signer address + Signer string `protobuf:"bytes,4,opt,name=signer,proto3" json:"signer,omitempty"` +} + +func (m *MsgCreateClient) Reset() { *m = MsgCreateClient{} } +func (m *MsgCreateClient) String() string { return proto.CompactTextString(m) } +func (*MsgCreateClient) ProtoMessage() {} +func (*MsgCreateClient) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{0} +} +func (m *MsgCreateClient) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateClient.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateClient) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateClient.Merge(m, src) +} +func (m *MsgCreateClient) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateClient) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateClient.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateClient proto.InternalMessageInfo + +// MsgCreateClientResponse defines the Msg/CreateClient response type. +type MsgCreateClientResponse struct { +} + +func (m *MsgCreateClientResponse) Reset() { *m = MsgCreateClientResponse{} } +func (m *MsgCreateClientResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateClientResponse) ProtoMessage() {} +func (*MsgCreateClientResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{1} +} +func (m *MsgCreateClientResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateClientResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateClientResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateClientResponse.Merge(m, src) +} +func (m *MsgCreateClientResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateClientResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateClientResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateClientResponse proto.InternalMessageInfo + +// MsgUpdateClient defines an sdk.Msg to update a IBC client state using +// the given header. +type MsgUpdateClient struct { + // client unique identifier + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` + // header to update the light client + Header *types.Any `protobuf:"bytes,2,opt,name=header,proto3" json:"header,omitempty"` + // signer address + Signer string `protobuf:"bytes,3,opt,name=signer,proto3" json:"signer,omitempty"` +} + +func (m *MsgUpdateClient) Reset() { *m = MsgUpdateClient{} } +func (m *MsgUpdateClient) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateClient) ProtoMessage() {} +func (*MsgUpdateClient) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{2} +} +func (m *MsgUpdateClient) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateClient.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpdateClient) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateClient.Merge(m, src) +} +func (m *MsgUpdateClient) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateClient) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateClient.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateClient proto.InternalMessageInfo + +// MsgUpdateClientResponse defines the Msg/UpdateClient response type. +type MsgUpdateClientResponse struct { +} + +func (m *MsgUpdateClientResponse) Reset() { *m = MsgUpdateClientResponse{} } +func (m *MsgUpdateClientResponse) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateClientResponse) ProtoMessage() {} +func (*MsgUpdateClientResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{3} +} +func (m *MsgUpdateClientResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateClientResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpdateClientResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateClientResponse.Merge(m, src) +} +func (m *MsgUpdateClientResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateClientResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateClientResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateClientResponse proto.InternalMessageInfo + +// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client state +type MsgUpgradeClient struct { + // client unique identifier + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` + // upgraded client state + ClientState *types.Any `protobuf:"bytes,2,opt,name=client_state,json=clientState,proto3" json:"client_state,omitempty" yaml:"client_state"` + // height at which old chain halts and upgrades (i.e last block executed) + UpgradeHeight *Height `protobuf:"bytes,3,opt,name=upgrade_height,json=upgradeHeight,proto3" json:"upgrade_height,omitempty" yaml:"upgrade_height"` + // proof that old chain committed to new client + ProofUpgrade []byte `protobuf:"bytes,4,opt,name=proof_upgrade,json=proofUpgrade,proto3" json:"proof_upgrade,omitempty" yaml:"proof_upgrade"` + // signer address + Signer string `protobuf:"bytes,5,opt,name=signer,proto3" json:"signer,omitempty"` +} + +func (m *MsgUpgradeClient) Reset() { *m = MsgUpgradeClient{} } +func (m *MsgUpgradeClient) String() string { return proto.CompactTextString(m) } +func (*MsgUpgradeClient) ProtoMessage() {} +func (*MsgUpgradeClient) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{4} +} +func (m *MsgUpgradeClient) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpgradeClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpgradeClient.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpgradeClient) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpgradeClient.Merge(m, src) +} +func (m *MsgUpgradeClient) XXX_Size() int { + return m.Size() +} +func (m *MsgUpgradeClient) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpgradeClient.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpgradeClient proto.InternalMessageInfo + +func (m *MsgUpgradeClient) GetClientId() string { + if m != nil { + return m.ClientId + } + return "" +} + +func (m *MsgUpgradeClient) GetClientState() *types.Any { + if m != nil { + return m.ClientState + } + return nil +} + +func (m *MsgUpgradeClient) GetUpgradeHeight() *Height { + if m != nil { + return m.UpgradeHeight + } + return nil +} + +func (m *MsgUpgradeClient) GetProofUpgrade() []byte { + if m != nil { + return m.ProofUpgrade + } + return nil +} + +func (m *MsgUpgradeClient) GetSigner() string { + if m != nil { + return m.Signer + } + return "" +} + +// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. +type MsgUpgradeClientResponse struct { +} + +func (m *MsgUpgradeClientResponse) Reset() { *m = MsgUpgradeClientResponse{} } +func (m *MsgUpgradeClientResponse) String() string { return proto.CompactTextString(m) } +func (*MsgUpgradeClientResponse) ProtoMessage() {} +func (*MsgUpgradeClientResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{5} +} +func (m *MsgUpgradeClientResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpgradeClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpgradeClientResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpgradeClientResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpgradeClientResponse.Merge(m, src) +} +func (m *MsgUpgradeClientResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgUpgradeClientResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpgradeClientResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpgradeClientResponse proto.InternalMessageInfo + +// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for +// light client misbehaviour. +type MsgSubmitMisbehaviour struct { + // client unique identifier + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` + // misbehaviour used for freezing the light client + Misbehaviour *types.Any `protobuf:"bytes,2,opt,name=misbehaviour,proto3" json:"misbehaviour,omitempty"` + // signer address + Signer string `protobuf:"bytes,3,opt,name=signer,proto3" json:"signer,omitempty"` +} + +func (m *MsgSubmitMisbehaviour) Reset() { *m = MsgSubmitMisbehaviour{} } +func (m *MsgSubmitMisbehaviour) String() string { return proto.CompactTextString(m) } +func (*MsgSubmitMisbehaviour) ProtoMessage() {} +func (*MsgSubmitMisbehaviour) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{6} +} +func (m *MsgSubmitMisbehaviour) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSubmitMisbehaviour) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSubmitMisbehaviour.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSubmitMisbehaviour) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSubmitMisbehaviour.Merge(m, src) +} +func (m *MsgSubmitMisbehaviour) XXX_Size() int { + return m.Size() +} +func (m *MsgSubmitMisbehaviour) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSubmitMisbehaviour.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSubmitMisbehaviour proto.InternalMessageInfo + +// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response type. +type MsgSubmitMisbehaviourResponse struct { +} + +func (m *MsgSubmitMisbehaviourResponse) Reset() { *m = MsgSubmitMisbehaviourResponse{} } +func (m *MsgSubmitMisbehaviourResponse) String() string { return proto.CompactTextString(m) } +func (*MsgSubmitMisbehaviourResponse) ProtoMessage() {} +func (*MsgSubmitMisbehaviourResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{7} +} +func (m *MsgSubmitMisbehaviourResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSubmitMisbehaviourResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSubmitMisbehaviourResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSubmitMisbehaviourResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSubmitMisbehaviourResponse.Merge(m, src) +} +func (m *MsgSubmitMisbehaviourResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgSubmitMisbehaviourResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSubmitMisbehaviourResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSubmitMisbehaviourResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgCreateClient)(nil), "ibc.core.client.v1.MsgCreateClient") + proto.RegisterType((*MsgCreateClientResponse)(nil), "ibc.core.client.v1.MsgCreateClientResponse") + proto.RegisterType((*MsgUpdateClient)(nil), "ibc.core.client.v1.MsgUpdateClient") + proto.RegisterType((*MsgUpdateClientResponse)(nil), "ibc.core.client.v1.MsgUpdateClientResponse") + proto.RegisterType((*MsgUpgradeClient)(nil), "ibc.core.client.v1.MsgUpgradeClient") + proto.RegisterType((*MsgUpgradeClientResponse)(nil), "ibc.core.client.v1.MsgUpgradeClientResponse") + proto.RegisterType((*MsgSubmitMisbehaviour)(nil), "ibc.core.client.v1.MsgSubmitMisbehaviour") + proto.RegisterType((*MsgSubmitMisbehaviourResponse)(nil), "ibc.core.client.v1.MsgSubmitMisbehaviourResponse") +} + +func init() { proto.RegisterFile("ibc/core/client/v1/tx.proto", fileDescriptor_cb5dc4651eb49a04) } + +var fileDescriptor_cb5dc4651eb49a04 = []byte{ + // 608 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x55, 0x3f, 0x6f, 0xd3, 0x40, + 0x14, 0x8f, 0x1b, 0x88, 0xda, 0x6b, 0xd2, 0x56, 0x26, 0x6d, 0x13, 0x23, 0xec, 0xca, 0x30, 0x14, + 0xd1, 0xda, 0x24, 0x0c, 0xa0, 0x4a, 0x0c, 0xa4, 0x0b, 0x0c, 0x91, 0xc0, 0x15, 0x03, 0x08, 0x29, + 0xf8, 0xcf, 0xf5, 0x62, 0x91, 0xf8, 0x22, 0xdf, 0x39, 0x6a, 0xbe, 0x01, 0x23, 0x12, 0x7c, 0x80, + 0x8a, 0x81, 0xcf, 0xc2, 0xc0, 0xd0, 0x91, 0x29, 0x42, 0xc9, 0xc2, 0x9c, 0x4f, 0x80, 0x7c, 0x77, + 0xb1, 0xec, 0x34, 0x89, 0x22, 0x58, 0x98, 0xe2, 0x77, 0xef, 0xf7, 0x7e, 0xef, 0xe7, 0xdf, 0x7b, + 0x17, 0x83, 0xdb, 0xbe, 0xe3, 0x9a, 0x2e, 0x0e, 0xa1, 0xe9, 0x76, 0x7c, 0x18, 0x50, 0xb3, 0x5f, + 0x33, 0xe9, 0x85, 0xd1, 0x0b, 0x31, 0xc5, 0xb2, 0xec, 0x3b, 0xae, 0x11, 0x27, 0x0d, 0x9e, 0x34, + 0xfa, 0x35, 0xa5, 0x8c, 0x30, 0xc2, 0x2c, 0x6d, 0xc6, 0x4f, 0x1c, 0xa9, 0x54, 0x11, 0xc6, 0xa8, + 0x03, 0x4d, 0x16, 0x39, 0xd1, 0xb9, 0x69, 0x07, 0x03, 0x91, 0xd2, 0xe6, 0x74, 0x10, 0x74, 0x0c, + 0xa0, 0x7f, 0x5e, 0x03, 0xdb, 0x4d, 0x82, 0x4e, 0x43, 0x68, 0x53, 0x78, 0xca, 0x32, 0x72, 0x0d, + 0x6c, 0x70, 0x4c, 0xcb, 0xf7, 0x2a, 0xd2, 0x81, 0x74, 0xb8, 0xd1, 0x28, 0x4f, 0x86, 0xda, 0xce, + 0xc0, 0xee, 0x76, 0x4e, 0xf4, 0x24, 0xa5, 0x5b, 0xeb, 0xfc, 0xf9, 0x85, 0x27, 0xbf, 0x04, 0x45, + 0x71, 0x4e, 0xa8, 0x4d, 0x61, 0x65, 0xed, 0x40, 0x3a, 0xdc, 0xac, 0x97, 0x0d, 0xae, 0xcc, 0x98, + 0x2a, 0x33, 0x9e, 0x05, 0x83, 0xc6, 0xfe, 0x64, 0xa8, 0xdd, 0xca, 0x70, 0xb1, 0x1a, 0xdd, 0xda, + 0xe4, 0xe1, 0x59, 0x1c, 0xc9, 0x6f, 0xc0, 0xb6, 0x8b, 0x03, 0x02, 0x03, 0x12, 0x11, 0x41, 0x9a, + 0x5f, 0x42, 0xaa, 0x4c, 0x86, 0xda, 0x9e, 0x20, 0xcd, 0x96, 0xe9, 0xd6, 0x56, 0x72, 0xc2, 0xa9, + 0xf7, 0x40, 0x81, 0xf8, 0x28, 0x80, 0x61, 0xe5, 0x46, 0xfc, 0x72, 0x96, 0x88, 0x4e, 0xd6, 0x3f, + 0x5e, 0x6a, 0xb9, 0xdf, 0x97, 0x5a, 0x4e, 0xaf, 0x82, 0xfd, 0x19, 0x53, 0x2c, 0x48, 0x7a, 0x31, + 0x8b, 0xfe, 0x45, 0x62, 0x86, 0xbd, 0xee, 0x79, 0xff, 0x64, 0xd8, 0x11, 0x28, 0xb4, 0xa1, 0xed, + 0xc1, 0x70, 0x99, 0x55, 0x96, 0xc0, 0xa4, 0x14, 0xe7, 0x97, 0x2a, 0x4e, 0xab, 0x4a, 0x14, 0xff, + 0x58, 0x03, 0x3b, 0x2c, 0x87, 0x42, 0xdb, 0xfb, 0xaf, 0x66, 0xfc, 0x0e, 0x6c, 0x45, 0x5c, 0x55, + 0xab, 0x0d, 0x7d, 0xd4, 0xa6, 0x62, 0xc4, 0x8a, 0x71, 0x7d, 0xf7, 0x8d, 0xe7, 0x0c, 0xd1, 0xa8, + 0x4e, 0x86, 0xda, 0x2e, 0x67, 0xce, 0xd6, 0xea, 0x56, 0x49, 0x1c, 0x70, 0xa4, 0xfc, 0x14, 0x94, + 0x7a, 0x21, 0xc6, 0xe7, 0x2d, 0x71, 0xcc, 0xa6, 0x5d, 0x6c, 0x54, 0x26, 0x43, 0xad, 0xcc, 0x09, + 0x32, 0x69, 0xdd, 0x2a, 0xb2, 0x58, 0xf8, 0x94, 0xf2, 0xfc, 0x66, 0xda, 0x73, 0x5d, 0x01, 0x95, + 0x59, 0x37, 0x13, 0xab, 0xbf, 0x49, 0x60, 0xb7, 0x49, 0xd0, 0x59, 0xe4, 0x74, 0x7d, 0xda, 0xf4, + 0x89, 0x03, 0xdb, 0x76, 0xdf, 0xc7, 0x51, 0xf8, 0x37, 0x7e, 0x3f, 0x01, 0xc5, 0x6e, 0x8a, 0x62, + 0xe9, 0xa2, 0x64, 0x90, 0x2b, 0xac, 0x8b, 0x06, 0xee, 0xcc, 0xd5, 0x39, 0x7d, 0x93, 0xfa, 0xd7, + 0x3c, 0xc8, 0x37, 0x09, 0x92, 0xdf, 0x83, 0x62, 0xe6, 0xbf, 0xe1, 0xee, 0xbc, 0xd1, 0xcc, 0xdc, + 0x15, 0xe5, 0xc1, 0x0a, 0xa0, 0x69, 0xa7, 0xb8, 0x43, 0xe6, 0x32, 0x2d, 0xea, 0x90, 0x06, 0x2d, + 0xec, 0x30, 0xef, 0x02, 0xc8, 0x2e, 0x28, 0x65, 0x97, 0xff, 0xde, 0xc2, 0xea, 0x14, 0x4a, 0x39, + 0x5a, 0x05, 0x95, 0x34, 0x09, 0x81, 0x3c, 0x67, 0xec, 0xf7, 0x17, 0x70, 0x5c, 0x87, 0x2a, 0xb5, + 0x95, 0xa1, 0xd3, 0x9e, 0x8d, 0x57, 0xdf, 0x47, 0xaa, 0x74, 0x35, 0x52, 0xa5, 0x5f, 0x23, 0x55, + 0xfa, 0x34, 0x56, 0x73, 0x57, 0x63, 0x35, 0xf7, 0x73, 0xac, 0xe6, 0xde, 0x3e, 0x46, 0x3e, 0x6d, + 0x47, 0x8e, 0xe1, 0xe2, 0xae, 0xe9, 0x62, 0xd2, 0xc5, 0x44, 0xfc, 0x1c, 0x13, 0xef, 0x83, 0x79, + 0x61, 0x26, 0x9f, 0x85, 0x87, 0xf5, 0x63, 0xf1, 0x65, 0xa0, 0x83, 0x1e, 0x24, 0x4e, 0x81, 0xad, + 0xd5, 0xa3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x03, 0x55, 0x1e, 0x9b, 0x06, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + // CreateClient defines a rpc handler method for MsgCreateClient. + CreateClient(ctx context.Context, in *MsgCreateClient, opts ...grpc.CallOption) (*MsgCreateClientResponse, error) + // UpdateClient defines a rpc handler method for MsgUpdateClient. + UpdateClient(ctx context.Context, in *MsgUpdateClient, opts ...grpc.CallOption) (*MsgUpdateClientResponse, error) + // UpgradeClient defines a rpc handler method for MsgUpgradeClient. + UpgradeClient(ctx context.Context, in *MsgUpgradeClient, opts ...grpc.CallOption) (*MsgUpgradeClientResponse, error) + // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. + SubmitMisbehaviour(ctx context.Context, in *MsgSubmitMisbehaviour, opts ...grpc.CallOption) (*MsgSubmitMisbehaviourResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) CreateClient(ctx context.Context, in *MsgCreateClient, opts ...grpc.CallOption) (*MsgCreateClientResponse, error) { + out := new(MsgCreateClientResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/CreateClient", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) UpdateClient(ctx context.Context, in *MsgUpdateClient, opts ...grpc.CallOption) (*MsgUpdateClientResponse, error) { + out := new(MsgUpdateClientResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/UpdateClient", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) UpgradeClient(ctx context.Context, in *MsgUpgradeClient, opts ...grpc.CallOption) (*MsgUpgradeClientResponse, error) { + out := new(MsgUpgradeClientResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/UpgradeClient", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) SubmitMisbehaviour(ctx context.Context, in *MsgSubmitMisbehaviour, opts ...grpc.CallOption) (*MsgSubmitMisbehaviourResponse, error) { + out := new(MsgSubmitMisbehaviourResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/SubmitMisbehaviour", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + // CreateClient defines a rpc handler method for MsgCreateClient. + CreateClient(context.Context, *MsgCreateClient) (*MsgCreateClientResponse, error) + // UpdateClient defines a rpc handler method for MsgUpdateClient. + UpdateClient(context.Context, *MsgUpdateClient) (*MsgUpdateClientResponse, error) + // UpgradeClient defines a rpc handler method for MsgUpgradeClient. + UpgradeClient(context.Context, *MsgUpgradeClient) (*MsgUpgradeClientResponse, error) + // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. + SubmitMisbehaviour(context.Context, *MsgSubmitMisbehaviour) (*MsgSubmitMisbehaviourResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) CreateClient(ctx context.Context, req *MsgCreateClient) (*MsgCreateClientResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateClient not implemented") +} +func (*UnimplementedMsgServer) UpdateClient(ctx context.Context, req *MsgUpdateClient) (*MsgUpdateClientResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateClient not implemented") +} +func (*UnimplementedMsgServer) UpgradeClient(ctx context.Context, req *MsgUpgradeClient) (*MsgUpgradeClientResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpgradeClient not implemented") +} +func (*UnimplementedMsgServer) SubmitMisbehaviour(ctx context.Context, req *MsgSubmitMisbehaviour) (*MsgSubmitMisbehaviourResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SubmitMisbehaviour not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_CreateClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCreateClient) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CreateClient(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ibc.core.client.v1.Msg/CreateClient", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CreateClient(ctx, req.(*MsgCreateClient)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_UpdateClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpdateClient) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpdateClient(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ibc.core.client.v1.Msg/UpdateClient", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpdateClient(ctx, req.(*MsgUpdateClient)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_UpgradeClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpgradeClient) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpgradeClient(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ibc.core.client.v1.Msg/UpgradeClient", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpgradeClient(ctx, req.(*MsgUpgradeClient)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_SubmitMisbehaviour_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgSubmitMisbehaviour) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).SubmitMisbehaviour(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ibc.core.client.v1.Msg/SubmitMisbehaviour", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).SubmitMisbehaviour(ctx, req.(*MsgSubmitMisbehaviour)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "ibc.core.client.v1.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateClient", + Handler: _Msg_CreateClient_Handler, + }, + { + MethodName: "UpdateClient", + Handler: _Msg_UpdateClient_Handler, + }, + { + MethodName: "UpgradeClient", + Handler: _Msg_UpgradeClient_Handler, + }, + { + MethodName: "SubmitMisbehaviour", + Handler: _Msg_SubmitMisbehaviour_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "ibc/core/client/v1/tx.proto", +} + +func (m *MsgCreateClient) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateClient) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0x22 + } + if m.ConsensusState != nil { + { + size, err := m.ConsensusState.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.ClientState != nil { + { + size, err := m.ClientState.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ClientId) > 0 { + i -= len(m.ClientId) + copy(dAtA[i:], m.ClientId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ClientId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateClientResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateClientResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgUpdateClient) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpdateClient) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0x1a + } + if m.Header != nil { + { + size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ClientId) > 0 { + i -= len(m.ClientId) + copy(dAtA[i:], m.ClientId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ClientId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpdateClientResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpdateClientResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgUpgradeClient) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpgradeClient) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpgradeClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0x2a + } + if len(m.ProofUpgrade) > 0 { + i -= len(m.ProofUpgrade) + copy(dAtA[i:], m.ProofUpgrade) + i = encodeVarintTx(dAtA, i, uint64(len(m.ProofUpgrade))) + i-- + dAtA[i] = 0x22 + } + if m.UpgradeHeight != nil { + { + size, err := m.UpgradeHeight.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.ClientState != nil { + { + size, err := m.ClientState.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ClientId) > 0 { + i -= len(m.ClientId) + copy(dAtA[i:], m.ClientId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ClientId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpgradeClientResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpgradeClientResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpgradeClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgSubmitMisbehaviour) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSubmitMisbehaviour) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSubmitMisbehaviour) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0x1a + } + if m.Misbehaviour != nil { + { + size, err := m.Misbehaviour.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ClientId) > 0 { + i -= len(m.ClientId) + copy(dAtA[i:], m.ClientId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ClientId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgSubmitMisbehaviourResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSubmitMisbehaviourResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSubmitMisbehaviourResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgCreateClient) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.ClientState != nil { + l = m.ClientState.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.ConsensusState != nil { + l = m.ConsensusState.Size() + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgCreateClientResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgUpdateClient) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgUpdateClientResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgUpgradeClient) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.ClientState != nil { + l = m.ClientState.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.UpgradeHeight != nil { + l = m.UpgradeHeight.Size() + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ProofUpgrade) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgUpgradeClientResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgSubmitMisbehaviour) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Misbehaviour != nil { + l = m.Misbehaviour.Size() + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgSubmitMisbehaviourResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgCreateClient) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreateClient: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateClient: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ClientState == nil { + m.ClientState = &types.Any{} + } + if err := m.ClientState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsensusState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConsensusState == nil { + m.ConsensusState = &types.Any{} + } + if err := m.ConsensusState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateClientResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreateClientResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateClient) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgUpdateClient: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateClient: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &types.Any{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateClientResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgUpdateClientResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpgradeClient) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgUpgradeClient: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpgradeClient: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ClientState == nil { + m.ClientState = &types.Any{} + } + if err := m.ClientState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpgradeHeight", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UpgradeHeight == nil { + m.UpgradeHeight = &Height{} + } + if err := m.UpgradeHeight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProofUpgrade", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProofUpgrade = append(m.ProofUpgrade[:0], dAtA[iNdEx:postIndex]...) + if m.ProofUpgrade == nil { + m.ProofUpgrade = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpgradeClientResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgUpgradeClientResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpgradeClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSubmitMisbehaviour) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgSubmitMisbehaviour: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSubmitMisbehaviour: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Misbehaviour", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Misbehaviour == nil { + m.Misbehaviour = &types.Any{} + } + if err := m.Misbehaviour.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSubmitMisbehaviourResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgSubmitMisbehaviourResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSubmitMisbehaviourResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/ibc/core/03-connection/keeper/grpc_query_test.go b/x/ibc/core/03-connection/keeper/grpc_query_test.go index 5a8122e279a..7e27b5af101 100644 --- a/x/ibc/core/03-connection/keeper/grpc_query_test.go +++ b/x/ibc/core/03-connection/keeper/grpc_query_test.go @@ -47,7 +47,7 @@ func (suite *KeeperTestSuite) TestQueryConnection() { { "success", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA := suite.chainA.GetFirstTestConnection(clientA, clientB) connB := suite.chainB.GetFirstTestConnection(clientB, clientA) @@ -111,11 +111,11 @@ func (suite *KeeperTestSuite) TestQueryConnections() { { "success", func() { - clientA, clientB, connA0, connB0 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA0, connB0 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connA1, connB1, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) - clientA1, clientB1, connA2, connB2 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA1, clientB1, connA2, connB2 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) counterparty1 := types.NewCounterparty(clientB, connB0.ID, suite.chainB.GetPrefix()) counterparty2 := types.NewCounterparty(clientB, connB1.ID, suite.chainB.GetPrefix()) @@ -197,7 +197,7 @@ func (suite *KeeperTestSuite) TestQueryClientConnections() { { "success", func() { - clientA, clientB, connA0, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA0, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connA1, _ := suite.coordinator.CreateConnection(suite.chainA, suite.chainB, clientA, clientB) expPaths = []string{connA0.ID, connA1.ID} suite.chainA.App.IBCKeeper.ConnectionKeeper.SetClientConnectionPaths(suite.chainA.GetContext(), clientA, expPaths) @@ -282,7 +282,7 @@ func (suite *KeeperTestSuite) TestQueryConnectionClientState() { { "success", func() { - clientA, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) expClientState := suite.chainA.GetClientState(clientA) expIdentifiedClientState = clienttypes.NewIdentifiedClientState(clientA, expClientState) @@ -371,7 +371,7 @@ func (suite *KeeperTestSuite) TestQueryConnectionConsensusState() { { "success", func() { - clientA, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) expConsensusState, _ = suite.chainA.GetConsensusState(clientA, clientState.GetLatestHeight()) diff --git a/x/ibc/core/03-connection/keeper/handshake_test.go b/x/ibc/core/03-connection/keeper/handshake_test.go index 90378108647..74ccbf7cb91 100644 --- a/x/ibc/core/03-connection/keeper/handshake_test.go +++ b/x/ibc/core/03-connection/keeper/handshake_test.go @@ -27,26 +27,26 @@ func (suite *KeeperTestSuite) TestConnOpenInit() { expPass bool }{ {"success", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) }, true}, {"success with empty counterparty identifier", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) emptyConnBID = true }, true}, {"success with non empty version", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) version = types.ExportedVersionsToProto(types.GetCompatibleVersions())[0] }, true}, {"connection already exists", func() { - clientA, clientB, _, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, _, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) }, false}, {"invalid version", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) version = &types.Version{} }, false}, {"couldn't add connection to client", func() { // swap client identifiers to result in client that does not exist - clientB, clientA = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientB, clientA = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) }, false}, } @@ -94,7 +94,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { expPass bool }{ {"success", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -102,7 +102,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { counterpartyClient = suite.chainA.GetClientState(clientA) }, true}, {"success with empty counterpartyChosenConnectionID", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -114,17 +114,17 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { suite.chainA.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainA.GetContext(), connA.ID, connection) - err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) // retrieve client state of chainA to pass as counterpartyClient counterpartyClient = suite.chainA.GetClientState(clientA) }, true}, {"counterpartyChosenConnectionID does not match desiredConnectionID", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -136,17 +136,17 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { suite.chainA.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainA.GetContext(), connA.ID, connection) - err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) // retrieve client state of chainA to pass as counterpartyClient counterpartyClient = suite.chainA.GetClientState(clientA) }, false}, {"invalid counterparty client", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -161,7 +161,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { suite.chainA.App.IBCKeeper.ClientKeeper.SetClientState(suite.chainA.GetContext(), clientA, tmClient) }, false}, {"consensus height >= latest height", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -171,7 +171,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { consensusHeight = clienttypes.GetSelfHeight(suite.chainB.GetContext()) }, false}, {"self consensus state not found", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -181,7 +181,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { consensusHeight = clienttypes.NewHeight(0, 1) }, false}, {"counterparty versions is empty", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -191,7 +191,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { versions = nil }, false}, {"counterparty versions don't have a match", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -202,14 +202,14 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { versions = []exported.Version{version} }, false}, {"connection state verification failed", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // chainA connection not created // retrieve client state of chainA to pass as counterpartyClient counterpartyClient = suite.chainA.GetClientState(clientA) }, false}, {"client state verification failed", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -222,7 +222,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { tmClient.LatestHeight = tmClient.LatestHeight.Increment() }, false}, {"consensus state verification failed", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // retrieve client state of chainA to pass as counterpartyClient counterpartyClient = suite.chainA.GetClientState(clientA) @@ -241,7 +241,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { suite.Require().NoError(err) }, false}, {"invalid previous connection is in TRYOPEN", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // open init chainA connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) @@ -251,14 +251,14 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { err = suite.coordinator.ConnOpenTry(suite.chainB, suite.chainA, connB, connA) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) // retrieve client state of chainA to pass as counterpartyClient counterpartyClient = suite.chainA.GetClientState(clientA) }, false}, {"invalid previous connection has invalid versions", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // open init chainA connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) @@ -277,7 +277,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { suite.chainB.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainB.GetContext(), connB.ID, connection) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) // retrieve client state of chainA to pass as counterpartyClient @@ -353,7 +353,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { expPass bool }{ {"success", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -364,7 +364,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { counterpartyClient = suite.chainB.GetClientState(clientB) }, true}, {"success with empty stored counterparty connection ID", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -381,10 +381,10 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.chainA.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainA.GetContext(), connA.ID, connection) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) // retrieve client state of chainB to pass as counterpartyClient @@ -392,7 +392,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { }, true}, {"success from tryopen", func() { // chainA is in TRYOPEN, chainB is in TRYOPEN - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connB, connA, err := suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) suite.Require().NoError(err) @@ -404,16 +404,16 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { connection.State = types.TRYOPEN suite.chainB.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainB.GetContext(), connB.ID, connection) // update clientB so state change is committed - suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) // retrieve client state of chainB to pass as counterpartyClient counterpartyClient = suite.chainB.GetClientState(clientB) }, true}, {"success from tryopen with empty stored connection id", func() { // chainA is in TRYOPEN, chainB is in TRYOPEN - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connB, connA, err := suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) suite.Require().NoError(err) @@ -435,15 +435,15 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.chainA.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainA.GetContext(), connA.ID, connection) // update clientB so state change is committed - suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) // retrieve client state of chainB to pass as counterpartyClient counterpartyClient = suite.chainB.GetClientState(clientB) }, true}, {"invalid counterparty client", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -461,7 +461,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.Require().NoError(err) }, false}, {"consensus height >= latest height", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -475,13 +475,13 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { }, false}, {"connection not found", func() { // connections are never created - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // retrieve client state of chainB to pass as counterpartyClient counterpartyClient = suite.chainB.GetClientState(clientB) }, false}, {"invalid counterparty connection ID", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -499,15 +499,15 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.chainA.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainA.GetContext(), connA.ID, connection) - err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) }, false}, {"connection state is not INIT", func() { // connection state is already OPEN on chainA - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -522,7 +522,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { }, false}, {"connection is in INIT but the proposed version is invalid", func() { // chainA is in INIT, chainB is in TRYOPEN - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -536,7 +536,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { }, false}, {"connection is in TRYOPEN but the set version in the connection is invalid", func() { // chainA is in TRYOPEN, chainB is in TRYOPEN - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connB, connA, err := suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) suite.Require().NoError(err) @@ -549,8 +549,8 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.chainB.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainB.GetContext(), connB.ID, connection) // update clientB so state change is committed - suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) // retrieve client state of chainB to pass as counterpartyClient counterpartyClient = suite.chainB.GetClientState(clientB) @@ -558,7 +558,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { version = types.NewVersion("2.0", nil) }, false}, {"incompatible IBC versions", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -572,7 +572,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { version = types.NewVersion("2.0", nil) }, false}, {"empty version", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -585,7 +585,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { version = &types.Version{} }, false}, {"feature set verification failed - unsupported feature", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -598,7 +598,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { version = types.NewVersion(types.DefaultIBCVersionIdentifier, []string{"ORDER_ORDERED", "ORDER_UNORDERED", "ORDER_DAG"}) }, false}, {"self consensus state not found", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -612,7 +612,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { }, false}, {"connection state verification failed", func() { // chainB connection is not in INIT - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -620,7 +620,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { counterpartyClient = suite.chainB.GetClientState(clientB) }, false}, {"client state verification failed", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -636,7 +636,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.Require().NoError(err) }, false}, {"consensus state verification failed", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -717,7 +717,7 @@ func (suite *KeeperTestSuite) TestConnOpenConfirm() { expPass bool }{ {"success", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -729,15 +729,15 @@ func (suite *KeeperTestSuite) TestConnOpenConfirm() { }, true}, {"connection not found", func() { // connections are never created - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) }, false}, {"chain B's connection state is not TRYOPEN", func() { // connections are OPEN - clientA, clientB, _, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, _, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) }, false}, {"connection state verification failed", func() { // chainA is in INIT - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -779,7 +779,7 @@ func (suite *KeeperTestSuite) TestConnOpenConfirm() { // package. func (suite *KeeperTestSuite) TestConsensusParamsValidation() { // invalid client state in ConnOpenTry - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -804,7 +804,7 @@ func (suite *KeeperTestSuite) TestConsensusParamsValidation() { suite.SetupTest() // reset // invalid client state in ConnOpenAck - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err = suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) diff --git a/x/ibc/core/03-connection/keeper/keeper_test.go b/x/ibc/core/03-connection/keeper/keeper_test.go index 3ae867a5a0a..cf8f447179f 100644 --- a/x/ibc/core/03-connection/keeper/keeper_test.go +++ b/x/ibc/core/03-connection/keeper/keeper_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/x/ibc/core/03-connection/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -31,7 +32,7 @@ func TestKeeperTestSuite(t *testing.T) { } func (suite *KeeperTestSuite) TestSetAndGetConnection() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA := suite.chainA.GetFirstTestConnection(clientA, clientB) _, existed := suite.chainA.App.IBCKeeper.ConnectionKeeper.GetConnection(suite.chainA.GetContext(), connA.ID) suite.Require().False(existed) @@ -42,7 +43,7 @@ func (suite *KeeperTestSuite) TestSetAndGetConnection() { } func (suite *KeeperTestSuite) TestSetAndGetClientConnectionPaths() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, existed := suite.chainA.App.IBCKeeper.ConnectionKeeper.GetClientConnectionPaths(suite.chainA.GetContext(), clientA) suite.False(existed) @@ -55,7 +56,7 @@ func (suite *KeeperTestSuite) TestSetAndGetClientConnectionPaths() { // create 2 connections: A0 - B0, A1 - B1 func (suite KeeperTestSuite) TestGetAllConnections() { - clientA, clientB, connA0, connB0 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA0, connB0 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connA1, connB1 := suite.coordinator.CreateConnection(suite.chainA, suite.chainB, clientA, clientB) counterpartyB0 := types.NewCounterparty(clientB, connB0.ID, suite.chainB.GetPrefix()) // connection B0 @@ -77,8 +78,8 @@ func (suite KeeperTestSuite) TestGetAllConnections() { // the test creates 2 clients clientA0 and clientA1. clientA0 has a single // connection and clientA1 has 2 connections. func (suite KeeperTestSuite) TestGetAllClientConnectionPaths() { - clientA0, _, connA0, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) - clientA1, clientB1, connA1, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA0, _, connA0, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) + clientA1, clientB1, connA1, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connA2, _ := suite.coordinator.CreateConnection(suite.chainA, suite.chainB, clientA1, clientB1) expPaths := []types.ConnectionPaths{ @@ -102,7 +103,7 @@ func (suite *KeeperTestSuite) TestGetTimestampAtHeight() { expPass bool }{ {"verification success", func() { - _, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connection = suite.chainA.GetConnection(connA) }, true}, {"consensus state not found", func() { diff --git a/x/ibc/core/03-connection/keeper/verify_test.go b/x/ibc/core/03-connection/keeper/verify_test.go index c9db5cc2bf0..ace373e12a9 100644 --- a/x/ibc/core/03-connection/keeper/verify_test.go +++ b/x/ibc/core/03-connection/keeper/verify_test.go @@ -38,7 +38,7 @@ func (suite *KeeperTestSuite) TestVerifyClientState() { suite.Run(tc.msg, func() { suite.SetupTest() // reset - _, clientB, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, clientB, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) counterpartyClient, clientProof := suite.chainB.QueryClientStateProof(clientB) proofHeight := clienttypes.NewHeight(0, uint64(suite.chainB.GetContext().BlockHeight()-1)) @@ -83,20 +83,20 @@ func (suite *KeeperTestSuite) TestVerifyClientConsensusState() { expPass bool }{ {"verification success", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) }, true}, {"client state not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) changeClientID = true }, false}, {"consensus state not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) heightDiff = 5 }, false}, {"verification failed", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) clientB := connB.ClientID clientState := suite.chainB.GetClientState(clientB) @@ -170,7 +170,7 @@ func (suite *KeeperTestSuite) TestVerifyConnectionState() { suite.Run(tc.msg, func() { suite.SetupTest() // reset - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connection := suite.chainA.GetConnection(connA) if tc.changeClientID { @@ -402,7 +402,7 @@ func (suite *KeeperTestSuite) TestVerifyPacketReceiptAbsence() { } else { // need to update height to prove absence suite.coordinator.CommitBlock(suite.chainA, suite.chainB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) } packetReceiptKey := host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) diff --git a/x/ibc/core/04-channel/keeper/grpc_query_test.go b/x/ibc/core/04-channel/keeper/grpc_query_test.go index 031b89cc103..9e96d2b2fac 100644 --- a/x/ibc/core/04-channel/keeper/grpc_query_test.go +++ b/x/ibc/core/04-channel/keeper/grpc_query_test.go @@ -62,7 +62,7 @@ func (suite *KeeperTestSuite) TestQueryChannel() { { "success", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // init channel channelA, _, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -377,7 +377,7 @@ func (suite *KeeperTestSuite) TestQueryChannelClientState() { { "success", func() { - clientA, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // init channel channelA, _, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -505,7 +505,7 @@ func (suite *KeeperTestSuite) TestQueryChannelConsensusState() { { "success", func() { - clientA, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // init channel channelA, _, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) diff --git a/x/ibc/core/04-channel/keeper/handshake_test.go b/x/ibc/core/04-channel/keeper/handshake_test.go index cf391d0387e..857bba57d4e 100644 --- a/x/ibc/core/04-channel/keeper/handshake_test.go +++ b/x/ibc/core/04-channel/keeper/handshake_test.go @@ -32,7 +32,7 @@ func (suite *KeeperTestSuite) TestChanOpenInit() { testCases := []testCase{ {"success", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) features = []string{"ORDER_ORDERED", "ORDER_UNORDERED"} suite.chainA.CreatePortCapability(connA.NextTestChannel(ibctesting.MockPort).PortID) portCap = suite.chainA.GetPortCapability(connA.NextTestChannel(ibctesting.MockPort).PortID) @@ -46,12 +46,12 @@ func (suite *KeeperTestSuite) TestChanOpenInit() { suite.Require().NotNil(connB) }, false}, {"capability is incorrect", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) features = []string{"ORDER_ORDERED", "ORDER_UNORDERED"} portCap = capabilitytypes.NewCapability(3) }, false}, {"connection version not negotiated", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // modify connA versions conn := suite.chainA.GetConnection(connA) @@ -68,7 +68,7 @@ func (suite *KeeperTestSuite) TestChanOpenInit() { portCap = suite.chainA.GetPortCapability(connA.NextTestChannel(ibctesting.MockPort).PortID) }, false}, {"connection does not support ORDERED channels", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // modify connA versions to only support UNORDERED channels conn := suite.chainA.GetConnection(connA) @@ -145,21 +145,21 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { testCases := []testCase{ {"success", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.chainB.CreatePortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) portCap = suite.chainB.GetPortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) }, true}, {"success with crossing hello", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInitOnBothChains(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) portCap = suite.chainB.GetPortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) }, true}, {"success with empty counterparty chosen channel id", func() { var clientA, clientB string - clientA, clientB, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, _, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -168,17 +168,17 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { channel.Counterparty.ChannelId = "" suite.chainA.App.IBCKeeper.ChannelKeeper.SetChannel(suite.chainA.GetContext(), channelA.PortID, channelA.ID, channel) - err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) suite.chainB.CreatePortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) portCap = suite.chainB.GetPortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) }, true}, {"previous channel with invalid state", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // make previous channel have wrong ordering suite.coordinator.ChanOpenInit(suite.chainB, suite.chainA, connB, connA, ibctesting.MockPort, ibctesting.MockPort, types.UNORDERED) @@ -193,7 +193,7 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { portCap = suite.chainB.GetPortCapability(connB.FirstOrNextTestChannel(ibctesting.MockPort).PortID) }, false}, {"connection is not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // pass capability check suite.chainB.CreatePortCapability(connB.FirstOrNextTestChannel(ibctesting.MockPort).PortID) portCap = suite.chainB.GetPortCapability(connB.FirstOrNextTestChannel(ibctesting.MockPort).PortID) @@ -203,7 +203,7 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { suite.Require().NoError(err) }, false}, {"consensus state not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.chainB.CreatePortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) @@ -212,7 +212,7 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { heightDiff = 3 // consensus state doesn't exist at this height }, false}, {"counterparty chosen channel id does not match desired channel id", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, _, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -226,17 +226,17 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { }, false}, {"channel verification failed", func() { // not creating a channel on chainA will result in an invalid proof of existence - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) portCap = suite.chainB.GetPortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) }, false}, {"port capability not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) portCap = capabilitytypes.NewCapability(3) }, false}, {"connection version not negotiated", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) // modify connB versions @@ -253,7 +253,7 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { portCap = suite.chainB.GetPortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) }, false}, {"connection does not support ORDERED channels", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) // modify connA versions to only support UNORDERED channels @@ -329,7 +329,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { testCases := []testCase{ {"success", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -339,7 +339,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, true}, {"success with empty stored counterparty channel ID", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -365,7 +365,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"connection not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -380,7 +380,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { suite.chainA.App.IBCKeeper.ChannelKeeper.SetChannel(suite.chainA.GetContext(), channelA.PortID, channelA.ID, channel) }, false}, {"connection is not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) var err error connA, connB, err = suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) @@ -394,7 +394,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"consensus state not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -406,7 +406,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { heightDiff = 3 // consensus state doesn't exist at this height }, false}, {"invalid counterparty channel identifier", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -419,7 +419,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { }, false}, {"channel verification failed", func() { // chainB is INIT, chainA in TRYOPEN - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelB, channelA, err := suite.coordinator.ChanOpenInit(suite.chainB, suite.chainA, connB, connA, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -429,7 +429,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"channel capability not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -484,7 +484,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { ) testCases := []testCase{ {"success", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -504,7 +504,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { channelCap = suite.chainB.GetChannelCapability(channelB.PortID, channelB.ID) }, false}, {"connection not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -522,7 +522,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { suite.chainB.App.IBCKeeper.ChannelKeeper.SetChannel(suite.chainB.GetContext(), channelB.PortID, channelB.ID, channel) }, false}, {"connection is not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) var err error connA, connB, err = suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) @@ -532,7 +532,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { channelCap = suite.chainB.GetChannelCapability(channelB.PortID, channelB.ID) }, false}, {"consensus state not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -548,7 +548,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { }, false}, {"channel verification failed", func() { // chainA is INIT, chainB in TRYOPEN - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -558,7 +558,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { channelCap = suite.chainB.GetChannelCapability(channelB.PortID, channelB.ID) }, false}, {"channel capability not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -645,7 +645,7 @@ func (suite *KeeperTestSuite) TestChanCloseInit() { suite.chainA.App.IBCKeeper.ChannelKeeper.SetChannel(suite.chainA.GetContext(), channelA.PortID, channelA.ID, channel) }, false}, {"connection is not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) var err error connA, connB, err = suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) @@ -734,7 +734,7 @@ func (suite *KeeperTestSuite) TestChanCloseConfirm() { suite.chainB.App.IBCKeeper.ChannelKeeper.SetChannel(suite.chainB.GetContext(), channelB.PortID, channelB.ID, channel) }, false}, {"connection is not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) var err error connB, connA, err = suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) diff --git a/x/ibc/core/04-channel/keeper/keeper_test.go b/x/ibc/core/04-channel/keeper/keeper_test.go index 01f7a758496..d1ea3de5da9 100644 --- a/x/ibc/core/04-channel/keeper/keeper_test.go +++ b/x/ibc/core/04-channel/keeper/keeper_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -39,7 +40,7 @@ func (suite *KeeperTestSuite) SetupTest() { // and existence of a channel in INIT on chainA. func (suite *KeeperTestSuite) TestSetChannel() { // create client and connections on both chains - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // check for channel to be created on chainB channelA := connA.NextTestChannel(ibctesting.MockPort) diff --git a/x/ibc/core/04-channel/keeper/packet_test.go b/x/ibc/core/04-channel/keeper/packet_test.go index f3624897dde..f04b6ac1006 100644 --- a/x/ibc/core/04-channel/keeper/packet_test.go +++ b/x/ibc/core/04-channel/keeper/packet_test.go @@ -130,7 +130,7 @@ func (suite *KeeperTestSuite) TestSendPacket() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"next sequence send not found", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA := connA.NextTestChannel(ibctesting.TransferPort) channelB := connB.NextTestChannel(ibctesting.TransferPort) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, disabledTimeoutTimestamp) @@ -276,7 +276,7 @@ func (suite *KeeperTestSuite) TestRecvPacket() { channelCap = suite.chainB.GetChannelCapability(channelB.PortID, channelB.ID) }, false}, {"connection not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // connection on chainB is in INIT connB, connA, err := suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) suite.Require().NoError(err) @@ -304,7 +304,7 @@ func (suite *KeeperTestSuite) TestRecvPacket() { channelCap = suite.chainB.GetChannelCapability(channelB.PortID, channelB.ID) }, false}, {"next receive sequence is not found", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA := connA.NextTestChannel(ibctesting.TransferPort) channelB := connB.NextTestChannel(ibctesting.TransferPort) @@ -548,7 +548,7 @@ func (suite *KeeperTestSuite) TestAcknowledgePacket() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"connection not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // connection on chainA is in INIT connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -581,7 +581,7 @@ func (suite *KeeperTestSuite) TestAcknowledgePacket() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"next ack sequence not found", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA := connA.NextTestChannel(ibctesting.TransferPort) channelB := connB.NextTestChannel(ibctesting.TransferPort) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, disabledTimeoutTimestamp) diff --git a/x/ibc/core/04-channel/keeper/timeout_test.go b/x/ibc/core/04-channel/keeper/timeout_test.go index 2ff49758266..640452e881b 100644 --- a/x/ibc/core/04-channel/keeper/timeout_test.go +++ b/x/ibc/core/04-channel/keeper/timeout_test.go @@ -29,7 +29,7 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), uint64(suite.chainB.GetContext().BlockTime().UnixNano())) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, true}, {"success: UNORDERED", func() { ordered = false @@ -38,7 +38,7 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), disabledTimeoutTimestamp) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, true}, {"channel not found", func() { // use wrong channel naming @@ -77,7 +77,7 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { clientA, clientB, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, types.ORDERED) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, disabledTimeoutTimestamp) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, false}, {"packet already received ", func() { ordered = true @@ -86,12 +86,12 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { clientA, clientB, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, types.ORDERED) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, uint64(suite.chainB.GetContext().BlockTime().UnixNano())) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, false}, {"packet hasn't been sent", func() { clientA, _, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, types.ORDERED) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, uint64(suite.chainB.GetContext().BlockTime().UnixNano())) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, false}, {"next seq receive verification failed", func() { // set ordered to false resulting in wrong proof provided @@ -100,7 +100,7 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { clientA, clientB, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, types.ORDERED) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), disabledTimeoutTimestamp) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, false}, {"packet ack verification failed", func() { // set ordered to true resulting in wrong proof provided @@ -109,7 +109,7 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { clientA, clientB, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, types.UNORDERED) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), disabledTimeoutTimestamp) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, false}, } @@ -213,7 +213,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, true}, @@ -224,7 +224,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, true}, @@ -273,7 +273,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, @@ -291,7 +291,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), uint64(suite.chainB.GetContext().BlockTime().UnixNano())) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"packet ack verification failed", func() { @@ -301,7 +301,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), disabledTimeoutTimestamp) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"channel capability not found", func() { @@ -311,7 +311,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = capabilitytypes.NewCapability(100) }, false}, diff --git a/x/ibc/core/exported/client.go b/x/ibc/core/exported/client.go index e5b38a05984..8c7e89b33e7 100644 --- a/x/ibc/core/exported/client.go +++ b/x/ibc/core/exported/client.go @@ -12,9 +12,15 @@ const ( // TypeClientMisbehaviour is the shared evidence misbehaviour type TypeClientMisbehaviour string = "client_misbehaviour" + // Solomachine is used to indicate that the light client is a solo machine. + Solomachine string = "06-solomachine" + + // Tendermint is used to indicate that the client uses the Tendermint Consensus Algorithm. + Tendermint string = "07-tendermint" + // Localhost is the client type for a localhost client. It is also used as the clientID // for the localhost client. - Localhost string = "localhost" + Localhost string = "09-localhost" ) // ClientState defines the required common functions for light clients. diff --git a/x/ibc/core/genesis_test.go b/x/ibc/core/genesis_test.go index d4cf1ec3aab..5290c478973 100644 --- a/x/ibc/core/genesis_test.go +++ b/x/ibc/core/genesis_test.go @@ -96,6 +96,7 @@ func (suite *IBCTestSuite) TestValidateGenesis() { }, ), }, + clienttypes.NewParams(exported.Tendermint, exported.Localhost), true, ), ConnectionGenesis: connectiontypes.NewGenesisState( @@ -150,6 +151,7 @@ func (suite *IBCTestSuite) TestValidateGenesis() { ), }, nil, + clienttypes.NewParams(exported.Tendermint), false, ), ConnectionGenesis: connectiontypes.DefaultGenesisState(), @@ -233,6 +235,7 @@ func (suite *IBCTestSuite) TestInitGenesis() { }, ), }, + clienttypes.NewParams(exported.Tendermint, exported.Localhost), true, ), ConnectionGenesis: connectiontypes.NewGenesisState( @@ -295,8 +298,8 @@ func (suite *IBCTestSuite) TestExportGenesis() { // creates clients suite.coordinator.Setup(suite.chainA, suite.chainB, channeltypes.UNORDERED) // create extra clients - suite.coordinator.CreateClient(suite.chainA, suite.chainB, ibctesting.Tendermint) - suite.coordinator.CreateClient(suite.chainA, suite.chainB, ibctesting.Tendermint) + suite.coordinator.CreateClient(suite.chainA, suite.chainB, exported.Tendermint) + suite.coordinator.CreateClient(suite.chainA, suite.chainB, exported.Tendermint) }, }, } diff --git a/x/ibc/core/keeper/grpc_query.go b/x/ibc/core/keeper/grpc_query.go index e7dbe261093..f406d2e86f0 100644 --- a/x/ibc/core/keeper/grpc_query.go +++ b/x/ibc/core/keeper/grpc_query.go @@ -28,6 +28,11 @@ func (q Keeper) ConsensusStates(c context.Context, req *clienttypes.QueryConsens return q.ClientKeeper.ConsensusStates(c, req) } +// ClientParams implements the IBC QueryServer interface +func (q Keeper) ClientParams(c context.Context, req *clienttypes.QueryClientParamsRequest) (*clienttypes.QueryClientParamsResponse, error) { + return q.ClientKeeper.ClientParams(c, req) +} + // Connection implements the IBC QueryServer interface func (q Keeper) Connection(c context.Context, req *connectiontypes.QueryConnectionRequest) (*connectiontypes.QueryConnectionResponse, error) { return q.ConnectionKeeper.Connection(c, req) diff --git a/x/ibc/core/keeper/keeper.go b/x/ibc/core/keeper/keeper.go index e9b7a0f1e56..5f9abc382ec 100644 --- a/x/ibc/core/keeper/keeper.go +++ b/x/ibc/core/keeper/keeper.go @@ -11,6 +11,7 @@ import ( portkeeper "github.com/cosmos/cosmos-sdk/x/ibc/core/05-port/keeper" porttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/05-port/types" "github.com/cosmos/cosmos-sdk/x/ibc/core/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" ) var _ types.QueryServer = (*Keeper)(nil) @@ -31,9 +32,10 @@ type Keeper struct { // NewKeeper creates a new ibc Keeper func NewKeeper( - cdc codec.BinaryMarshaler, key sdk.StoreKey, stakingKeeper clienttypes.StakingKeeper, scopedKeeper capabilitykeeper.ScopedKeeper, + cdc codec.BinaryMarshaler, key sdk.StoreKey, paramSpace paramtypes.Subspace, + stakingKeeper clienttypes.StakingKeeper, scopedKeeper capabilitykeeper.ScopedKeeper, ) *Keeper { - clientKeeper := clientkeeper.NewKeeper(cdc, key, stakingKeeper) + clientKeeper := clientkeeper.NewKeeper(cdc, key, paramSpace, stakingKeeper) connectionKeeper := connectionkeeper.NewKeeper(cdc, key, clientKeeper) portKeeper := portkeeper.NewKeeper(scopedKeeper) channelKeeper := channelkeeper.NewKeeper(cdc, key, clientKeeper, connectionKeeper, portKeeper, scopedKeeper) diff --git a/x/ibc/core/keeper/msg_server_test.go b/x/ibc/core/keeper/msg_server_test.go index 5c4aa466a1a..497a806caa9 100644 --- a/x/ibc/core/keeper/msg_server_test.go +++ b/x/ibc/core/keeper/msg_server_test.go @@ -331,7 +331,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { suite.Require().NoError(err) // need to update chainA client to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) }, true}, @@ -344,7 +344,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { suite.Require().NoError(err) // need to update chainA client to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) }, true}, @@ -362,7 +362,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { suite.Require().NoError(err) } - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) }, true}, {"success: ORDERED timeout out of order packet", func() { @@ -378,7 +378,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { suite.Require().NoError(err) } - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) }, true}, @@ -458,7 +458,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { suite.Require().NoError(err) // need to update chainA client to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) @@ -479,7 +479,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { suite.Require().NoError(err) // need to update chainA client to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) @@ -505,7 +505,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { suite.Require().NoError(err) } - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) // close counterparty channel @@ -529,7 +529,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { suite.Require().NoError(err) } - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) // close counterparty channel @@ -568,7 +568,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { suite.Require().NoError(err) // need to update chainA client to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) }, false}, @@ -639,7 +639,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -689,7 +689,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) msg, err = clienttypes.NewMsgUpgradeClient(clientA, upgradedClient, upgradeHeight, nil, suite.chainA.SenderAccount.GetAddress()) @@ -701,7 +701,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { for _, tc := range cases { tc := tc - clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) tc.setup() diff --git a/x/ibc/core/spec/07_params.md b/x/ibc/core/spec/07_params.md new file mode 100644 index 00000000000..67e79ef81dd --- /dev/null +++ b/x/ibc/core/spec/07_params.md @@ -0,0 +1,21 @@ + + +# Parameters + +## Clients + +The ibc clients contain the following parameters: + +| Key | Type | Default Value | +|------------------|------|---------------| +| `AllowedClients` | []string | `"06-solomachine","07-tendermint"` | + +### AllowedClients + +The allowed clients parameter defines an allowlist of client types supported by the chain. A client +that is not registered on this list will fail upon creation or on genesis validation. Note that, +since the client type is an arbitrary string, chains they must not register two light clients which +return the same value for the `ClientType()` function, otherwise the allowlist check can be +bypassed. diff --git a/x/ibc/core/spec/README.md b/x/ibc/core/spec/README.md index 0ae00bbcda0..f6de9749b5e 100644 --- a/x/ibc/core/spec/README.md +++ b/x/ibc/core/spec/README.md @@ -23,3 +23,4 @@ For the general specification please refer to the [Interchain Standards](https:/ 4. **[Messages](04_messages.md)** 5. **[Callbacks](05_callbacks.md)** 6. **[Events](06_events.md)** +7. **[Params](07_params.md)** diff --git a/x/ibc/light-clients/06-solomachine/types/client_state.go b/x/ibc/light-clients/06-solomachine/types/client_state.go index 05ed359baf8..34cb91964bc 100644 --- a/x/ibc/light-clients/06-solomachine/types/client_state.go +++ b/x/ibc/light-clients/06-solomachine/types/client_state.go @@ -16,9 +16,6 @@ import ( var _ exported.ClientState = (*ClientState)(nil) -// SoloMachine is used to indicate that the light client is a solo machine. -const SoloMachine string = "Solo Machine" - // NewClientState creates a new ClientState instance. func NewClientState(latestSequence uint64, consensusState *ConsensusState, allowUpdateAfterProposal bool) *ClientState { return &ClientState{ @@ -31,7 +28,7 @@ func NewClientState(latestSequence uint64, consensusState *ConsensusState, allow // ClientType is Solo Machine. func (cs ClientState) ClientType() string { - return SoloMachine + return exported.Solomachine } // GetLatestHeight returns the latest sequence number. diff --git a/x/ibc/light-clients/06-solomachine/types/client_state_test.go b/x/ibc/light-clients/06-solomachine/types/client_state_test.go index f2daca5ae32..597adff345d 100644 --- a/x/ibc/light-clients/06-solomachine/types/client_state_test.go +++ b/x/ibc/light-clients/06-solomachine/types/client_state_test.go @@ -82,7 +82,7 @@ func (suite *SoloMachineTestSuite) TestClientStateValidateBasic() { func (suite *SoloMachineTestSuite) TestVerifyClientState() { // create client for tendermint so we can use client state for verification - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) path := suite.solomachine.GetClientStatePath(counterpartyClientIdentifier) @@ -208,7 +208,7 @@ func (suite *SoloMachineTestSuite) TestVerifyClientState() { func (suite *SoloMachineTestSuite) TestVerifyClientConsensusState() { // create client for tendermint so we can use consensus state for verification - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) consensusState, found := suite.chainA.GetConsensusState(clientA, clientState.GetLatestHeight()) suite.Require().True(found) diff --git a/x/ibc/light-clients/06-solomachine/types/consensus_state.go b/x/ibc/light-clients/06-solomachine/types/consensus_state.go index cebd399ffae..1cc95caf08e 100644 --- a/x/ibc/light-clients/06-solomachine/types/consensus_state.go +++ b/x/ibc/light-clients/06-solomachine/types/consensus_state.go @@ -13,7 +13,7 @@ var _ exported.ConsensusState = ConsensusState{} // ClientType returns Solo Machine type. func (ConsensusState) ClientType() string { - return SoloMachine + return exported.Solomachine } // GetTimestamp returns zero. diff --git a/x/ibc/light-clients/06-solomachine/types/consensus_state_test.go b/x/ibc/light-clients/06-solomachine/types/consensus_state_test.go index 820e8124628..e0c22f95957 100644 --- a/x/ibc/light-clients/06-solomachine/types/consensus_state_test.go +++ b/x/ibc/light-clients/06-solomachine/types/consensus_state_test.go @@ -1,6 +1,7 @@ package types_test import ( + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/06-solomachine/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -8,7 +9,7 @@ import ( func (suite *SoloMachineTestSuite) TestConsensusState() { consensusState := suite.solomachine.ConsensusState() - suite.Require().Equal(types.SoloMachine, consensusState.ClientType()) + suite.Require().Equal(exported.Solomachine, consensusState.ClientType()) suite.Require().Equal(suite.solomachine.Time, consensusState.GetTimestamp()) suite.Require().Nil(consensusState.GetRoot()) } diff --git a/x/ibc/light-clients/06-solomachine/types/header.go b/x/ibc/light-clients/06-solomachine/types/header.go index cb2b55b4f82..dc43cee4f7f 100644 --- a/x/ibc/light-clients/06-solomachine/types/header.go +++ b/x/ibc/light-clients/06-solomachine/types/header.go @@ -13,7 +13,7 @@ var _ exported.Header = Header{} // ClientType defines that the Header is a Solo Machine. func (Header) ClientType() string { - return SoloMachine + return exported.Solomachine } // GetHeight returns the current sequence number as the height. diff --git a/x/ibc/light-clients/06-solomachine/types/header_test.go b/x/ibc/light-clients/06-solomachine/types/header_test.go index e456f9e9668..a5ca45e8aa8 100644 --- a/x/ibc/light-clients/06-solomachine/types/header_test.go +++ b/x/ibc/light-clients/06-solomachine/types/header_test.go @@ -1,6 +1,7 @@ package types_test import ( + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/06-solomachine/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -78,7 +79,7 @@ func (suite *SoloMachineTestSuite) TestHeaderValidateBasic() { }, } - suite.Require().Equal(types.SoloMachine, header.ClientType()) + suite.Require().Equal(exported.Solomachine, header.ClientType()) for _, tc := range cases { tc := tc diff --git a/x/ibc/light-clients/06-solomachine/types/misbehaviour.go b/x/ibc/light-clients/06-solomachine/types/misbehaviour.go index 1f97f323ce8..66ee6d93920 100644 --- a/x/ibc/light-clients/06-solomachine/types/misbehaviour.go +++ b/x/ibc/light-clients/06-solomachine/types/misbehaviour.go @@ -17,7 +17,7 @@ var ( // ClientType is a Solo Machine light client. func (misbehaviour Misbehaviour) ClientType() string { - return SoloMachine + return exported.Solomachine } // GetClientID returns the ID of the client that committed a misbehaviour. diff --git a/x/ibc/light-clients/06-solomachine/types/misbehaviour_test.go b/x/ibc/light-clients/06-solomachine/types/misbehaviour_test.go index 311dc8d8c85..a976186eaba 100644 --- a/x/ibc/light-clients/06-solomachine/types/misbehaviour_test.go +++ b/x/ibc/light-clients/06-solomachine/types/misbehaviour_test.go @@ -1,6 +1,7 @@ package types_test import ( + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/06-solomachine/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -8,7 +9,7 @@ import ( func (suite *SoloMachineTestSuite) TestMisbehaviour() { misbehaviour := suite.solomachine.CreateMisbehaviour() - suite.Require().Equal(types.SoloMachine, misbehaviour.ClientType()) + suite.Require().Equal(exported.Solomachine, misbehaviour.ClientType()) suite.Require().Equal(suite.solomachine.ClientID, misbehaviour.GetClientID()) suite.Require().Equal(uint64(0), misbehaviour.GetHeight().GetVersionNumber()) suite.Require().Equal(suite.solomachine.Sequence, misbehaviour.GetHeight().GetVersionHeight()) diff --git a/x/ibc/light-clients/06-solomachine/types/solomachine_test.go b/x/ibc/light-clients/06-solomachine/types/solomachine_test.go index 53f5c4a48cd..b3b647d829a 100644 --- a/x/ibc/light-clients/06-solomachine/types/solomachine_test.go +++ b/x/ibc/light-clients/06-solomachine/types/solomachine_test.go @@ -41,7 +41,7 @@ func (suite *SoloMachineTestSuite) SetupTest() { suite.solomachine = ibctesting.NewSolomachine(suite.T(), suite.chainA.Codec, "solomachinesingle", "testing", 1) suite.solomachineMulti = ibctesting.NewSolomachine(suite.T(), suite.chainA.Codec, "solomachinemulti", "testing", 4) - suite.store = suite.chainA.App.IBCKeeper.ClientKeeper.ClientStore(suite.chainA.GetContext(), types.SoloMachine) + suite.store = suite.chainA.App.IBCKeeper.ClientKeeper.ClientStore(suite.chainA.GetContext(), exported.Solomachine) } func TestSoloMachineTestSuite(t *testing.T) { diff --git a/x/ibc/light-clients/07-tendermint/types/client_state.go b/x/ibc/light-clients/07-tendermint/types/client_state.go index 3940d44b7f1..68073044688 100644 --- a/x/ibc/light-clients/07-tendermint/types/client_state.go +++ b/x/ibc/light-clients/07-tendermint/types/client_state.go @@ -22,9 +22,6 @@ import ( var _ exported.ClientState = (*ClientState)(nil) -// Tendermint is used to indicate that the client uses the Tendermint Consensus Algorithm. -const Tendermint string = "Tendermint" - // NewClientState creates a new ClientState instance func NewClientState( chainID string, trustLevel Fraction, @@ -55,7 +52,7 @@ func (cs ClientState) GetChainID() string { // ClientType is tendermint. func (cs ClientState) ClientType() string { - return Tendermint + return exported.Tendermint } // GetLatestHeight returns latest block height. diff --git a/x/ibc/light-clients/07-tendermint/types/client_state_test.go b/x/ibc/light-clients/07-tendermint/types/client_state_test.go index 90ff6767f09..dc662da8fd4 100644 --- a/x/ibc/light-clients/07-tendermint/types/client_state_test.go +++ b/x/ibc/light-clients/07-tendermint/types/client_state_test.go @@ -554,7 +554,7 @@ func (suite *TendermintTestSuite) TestVerifyPacketReceiptAbsence() { suite.Require().NoError(err) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) var ok bool clientStateI := suite.chainA.GetClientState(clientA) @@ -645,7 +645,7 @@ func (suite *TendermintTestSuite) TestVerifyNextSeqRecv() { suite.Require().NoError(err) // need to update chainA's client representing chainB - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) var ok bool clientStateI := suite.chainA.GetClientState(clientA) diff --git a/x/ibc/light-clients/07-tendermint/types/consensus_state.go b/x/ibc/light-clients/07-tendermint/types/consensus_state.go index 0a8981281c1..d55bc113054 100644 --- a/x/ibc/light-clients/07-tendermint/types/consensus_state.go +++ b/x/ibc/light-clients/07-tendermint/types/consensus_state.go @@ -26,7 +26,7 @@ func NewConsensusState( // ClientType returns Tendermint func (ConsensusState) ClientType() string { - return Tendermint + return exported.Tendermint } // GetRoot returns the commitment Root for the specific diff --git a/x/ibc/light-clients/07-tendermint/types/consensus_state_test.go b/x/ibc/light-clients/07-tendermint/types/consensus_state_test.go index a3a8b154a6d..313815d0c7b 100644 --- a/x/ibc/light-clients/07-tendermint/types/consensus_state_test.go +++ b/x/ibc/light-clients/07-tendermint/types/consensus_state_test.go @@ -4,6 +4,7 @@ import ( "time" commitmenttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/23-commitment/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ) @@ -54,13 +55,15 @@ func (suite *TendermintTestSuite) TestConsensusStateValidateBasic() { for i, tc := range testCases { tc := tc - suite.Require().Equal(tc.consensusState.ClientType(), types.Tendermint) + // check just to increase coverage + suite.Require().Equal(exported.Tendermint, tc.consensusState.ClientType()) suite.Require().Equal(tc.consensusState.GetRoot(), tc.consensusState.Root) + err := tc.consensusState.ValidateBasic() if tc.expectPass { - suite.Require().NoError(tc.consensusState.ValidateBasic(), "valid test case %d failed: %s", i, tc.msg) + suite.Require().NoError(err, "valid test case %d failed: %s", i, tc.msg) } else { - suite.Require().Error(tc.consensusState.ValidateBasic(), "invalid test case %d passed: %s", i, tc.msg) + suite.Require().Error(err, "invalid test case %d passed: %s", i, tc.msg) } } } diff --git a/x/ibc/light-clients/07-tendermint/types/header.go b/x/ibc/light-clients/07-tendermint/types/header.go index 86e166caf54..e128abea1c5 100644 --- a/x/ibc/light-clients/07-tendermint/types/header.go +++ b/x/ibc/light-clients/07-tendermint/types/header.go @@ -25,7 +25,7 @@ func (h Header) ConsensusState() *ConsensusState { // ClientType defines that the Header is a Tendermint consensus algorithm func (h Header) ClientType() string { - return Tendermint + return exported.Tendermint } // GetHeight returns the current height. It returns 0 if the tendermint diff --git a/x/ibc/light-clients/07-tendermint/types/header_test.go b/x/ibc/light-clients/07-tendermint/types/header_test.go index 235e1f75844..cda3047be2f 100644 --- a/x/ibc/light-clients/07-tendermint/types/header_test.go +++ b/x/ibc/light-clients/07-tendermint/types/header_test.go @@ -6,6 +6,7 @@ import ( tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ) @@ -63,7 +64,7 @@ func (suite *TendermintTestSuite) TestHeaderValidateBasic() { }, false}, } - suite.Require().Equal(types.Tendermint, suite.header.ClientType()) + suite.Require().Equal(exported.Tendermint, suite.header.ClientType()) for _, tc := range testCases { tc := tc diff --git a/x/ibc/light-clients/07-tendermint/types/misbehaviour.go b/x/ibc/light-clients/07-tendermint/types/misbehaviour.go index b1277110a28..c090ecb0b6e 100644 --- a/x/ibc/light-clients/07-tendermint/types/misbehaviour.go +++ b/x/ibc/light-clients/07-tendermint/types/misbehaviour.go @@ -27,12 +27,11 @@ func NewMisbehaviour(clientID, chainID string, header1, header2 *Header) *Misbeh Header1: header1, Header2: header2, } - } // ClientType is Tendermint light client func (misbehaviour Misbehaviour) ClientType() string { - return Tendermint + return exported.Tendermint } // GetClientID returns the ID of the client that committed a misbehaviour. diff --git a/x/ibc/light-clients/07-tendermint/types/misbehaviour_test.go b/x/ibc/light-clients/07-tendermint/types/misbehaviour_test.go index 6f70c4b716e..9d7cddff5cc 100644 --- a/x/ibc/light-clients/07-tendermint/types/misbehaviour_test.go +++ b/x/ibc/light-clients/07-tendermint/types/misbehaviour_test.go @@ -8,6 +8,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ibctestingmock "github.com/cosmos/cosmos-sdk/x/ibc/testing/mock" @@ -24,7 +25,7 @@ func (suite *TendermintTestSuite) TestMisbehaviour() { ClientId: clientID, } - suite.Require().Equal(types.Tendermint, misbehaviour.ClientType()) + suite.Require().Equal(exported.Tendermint, misbehaviour.ClientType()) suite.Require().Equal(clientID, misbehaviour.GetClientID()) suite.Require().Equal(height, misbehaviour.GetHeight()) } diff --git a/x/ibc/light-clients/07-tendermint/types/proposal_handle_test.go b/x/ibc/light-clients/07-tendermint/types/proposal_handle_test.go index 33c10854e70..062a29a0dcd 100644 --- a/x/ibc/light-clients/07-tendermint/types/proposal_handle_test.go +++ b/x/ibc/light-clients/07-tendermint/types/proposal_handle_test.go @@ -2,6 +2,7 @@ package types_test import ( clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -12,7 +13,7 @@ var ( // sanity checks func (suite *TendermintTestSuite) TestCheckProposedHeaderAndUpdateStateBasic() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA).(*types.ClientState) clientStore := suite.chainA.App.IBCKeeper.ClientKeeper.ClientStore(suite.chainA.GetContext(), clientA) @@ -201,7 +202,7 @@ func (suite *TendermintTestSuite) TestCheckProposedHeaderAndUpdateState() { suite.SetupTest() // reset // construct client state based on test case parameters - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA).(*types.ClientState) clientState.AllowUpdateAfterExpiry = tc.AllowUpdateAfterExpiry clientState.AllowUpdateAfterMisbehaviour = tc.AllowUpdateAfterMisbehaviour @@ -319,7 +320,7 @@ func (suite *TendermintTestSuite) TestCheckProposedHeader() { suite.Run(tc.name, func() { suite.SetupTest() // reset - clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState = suite.chainA.GetClientState(clientA).(*types.ClientState) clientState.AllowUpdateAfterExpiry = true clientState.AllowUpdateAfterMisbehaviour = false diff --git a/x/ibc/light-clients/07-tendermint/types/upgrade_test.go b/x/ibc/light-clients/07-tendermint/types/upgrade_test.go index f5debb01a6e..bb2108508d2 100644 --- a/x/ibc/light-clients/07-tendermint/types/upgrade_test.go +++ b/x/ibc/light-clients/07-tendermint/types/upgrade_test.go @@ -37,7 +37,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -63,7 +63,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { upgradedClient = types.NewClientState("newChainId", types.DefaultTrustLevel, ubdPeriod, ubdPeriod+trustingPeriod, maxClockDrift+5, newClientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), upgradePath, true, false) suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -93,7 +93,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -119,7 +119,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { upgradedClient = types.NewClientState("wrongchainID", types.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, newClientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), upgradePath, true, true) suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -141,7 +141,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { upgradedClient = types.NewClientState("newChainId", types.DefaultTrustLevel, ubdPeriod, ubdPeriod+trustingPeriod, maxClockDrift+5, upgradeHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), upgradePath, true, false) suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -198,7 +198,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -228,7 +228,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -258,7 +258,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -283,7 +283,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -304,7 +304,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) // expire chainB's client @@ -325,7 +325,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // reset suite suite.SetupTest() - clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) tc.setup() diff --git a/x/ibc/testing/chain.go b/x/ibc/testing/chain.go index 5886695efd0..bba056f4594 100644 --- a/x/ibc/testing/chain.go +++ b/x/ibc/testing/chain.go @@ -33,7 +33,6 @@ import ( host "github.com/cosmos/cosmos-sdk/x/ibc/core/24-host" "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/core/types" - solomachinetypes "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/06-solomachine/types" ibctmtypes "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" "github.com/cosmos/cosmos-sdk/x/ibc/testing/mock" "github.com/cosmos/cosmos-sdk/x/staking/teststaking" @@ -41,10 +40,6 @@ import ( ) const ( - // client types - Tendermint = ibctmtypes.Tendermint - SoloMachine = solomachinetypes.SoloMachine - // Default params constants used to create a TM client TrustingPeriod time.Duration = time.Hour * 24 * 7 * 2 UnbondingPeriod time.Duration = time.Hour * 24 * 7 * 3 @@ -432,7 +427,7 @@ func (chain *TestChain) ConstructMsgCreateClient(counterparty *TestChain, client ) switch clientType { - case Tendermint: + case exported.Tendermint: height := counterparty.LastHeader.GetHeight().(clienttypes.Height) clientState = ibctmtypes.NewClientState( counterparty.ChainID, DefaultTrustLevel, TrustingPeriod, UnbondingPeriod, MaxClockDrift, @@ -440,7 +435,7 @@ func (chain *TestChain) ConstructMsgCreateClient(counterparty *TestChain, client UpgradePath, false, false, ) consensusState = counterparty.LastHeader.ConsensusState() - case SoloMachine: + case exported.Solomachine: solo := NewSolomachine(chain.t, chain.Codec, clientID, "", 1) clientState = solo.ClientState() consensusState = solo.ConsensusState() @@ -459,7 +454,7 @@ func (chain *TestChain) ConstructMsgCreateClient(counterparty *TestChain, client // client will be created on the (target) chain. func (chain *TestChain) CreateTMClient(counterparty *TestChain, clientID string) error { // construct MsgCreateClient using counterparty - msg := chain.ConstructMsgCreateClient(counterparty, clientID, Tendermint) + msg := chain.ConstructMsgCreateClient(counterparty, clientID, exported.Tendermint) return chain.sendMsgs(msg) } diff --git a/x/ibc/testing/coordinator.go b/x/ibc/testing/coordinator.go index ce5c8607f5b..b1c6e99d3f0 100644 --- a/x/ibc/testing/coordinator.go +++ b/x/ibc/testing/coordinator.go @@ -49,7 +49,7 @@ func NewCoordinator(t *testing.T, n int) *Coordinator { func (coord *Coordinator) Setup( chainA, chainB *TestChain, order channeltypes.Order, ) (string, string, *TestConnection, *TestConnection, TestChannel, TestChannel) { - clientA, clientB, connA, connB := coord.SetupClientConnections(chainA, chainB, Tendermint) + clientA, clientB, connA, connB := coord.SetupClientConnections(chainA, chainB, exported.Tendermint) // channels can also be referenced through the returned connections channelA, channelB := coord.CreateMockChannels(chainA, chainB, connA, connB, order) @@ -98,7 +98,7 @@ func (coord *Coordinator) CreateClient( clientID = source.NewClientID(counterparty.ChainID) switch clientType { - case Tendermint: + case exported.Tendermint: err = source.CreateTMClient(counterparty, clientID) default: @@ -123,7 +123,7 @@ func (coord *Coordinator) UpdateClient( coord.CommitBlock(source, counterparty) switch clientType { - case Tendermint: + case exported.Tendermint: err = source.UpdateTMClient(counterparty, clientID) default: @@ -226,7 +226,7 @@ func (coord *Coordinator) SendPacket( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyClientID, Tendermint, + counterpartyClientID, exported.Tendermint, ) } @@ -262,7 +262,7 @@ func (coord *Coordinator) WriteAcknowledgement( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyClientID, Tendermint, + counterpartyClientID, exported.Tendermint, ) } @@ -327,7 +327,7 @@ func (coord *Coordinator) SendMsgs(source, counterparty *TestChain, counterparty // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyClientID, Tendermint, + counterpartyClientID, exported.Tendermint, ) } @@ -386,7 +386,7 @@ func (coord *Coordinator) ConnOpenInit( // update source client on counterparty connection if err := coord.UpdateClient( counterparty, source, - counterpartyClientID, Tendermint, + counterpartyClientID, exported.Tendermint, ); err != nil { return sourceConnection, counterpartyConnection, err } @@ -409,7 +409,7 @@ func (coord *Coordinator) ConnOpenTry( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyConnection.ClientID, Tendermint, + counterpartyConnection.ClientID, exported.Tendermint, ) } @@ -428,7 +428,7 @@ func (coord *Coordinator) ConnOpenAck( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyConnection.ClientID, Tendermint, + counterpartyConnection.ClientID, exported.Tendermint, ) } @@ -446,7 +446,7 @@ func (coord *Coordinator) ConnOpenConfirm( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyConnection.ClientID, Tendermint, + counterpartyConnection.ClientID, exported.Tendermint, ) } @@ -478,7 +478,7 @@ func (coord *Coordinator) ChanOpenInit( // update source client on counterparty connection if err := coord.UpdateClient( counterparty, source, - counterpartyConnection.ClientID, Tendermint, + counterpartyConnection.ClientID, exported.Tendermint, ); err != nil { return sourceChannel, counterpartyChannel, err } @@ -518,7 +518,7 @@ func (coord *Coordinator) ChanOpenInitOnBothChains( // update counterparty client on source connection if err := coord.UpdateClient( source, counterparty, - connection.ClientID, Tendermint, + connection.ClientID, exported.Tendermint, ); err != nil { return sourceChannel, counterpartyChannel, err } @@ -526,7 +526,7 @@ func (coord *Coordinator) ChanOpenInitOnBothChains( // update source client on counterparty connection if err := coord.UpdateClient( counterparty, source, - counterpartyConnection.ClientID, Tendermint, + counterpartyConnection.ClientID, exported.Tendermint, ); err != nil { return sourceChannel, counterpartyChannel, err } @@ -552,7 +552,7 @@ func (coord *Coordinator) ChanOpenTry( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - connection.CounterpartyClientID, Tendermint, + connection.CounterpartyClientID, exported.Tendermint, ) } @@ -571,7 +571,7 @@ func (coord *Coordinator) ChanOpenAck( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - sourceChannel.CounterpartyClientID, Tendermint, + sourceChannel.CounterpartyClientID, exported.Tendermint, ) } @@ -590,7 +590,7 @@ func (coord *Coordinator) ChanOpenConfirm( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - sourceChannel.CounterpartyClientID, Tendermint, + sourceChannel.CounterpartyClientID, exported.Tendermint, ) } @@ -611,7 +611,7 @@ func (coord *Coordinator) ChanCloseInit( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - channel.CounterpartyClientID, Tendermint, + channel.CounterpartyClientID, exported.Tendermint, ) } @@ -630,6 +630,6 @@ func (coord *Coordinator) SetChannelClosed( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - testChannel.CounterpartyClientID, Tendermint, + testChannel.CounterpartyClientID, exported.Tendermint, ) } diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 102fcea4225..865953c9dd2 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1216,608 +1216,606 @@ func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 9603 bytes of a gzipped FileDescriptorSet + // 9578 bytes of a gzipped FileDescriptorSet 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xd7, 0x71, 0xd8, 0xcd, 0x7e, 0x00, 0xbb, 0x8d, 0x05, 0xb0, 0x78, 0xc0, 0xdd, 0xed, 0x2d, 0x8f, 0x00, 0x38, 0xfc, 0x3a, 0x1e, 0x49, 0x80, 0x3c, 0xf2, 0x8e, 0xe4, 0x9e, 0x44, 0x1a, 0x0b, 0xec, 0xe1, 0xc0, 0xc3, 0x17, 0x07, 0xc0, 0x91, 0xfa, 0x70, 0xb6, 0x06, 0xb3, 0x0f, 0x8b, 0x21, 0x76, 0x67, - 0x86, 0x33, 0xb3, 0x77, 0x07, 0x4a, 0xaa, 0xa2, 0x25, 0x45, 0x91, 0xe8, 0x38, 0x92, 0x22, 0x97, - 0x23, 0xd1, 0x3a, 0x45, 0xb2, 0x9c, 0xc8, 0x91, 0x95, 0xf8, 0x43, 0x8a, 0x12, 0x27, 0xa9, 0x8a, - 0x94, 0xc4, 0xb1, 0xa4, 0x54, 0x5c, 0x52, 0xc5, 0x95, 0x38, 0xae, 0xe4, 0xec, 0x50, 0x2a, 0x87, - 0x51, 0x94, 0x58, 0x3e, 0xcb, 0x89, 0x53, 0xaa, 0x54, 0x52, 0xef, 0x6b, 0xbe, 0xf6, 0x63, 0x16, - 0xd0, 0x9d, 0x24, 0xc7, 0xf9, 0x85, 0x9d, 0x7e, 0xdd, 0xfd, 0xba, 0xfb, 0xf5, 0xeb, 0xd7, 0xaf, - 0xe7, 0xbd, 0x01, 0xfc, 0xf3, 0xf3, 0x30, 0x5d, 0x37, 0xcd, 0x7a, 0x03, 0xcf, 0x5a, 0xb6, 0xe9, - 0x9a, 0xdb, 0xad, 0x9d, 0xd9, 0x1a, 0x76, 0x34, 0x5b, 0xb7, 0x5c, 0xd3, 0x9e, 0xa1, 0x30, 0x34, - 0xca, 0x30, 0x66, 0x04, 0x86, 0xbc, 0x02, 0x63, 0x17, 0xf4, 0x06, 0x5e, 0xf0, 0x10, 0x37, 0xb0, - 0x8b, 0x9e, 0x84, 0xd4, 0x8e, 0xde, 0xc0, 0x05, 0x69, 0x3a, 0x79, 0x6a, 0xe8, 0xcc, 0x3d, 0x33, - 0x11, 0xa2, 0x99, 0x30, 0xc5, 0x3a, 0x01, 0x2b, 0x94, 0x42, 0xfe, 0x56, 0x0a, 0xc6, 0x3b, 0xb4, + 0x86, 0x33, 0xb3, 0x77, 0x07, 0x4a, 0xaa, 0xa2, 0x25, 0x45, 0x91, 0xe8, 0x38, 0x92, 0x2c, 0x97, + 0x23, 0x51, 0x3a, 0x45, 0xb2, 0x9c, 0xc8, 0x91, 0x95, 0xf8, 0x43, 0x8a, 0x12, 0x27, 0xa9, 0x8a, + 0x9c, 0x8a, 0x63, 0x49, 0xa9, 0xb8, 0xa4, 0x8a, 0x2b, 0x71, 0x5c, 0xc9, 0xd9, 0xa1, 0x54, 0x0e, + 0xa3, 0x28, 0xb1, 0x7c, 0x96, 0x13, 0xa7, 0x54, 0xa9, 0xa4, 0xde, 0xd7, 0x7c, 0xed, 0xc7, 0x2c, + 0xa0, 0x3b, 0x49, 0x8e, 0xf3, 0x0b, 0xfb, 0x7a, 0xba, 0xfb, 0x75, 0xf7, 0xeb, 0xd7, 0xaf, 0x5f, + 0xcf, 0x7b, 0x03, 0xf8, 0xf8, 0x79, 0x98, 0xae, 0x9b, 0x66, 0xbd, 0x81, 0x67, 0x2d, 0xdb, 0x74, + 0xcd, 0xed, 0xd6, 0xce, 0x6c, 0x0d, 0x3b, 0x9a, 0xad, 0x5b, 0xae, 0x69, 0xcf, 0x50, 0x18, 0x1a, + 0x65, 0x18, 0x33, 0x02, 0x43, 0x5e, 0x81, 0xb1, 0x0b, 0x7a, 0x03, 0x2f, 0x78, 0x88, 0x1b, 0xd8, + 0x45, 0x4f, 0x42, 0x6a, 0x47, 0x6f, 0xe0, 0x82, 0x34, 0x9d, 0x3c, 0x35, 0x74, 0xe6, 0x9e, 0x99, + 0x08, 0xd1, 0x4c, 0x98, 0x62, 0x9d, 0x80, 0x15, 0x4a, 0x21, 0x7f, 0x2b, 0x05, 0xe3, 0x1d, 0x9e, 0x22, 0x04, 0x29, 0x43, 0x6d, 0x12, 0x8e, 0xd2, 0xa9, 0xac, 0x42, 0x7f, 0xa3, 0x02, 0x0c, 0x5a, - 0xaa, 0xb6, 0xa7, 0xd6, 0x71, 0x21, 0x41, 0xc1, 0xe2, 0x11, 0x4d, 0x02, 0xd4, 0xb0, 0x85, 0x8d, - 0x1a, 0x36, 0xb4, 0xfd, 0x42, 0x72, 0x3a, 0x79, 0x2a, 0xab, 0x04, 0x20, 0xe8, 0x41, 0x18, 0xb3, - 0x5a, 0xdb, 0x0d, 0x5d, 0xab, 0x06, 0xd0, 0x60, 0x3a, 0x79, 0x2a, 0xad, 0xe4, 0x59, 0xc3, 0x82, + 0xaa, 0xb6, 0xa7, 0xd6, 0x71, 0x21, 0x41, 0xc1, 0xa2, 0x89, 0x26, 0x01, 0x6a, 0xd8, 0xc2, 0x46, + 0x0d, 0x1b, 0xda, 0x7e, 0x21, 0x39, 0x9d, 0x3c, 0x95, 0x55, 0x02, 0x10, 0xf4, 0x20, 0x8c, 0x59, + 0xad, 0xed, 0x86, 0xae, 0x55, 0x03, 0x68, 0x30, 0x9d, 0x3c, 0x95, 0x56, 0xf2, 0xec, 0xc1, 0x82, 0x8f, 0x7c, 0x3f, 0x8c, 0x5e, 0xc5, 0xea, 0x5e, 0x10, 0x75, 0x88, 0xa2, 0x8e, 0x10, 0x70, 0x00, 0x71, 0x1e, 0x72, 0x4d, 0xec, 0x38, 0x6a, 0x1d, 0x57, 0xdd, 0x7d, 0x0b, 0x17, 0x52, 0x54, 0xfb, 0xe9, 0x36, 0xed, 0xa3, 0x9a, 0x0f, 0x71, 0xaa, 0xcd, 0x7d, 0x0b, 0xa3, 0x39, 0xc8, 0x62, 0xa3, 0xd5, 0x64, 0x1c, 0xd2, 0x5d, 0xec, 0x57, 0x31, 0x5a, 0xcd, 0x28, 0x97, 0x0c, 0x21, 0xe3, 0x2c, - 0x06, 0x1d, 0x6c, 0x5f, 0xd1, 0x35, 0x5c, 0x18, 0xa0, 0x0c, 0xee, 0x6f, 0x63, 0xb0, 0xc1, 0xda, - 0xa3, 0x3c, 0x04, 0x1d, 0x9a, 0x87, 0x2c, 0xbe, 0xe6, 0x62, 0xc3, 0xd1, 0x4d, 0xa3, 0x30, 0x48, - 0x99, 0xdc, 0xdb, 0x61, 0x14, 0x71, 0xa3, 0x16, 0x65, 0xe1, 0xd3, 0xa1, 0x73, 0x30, 0x68, 0x5a, - 0xae, 0x6e, 0x1a, 0x4e, 0x21, 0x33, 0x2d, 0x9d, 0x1a, 0x3a, 0x73, 0xb2, 0xa3, 0x23, 0xac, 0x31, - 0x1c, 0x45, 0x20, 0xa3, 0x25, 0xc8, 0x3b, 0x66, 0xcb, 0xd6, 0x70, 0x55, 0x33, 0x6b, 0xb8, 0xaa, - 0x1b, 0x3b, 0x66, 0x21, 0x4b, 0x19, 0x4c, 0xb5, 0x2b, 0x42, 0x11, 0xe7, 0xcd, 0x1a, 0x5e, 0x32, - 0x76, 0x4c, 0x65, 0xc4, 0x09, 0x3d, 0xa3, 0x63, 0x30, 0xe0, 0xec, 0x1b, 0xae, 0x7a, 0xad, 0x90, - 0xa3, 0x1e, 0xc2, 0x9f, 0xe4, 0xdf, 0x18, 0x80, 0xd1, 0x7e, 0x5c, 0xec, 0x3c, 0xa4, 0x77, 0x88, - 0x96, 0x85, 0xc4, 0x41, 0x6c, 0xc0, 0x68, 0xc2, 0x46, 0x1c, 0x38, 0xa4, 0x11, 0xe7, 0x60, 0xc8, - 0xc0, 0x8e, 0x8b, 0x6b, 0xcc, 0x23, 0x92, 0x7d, 0xfa, 0x14, 0x30, 0xa2, 0x76, 0x97, 0x4a, 0x1d, - 0xca, 0xa5, 0x5e, 0x80, 0x51, 0x4f, 0xa4, 0xaa, 0xad, 0x1a, 0x75, 0xe1, 0x9b, 0xb3, 0x71, 0x92, - 0xcc, 0x54, 0x04, 0x9d, 0x42, 0xc8, 0x94, 0x11, 0x1c, 0x7a, 0x46, 0x0b, 0x00, 0xa6, 0x81, 0xcd, - 0x9d, 0x6a, 0x0d, 0x6b, 0x8d, 0x42, 0xa6, 0x8b, 0x95, 0xd6, 0x08, 0x4a, 0x9b, 0x95, 0x4c, 0x06, - 0xd5, 0x1a, 0xe8, 0x29, 0xdf, 0xd5, 0x06, 0xbb, 0x78, 0xca, 0x0a, 0x9b, 0x64, 0x6d, 0xde, 0xb6, - 0x05, 0x23, 0x36, 0x26, 0x7e, 0x8f, 0x6b, 0x5c, 0xb3, 0x2c, 0x15, 0x62, 0x26, 0x56, 0x33, 0x85, - 0x93, 0x31, 0xc5, 0x86, 0xed, 0xe0, 0x23, 0xba, 0x1b, 0x3c, 0x40, 0x95, 0xba, 0x15, 0xd0, 0x28, - 0x94, 0x13, 0xc0, 0x55, 0xb5, 0x89, 0x8b, 0x2f, 0xc3, 0x48, 0xd8, 0x3c, 0x68, 0x02, 0xd2, 0x8e, - 0xab, 0xda, 0x2e, 0xf5, 0xc2, 0xb4, 0xc2, 0x1e, 0x50, 0x1e, 0x92, 0xd8, 0xa8, 0xd1, 0x28, 0x97, - 0x56, 0xc8, 0x4f, 0xf4, 0x13, 0xbe, 0xc2, 0x49, 0xaa, 0xf0, 0x7d, 0xed, 0x23, 0x1a, 0xe2, 0x1c, - 0xd5, 0xbb, 0xf8, 0x04, 0x0c, 0x87, 0x14, 0xe8, 0xb7, 0x6b, 0xf9, 0x9d, 0x70, 0xb4, 0x23, 0x6b, - 0xf4, 0x02, 0x4c, 0xb4, 0x0c, 0xdd, 0x70, 0xb1, 0x6d, 0xd9, 0x98, 0x78, 0x2c, 0xeb, 0xaa, 0xf0, - 0x9f, 0x07, 0xbb, 0xf8, 0xdc, 0x56, 0x10, 0x9b, 0x71, 0x51, 0xc6, 0x5b, 0xed, 0xc0, 0xd3, 0xd9, - 0xcc, 0x1b, 0x83, 0xf9, 0x57, 0x5e, 0x79, 0xe5, 0x95, 0x84, 0xfc, 0xe5, 0x01, 0x98, 0xe8, 0x34, - 0x67, 0x3a, 0x4e, 0xdf, 0x63, 0x30, 0x60, 0xb4, 0x9a, 0xdb, 0xd8, 0xa6, 0x46, 0x4a, 0x2b, 0xfc, - 0x09, 0xcd, 0x41, 0xba, 0xa1, 0x6e, 0xe3, 0x46, 0x21, 0x35, 0x2d, 0x9d, 0x1a, 0x39, 0xf3, 0x60, - 0x5f, 0xb3, 0x72, 0x66, 0x99, 0x90, 0x28, 0x8c, 0x12, 0x3d, 0x0d, 0x29, 0x1e, 0xa2, 0x09, 0x87, - 0xd3, 0xfd, 0x71, 0x20, 0x73, 0x49, 0xa1, 0x74, 0xe8, 0x0e, 0xc8, 0x92, 0xbf, 0xcc, 0x37, 0x06, - 0xa8, 0xcc, 0x19, 0x02, 0x20, 0x7e, 0x81, 0x8a, 0x90, 0xa1, 0xd3, 0xa4, 0x86, 0xc5, 0xd2, 0xe6, - 0x3d, 0x13, 0xc7, 0xaa, 0xe1, 0x1d, 0xb5, 0xd5, 0x70, 0xab, 0x57, 0xd4, 0x46, 0x0b, 0x53, 0x87, - 0xcf, 0x2a, 0x39, 0x0e, 0xbc, 0x4c, 0x60, 0x68, 0x0a, 0x86, 0xd8, 0xac, 0xd2, 0x8d, 0x1a, 0xbe, - 0x46, 0xa3, 0x67, 0x5a, 0x61, 0x13, 0x6d, 0x89, 0x40, 0x48, 0xf7, 0x2f, 0x3a, 0xa6, 0x21, 0x5c, - 0x93, 0x76, 0x41, 0x00, 0xb4, 0xfb, 0x27, 0xa2, 0x81, 0xfb, 0xce, 0xce, 0xea, 0xb5, 0xcd, 0xa5, - 0xfb, 0x61, 0x94, 0x62, 0x3c, 0xc6, 0x87, 0x5e, 0x6d, 0x14, 0xc6, 0xa6, 0xa5, 0x53, 0x19, 0x65, - 0x84, 0x81, 0xd7, 0x38, 0x54, 0xfe, 0x62, 0x02, 0x52, 0x34, 0xb0, 0x8c, 0xc2, 0xd0, 0xe6, 0x5b, - 0xd6, 0x2b, 0xd5, 0x85, 0xb5, 0xad, 0xf2, 0x72, 0x25, 0x2f, 0xa1, 0x11, 0x00, 0x0a, 0xb8, 0xb0, - 0xbc, 0x36, 0xb7, 0x99, 0x4f, 0x78, 0xcf, 0x4b, 0xab, 0x9b, 0xe7, 0x1e, 0xcf, 0x27, 0x3d, 0x82, - 0x2d, 0x06, 0x48, 0x05, 0x11, 0x1e, 0x3b, 0x93, 0x4f, 0xa3, 0x3c, 0xe4, 0x18, 0x83, 0xa5, 0x17, - 0x2a, 0x0b, 0xe7, 0x1e, 0xcf, 0x0f, 0x84, 0x21, 0x8f, 0x9d, 0xc9, 0x0f, 0xa2, 0x61, 0xc8, 0x52, - 0x48, 0x79, 0x6d, 0x6d, 0x39, 0x9f, 0xf1, 0x78, 0x6e, 0x6c, 0x2a, 0x4b, 0xab, 0x8b, 0xf9, 0xac, - 0xc7, 0x73, 0x51, 0x59, 0xdb, 0x5a, 0xcf, 0x83, 0xc7, 0x61, 0xa5, 0xb2, 0xb1, 0x31, 0xb7, 0x58, - 0xc9, 0x0f, 0x79, 0x18, 0xe5, 0xb7, 0x6c, 0x56, 0x36, 0xf2, 0xb9, 0x90, 0x58, 0x8f, 0x9d, 0xc9, - 0x0f, 0x7b, 0x5d, 0x54, 0x56, 0xb7, 0x56, 0xf2, 0x23, 0x68, 0x0c, 0x86, 0x59, 0x17, 0x42, 0x88, - 0xd1, 0x08, 0xe8, 0xdc, 0xe3, 0xf9, 0xbc, 0x2f, 0x08, 0xe3, 0x32, 0x16, 0x02, 0x9c, 0x7b, 0x3c, - 0x8f, 0xe4, 0x79, 0x48, 0x53, 0x37, 0x44, 0x08, 0x46, 0x96, 0xe7, 0xca, 0x95, 0xe5, 0xea, 0xda, - 0xfa, 0xe6, 0xd2, 0xda, 0xea, 0xdc, 0x72, 0x5e, 0xf2, 0x61, 0x4a, 0xe5, 0xb9, 0xad, 0x25, 0xa5, - 0xb2, 0x90, 0x4f, 0x04, 0x61, 0xeb, 0x95, 0xb9, 0xcd, 0xca, 0x42, 0x3e, 0x29, 0x6b, 0x30, 0xd1, - 0x29, 0xa0, 0x76, 0x9c, 0x42, 0x01, 0x5f, 0x48, 0x74, 0xf1, 0x05, 0xca, 0x2b, 0xea, 0x0b, 0xf2, - 0x37, 0x13, 0x30, 0xde, 0x61, 0x51, 0xe9, 0xd8, 0xc9, 0x33, 0x90, 0x66, 0xbe, 0xcc, 0x96, 0xd9, - 0x07, 0x3a, 0xae, 0x4e, 0xd4, 0xb3, 0xdb, 0x96, 0x5a, 0x4a, 0x17, 0x4c, 0x35, 0x92, 0x5d, 0x52, - 0x0d, 0xc2, 0xa2, 0xcd, 0x61, 0x7f, 0xb2, 0x2d, 0xf8, 0xb3, 0xf5, 0xf1, 0x5c, 0x3f, 0xeb, 0x23, - 0x85, 0x1d, 0x6c, 0x11, 0x48, 0x77, 0x58, 0x04, 0xce, 0xc3, 0x58, 0x1b, 0xa3, 0xbe, 0x83, 0xf1, - 0x7b, 0x24, 0x28, 0x74, 0x33, 0x4e, 0x4c, 0x48, 0x4c, 0x84, 0x42, 0xe2, 0xf9, 0xa8, 0x05, 0xef, - 0xea, 0x3e, 0x08, 0x6d, 0x63, 0xfd, 0x19, 0x09, 0x8e, 0x75, 0x4e, 0x29, 0x3b, 0xca, 0xf0, 0x34, - 0x0c, 0x34, 0xb1, 0xbb, 0x6b, 0x8a, 0xb4, 0xea, 0xbe, 0x0e, 0x8b, 0x35, 0x69, 0x8e, 0x0e, 0x36, - 0xa7, 0x0a, 0xae, 0xf6, 0xc9, 0x6e, 0x79, 0x21, 0x93, 0xa6, 0x4d, 0xd2, 0x0f, 0x24, 0xe0, 0x68, - 0x47, 0xe6, 0x1d, 0x05, 0xbd, 0x13, 0x40, 0x37, 0xac, 0x96, 0xcb, 0x52, 0x27, 0x16, 0x89, 0xb3, - 0x14, 0x42, 0x83, 0x17, 0x89, 0xb2, 0x2d, 0xd7, 0x6b, 0x4f, 0xd2, 0x76, 0x60, 0x20, 0x8a, 0xf0, - 0xa4, 0x2f, 0x68, 0x8a, 0x0a, 0x3a, 0xd9, 0x45, 0xd3, 0x36, 0xc7, 0x7c, 0x04, 0xf2, 0x5a, 0x43, - 0xc7, 0x86, 0x5b, 0x75, 0x5c, 0x1b, 0xab, 0x4d, 0xdd, 0xa8, 0xd3, 0xa5, 0x26, 0x53, 0x4a, 0xef, - 0xa8, 0x0d, 0x07, 0x2b, 0xa3, 0xac, 0x79, 0x43, 0xb4, 0x12, 0x0a, 0xea, 0x40, 0x76, 0x80, 0x62, - 0x20, 0x44, 0xc1, 0x9a, 0x3d, 0x0a, 0xf9, 0xc3, 0x59, 0x18, 0x0a, 0x24, 0xe0, 0xe8, 0x2e, 0xc8, - 0xbd, 0xa8, 0x5e, 0x51, 0xab, 0x62, 0x53, 0xc5, 0x2c, 0x31, 0x44, 0x60, 0xeb, 0x7c, 0x63, 0xf5, - 0x08, 0x4c, 0x50, 0x14, 0xb3, 0xe5, 0x62, 0xbb, 0xaa, 0x35, 0x54, 0xc7, 0xa1, 0x46, 0xcb, 0x50, - 0x54, 0x44, 0xda, 0xd6, 0x48, 0xd3, 0xbc, 0x68, 0x41, 0x67, 0x61, 0x9c, 0x52, 0x34, 0x5b, 0x0d, - 0x57, 0xb7, 0x1a, 0xb8, 0x4a, 0xb6, 0x79, 0x0e, 0x5d, 0x72, 0x3c, 0xc9, 0xc6, 0x08, 0xc6, 0x0a, - 0x47, 0x20, 0x12, 0x39, 0x68, 0x01, 0xee, 0xa4, 0x64, 0x75, 0x6c, 0x60, 0x5b, 0x75, 0x71, 0x15, - 0xbf, 0xd4, 0x52, 0x1b, 0x4e, 0x55, 0x35, 0x6a, 0xd5, 0x5d, 0xd5, 0xd9, 0x2d, 0x4c, 0x10, 0x06, - 0xe5, 0x44, 0x41, 0x52, 0x4e, 0x10, 0xc4, 0x45, 0x8e, 0x57, 0xa1, 0x68, 0x73, 0x46, 0xed, 0xa2, - 0xea, 0xec, 0xa2, 0x12, 0x1c, 0xa3, 0x5c, 0x1c, 0xd7, 0xd6, 0x8d, 0x7a, 0x55, 0xdb, 0xc5, 0xda, - 0x5e, 0xb5, 0xe5, 0xee, 0x3c, 0x59, 0xb8, 0x23, 0xd8, 0x3f, 0x95, 0x70, 0x83, 0xe2, 0xcc, 0x13, - 0x94, 0x2d, 0x77, 0xe7, 0x49, 0xb4, 0x01, 0x39, 0x32, 0x18, 0x4d, 0xfd, 0x65, 0x5c, 0xdd, 0x31, - 0x6d, 0xba, 0x86, 0x8e, 0x74, 0x08, 0x4d, 0x01, 0x0b, 0xce, 0xac, 0x71, 0x82, 0x15, 0xb3, 0x86, - 0x4b, 0xe9, 0x8d, 0xf5, 0x4a, 0x65, 0x41, 0x19, 0x12, 0x5c, 0x2e, 0x98, 0x36, 0x71, 0xa8, 0xba, - 0xe9, 0x19, 0x78, 0x88, 0x39, 0x54, 0xdd, 0x14, 0xe6, 0x3d, 0x0b, 0xe3, 0x9a, 0xc6, 0x74, 0xd6, - 0xb5, 0x2a, 0xdf, 0x8c, 0x39, 0x85, 0x7c, 0xc8, 0x58, 0x9a, 0xb6, 0xc8, 0x10, 0xb8, 0x8f, 0x3b, - 0xe8, 0x29, 0x38, 0xea, 0x1b, 0x2b, 0x48, 0x38, 0xd6, 0xa6, 0x65, 0x94, 0xf4, 0x2c, 0x8c, 0x5b, - 0xfb, 0xed, 0x84, 0x28, 0xd4, 0xa3, 0xb5, 0x1f, 0x25, 0x7b, 0x02, 0x26, 0xac, 0x5d, 0xab, 0x9d, - 0xee, 0x74, 0x90, 0x0e, 0x59, 0xbb, 0x56, 0x94, 0xf0, 0x5e, 0xba, 0x33, 0xb7, 0xb1, 0xa6, 0xba, - 0xb8, 0x56, 0x38, 0x1e, 0x44, 0x0f, 0x34, 0xa0, 0x19, 0xc8, 0x6b, 0x5a, 0x15, 0x1b, 0xea, 0x76, - 0x03, 0x57, 0x55, 0x1b, 0x1b, 0xaa, 0x53, 0x98, 0xa2, 0xc8, 0x29, 0xd7, 0x6e, 0x61, 0x65, 0x44, - 0xd3, 0x2a, 0xb4, 0x71, 0x8e, 0xb6, 0xa1, 0xd3, 0x30, 0x66, 0x6e, 0xbf, 0xa8, 0x31, 0x8f, 0xac, - 0x5a, 0x36, 0xde, 0xd1, 0xaf, 0x15, 0xee, 0xa1, 0xe6, 0x1d, 0x25, 0x0d, 0xd4, 0x1f, 0xd7, 0x29, - 0x18, 0x3d, 0x00, 0x79, 0xcd, 0xd9, 0x55, 0x6d, 0x8b, 0x86, 0x64, 0xc7, 0x52, 0x35, 0x5c, 0xb8, - 0x97, 0xa1, 0x32, 0xf8, 0xaa, 0x00, 0x93, 0x19, 0xe1, 0x5c, 0xd5, 0x77, 0x5c, 0xc1, 0xf1, 0x7e, - 0x36, 0x23, 0x28, 0x8c, 0x73, 0x3b, 0x05, 0x79, 0x62, 0x89, 0x50, 0xc7, 0xa7, 0x28, 0xda, 0x88, - 0xb5, 0x6b, 0x05, 0xfb, 0xbd, 0x1b, 0x86, 0x09, 0xa6, 0xdf, 0xe9, 0x03, 0x2c, 0x71, 0xb3, 0x76, - 0x03, 0x3d, 0x3e, 0x0e, 0xc7, 0x08, 0x52, 0x13, 0xbb, 0x6a, 0x4d, 0x75, 0xd5, 0x00, 0xf6, 0x43, - 0x14, 0x9b, 0x98, 0x7d, 0x85, 0x37, 0x86, 0xe4, 0xb4, 0x5b, 0xdb, 0xfb, 0x9e, 0x63, 0x3d, 0xcc, - 0xe4, 0x24, 0x30, 0xe1, 0x5a, 0xb7, 0x2d, 0x39, 0x97, 0x4b, 0x90, 0x0b, 0xfa, 0x3d, 0xca, 0x02, - 0xf3, 0xfc, 0xbc, 0x44, 0x92, 0xa0, 0xf9, 0xb5, 0x05, 0x92, 0xbe, 0xbc, 0xb5, 0x92, 0x4f, 0x90, - 0x34, 0x6a, 0x79, 0x69, 0xb3, 0x52, 0x55, 0xb6, 0x56, 0x37, 0x97, 0x56, 0x2a, 0xf9, 0x64, 0x20, - 0xb1, 0x7f, 0x36, 0x95, 0xb9, 0x2f, 0x7f, 0xbf, 0xfc, 0x8d, 0x04, 0x8c, 0x84, 0x77, 0x6a, 0xe8, - 0x4d, 0x70, 0x5c, 0x94, 0x55, 0x1c, 0xec, 0x56, 0xaf, 0xea, 0x36, 0x9d, 0x90, 0x4d, 0x95, 0x2d, - 0x8e, 0x9e, 0xff, 0x4c, 0x70, 0xac, 0x0d, 0xec, 0x3e, 0xaf, 0xdb, 0x64, 0xba, 0x35, 0x55, 0x17, - 0x2d, 0xc3, 0x94, 0x61, 0x56, 0x1d, 0x57, 0x35, 0x6a, 0xaa, 0x5d, 0xab, 0xfa, 0x05, 0xad, 0xaa, - 0xaa, 0x69, 0xd8, 0x71, 0x4c, 0xb6, 0x10, 0x7a, 0x5c, 0x4e, 0x1a, 0xe6, 0x06, 0x47, 0xf6, 0x57, - 0x88, 0x39, 0x8e, 0x1a, 0x71, 0xdf, 0x64, 0x37, 0xf7, 0xbd, 0x03, 0xb2, 0x4d, 0xd5, 0xaa, 0x62, - 0xc3, 0xb5, 0xf7, 0x69, 0x7e, 0x9e, 0x51, 0x32, 0x4d, 0xd5, 0xaa, 0x90, 0xe7, 0x1f, 0xca, 0x36, - 0xe9, 0xd9, 0x54, 0x26, 0x93, 0xcf, 0x3e, 0x9b, 0xca, 0x64, 0xf3, 0x20, 0xbf, 0x9e, 0x84, 0x5c, - 0x30, 0x5f, 0x27, 0xdb, 0x1f, 0x8d, 0xae, 0x58, 0x12, 0x8d, 0x69, 0x77, 0xf7, 0xcc, 0xee, 0x67, - 0xe6, 0xc9, 0x52, 0x56, 0x1a, 0x60, 0xc9, 0xb1, 0xc2, 0x28, 0x49, 0x1a, 0x41, 0x9c, 0x0d, 0xb3, - 0x64, 0x24, 0xa3, 0xf0, 0x27, 0xb4, 0x08, 0x03, 0x2f, 0x3a, 0x94, 0xf7, 0x00, 0xe5, 0x7d, 0x4f, - 0x6f, 0xde, 0xcf, 0x6e, 0x50, 0xe6, 0xd9, 0x67, 0x37, 0xaa, 0xab, 0x6b, 0xca, 0xca, 0xdc, 0xb2, - 0xc2, 0xc9, 0xd1, 0x09, 0x48, 0x35, 0xd4, 0x97, 0xf7, 0xc3, 0x8b, 0x1e, 0x05, 0xf5, 0x3b, 0x08, - 0x27, 0x20, 0x75, 0x15, 0xab, 0x7b, 0xe1, 0xa5, 0x86, 0x82, 0x6e, 0xe3, 0x64, 0x98, 0x85, 0x34, - 0xb5, 0x17, 0x02, 0xe0, 0x16, 0xcb, 0x1f, 0x41, 0x19, 0x48, 0xcd, 0xaf, 0x29, 0x64, 0x42, 0xe4, - 0x21, 0xc7, 0xa0, 0xd5, 0xf5, 0xa5, 0xca, 0x7c, 0x25, 0x9f, 0x90, 0xcf, 0xc2, 0x00, 0x33, 0x02, - 0x99, 0x2c, 0x9e, 0x19, 0xf2, 0x47, 0xf8, 0x23, 0xe7, 0x21, 0x89, 0xd6, 0xad, 0x95, 0x72, 0x45, - 0xc9, 0x27, 0xc2, 0x43, 0x9d, 0xca, 0xa7, 0x65, 0x07, 0x72, 0xc1, 0x3c, 0xfc, 0x87, 0xb3, 0x19, - 0xff, 0x92, 0x04, 0x43, 0x81, 0xbc, 0x9a, 0x24, 0x44, 0x6a, 0xa3, 0x61, 0x5e, 0xad, 0xaa, 0x0d, - 0x5d, 0x75, 0xb8, 0x6b, 0x00, 0x05, 0xcd, 0x11, 0x48, 0xbf, 0x43, 0xf7, 0x43, 0x9a, 0x22, 0xe9, - 0xfc, 0x80, 0xfc, 0x09, 0x09, 0xf2, 0xd1, 0xc4, 0x36, 0x22, 0xa6, 0xf4, 0xa3, 0x14, 0x53, 0xfe, - 0xb8, 0x04, 0x23, 0xe1, 0x6c, 0x36, 0x22, 0xde, 0x5d, 0x3f, 0x52, 0xf1, 0xfe, 0x20, 0x01, 0xc3, - 0xa1, 0x1c, 0xb6, 0x5f, 0xe9, 0x5e, 0x82, 0x31, 0xbd, 0x86, 0x9b, 0x96, 0xe9, 0x62, 0x43, 0xdb, - 0xaf, 0x36, 0xf0, 0x15, 0xdc, 0x28, 0xc8, 0x34, 0x68, 0xcc, 0xf6, 0xce, 0x92, 0x67, 0x96, 0x7c, - 0xba, 0x65, 0x42, 0x56, 0x1a, 0x5f, 0x5a, 0xa8, 0xac, 0xac, 0xaf, 0x6d, 0x56, 0x56, 0xe7, 0xdf, - 0x52, 0xdd, 0x5a, 0xbd, 0xb4, 0xba, 0xf6, 0xfc, 0xaa, 0x92, 0xd7, 0x23, 0x68, 0xb7, 0x71, 0xda, - 0xaf, 0x43, 0x3e, 0x2a, 0x14, 0x3a, 0x0e, 0x9d, 0xc4, 0xca, 0x1f, 0x41, 0xe3, 0x30, 0xba, 0xba, - 0x56, 0xdd, 0x58, 0x5a, 0xa8, 0x54, 0x2b, 0x17, 0x2e, 0x54, 0xe6, 0x37, 0x37, 0x58, 0xdd, 0xc3, - 0xc3, 0xde, 0x0c, 0x4d, 0x70, 0xf9, 0xb5, 0x24, 0x8c, 0x77, 0x90, 0x04, 0xcd, 0xf1, 0x1d, 0x0b, - 0xdb, 0x44, 0x3d, 0xdc, 0x8f, 0xf4, 0x33, 0x24, 0x67, 0x58, 0x57, 0x6d, 0x97, 0x6f, 0x70, 0x1e, - 0x00, 0x62, 0x25, 0xc3, 0xd5, 0x77, 0x74, 0x6c, 0xf3, 0x7a, 0x12, 0xdb, 0xc6, 0x8c, 0xfa, 0x70, - 0x56, 0x52, 0x7a, 0x08, 0x90, 0x65, 0x3a, 0xba, 0xab, 0x5f, 0xc1, 0x55, 0xdd, 0x10, 0xc5, 0x27, - 0xb2, 0xad, 0x49, 0x29, 0x79, 0xd1, 0xb2, 0x64, 0xb8, 0x1e, 0xb6, 0x81, 0xeb, 0x6a, 0x04, 0x9b, - 0x04, 0xf3, 0xa4, 0x92, 0x17, 0x2d, 0x1e, 0xf6, 0x5d, 0x90, 0xab, 0x99, 0x2d, 0x92, 0xeb, 0x31, - 0x3c, 0xb2, 0x76, 0x48, 0xca, 0x10, 0x83, 0x79, 0x28, 0x3c, 0x8b, 0xf7, 0xab, 0x5e, 0x39, 0x65, - 0x88, 0xc1, 0x18, 0xca, 0xfd, 0x30, 0xaa, 0xd6, 0xeb, 0x36, 0x61, 0x2e, 0x18, 0xb1, 0x7d, 0xc9, - 0x88, 0x07, 0xa6, 0x88, 0xc5, 0x67, 0x21, 0x23, 0xec, 0x40, 0x96, 0x6a, 0x62, 0x89, 0xaa, 0xc5, - 0x36, 0xdb, 0x89, 0x53, 0x59, 0x25, 0x63, 0x88, 0xc6, 0xbb, 0x20, 0xa7, 0x3b, 0x55, 0xbf, 0x88, - 0x9f, 0x98, 0x4e, 0x9c, 0xca, 0x28, 0x43, 0xba, 0xe3, 0x15, 0x40, 0xe5, 0xcf, 0x24, 0x60, 0x24, - 0xfc, 0x12, 0x02, 0x2d, 0x40, 0xa6, 0x61, 0x6a, 0x2a, 0x75, 0x2d, 0xf6, 0x06, 0xec, 0x54, 0xcc, - 0x7b, 0x8b, 0x99, 0x65, 0x8e, 0xaf, 0x78, 0x94, 0xc5, 0xdf, 0x96, 0x20, 0x23, 0xc0, 0xe8, 0x18, - 0xa4, 0x2c, 0xd5, 0xdd, 0xa5, 0xec, 0xd2, 0xe5, 0x44, 0x5e, 0x52, 0xe8, 0x33, 0x81, 0x3b, 0x96, - 0x6a, 0x50, 0x17, 0xe0, 0x70, 0xf2, 0x4c, 0xc6, 0xb5, 0x81, 0xd5, 0x1a, 0xdd, 0xf4, 0x98, 0xcd, - 0x26, 0x36, 0x5c, 0x47, 0x8c, 0x2b, 0x87, 0xcf, 0x73, 0x30, 0x7a, 0x10, 0xc6, 0x5c, 0x5b, 0xd5, - 0x1b, 0x21, 0xdc, 0x14, 0xc5, 0xcd, 0x8b, 0x06, 0x0f, 0xb9, 0x04, 0x27, 0x04, 0xdf, 0x1a, 0x76, - 0x55, 0x6d, 0x17, 0xd7, 0x7c, 0xa2, 0x01, 0x5a, 0xdc, 0x38, 0xce, 0x11, 0x16, 0x78, 0xbb, 0xa0, - 0x95, 0xbf, 0x21, 0xc1, 0x98, 0xd8, 0xa6, 0xd5, 0x3c, 0x63, 0xad, 0x00, 0xa8, 0x86, 0x61, 0xba, - 0x41, 0x73, 0xb5, 0xbb, 0x72, 0x1b, 0xdd, 0xcc, 0x9c, 0x47, 0xa4, 0x04, 0x18, 0x14, 0x9b, 0x00, - 0x7e, 0x4b, 0x57, 0xb3, 0x4d, 0xc1, 0x10, 0x7f, 0xc3, 0x44, 0x5f, 0x53, 0xb2, 0x8d, 0x3d, 0x30, - 0x10, 0xd9, 0xcf, 0xa1, 0x09, 0x48, 0x6f, 0xe3, 0xba, 0x6e, 0xf0, 0xba, 0x31, 0x7b, 0x10, 0xe5, - 0x97, 0x94, 0x57, 0x7e, 0x29, 0x7f, 0x50, 0x82, 0x71, 0xcd, 0x6c, 0x46, 0xe5, 0x2d, 0xe7, 0x23, - 0xd5, 0x05, 0xe7, 0xa2, 0xf4, 0xd6, 0xa7, 0xeb, 0xba, 0xbb, 0xdb, 0xda, 0x9e, 0xd1, 0xcc, 0xe6, - 0x6c, 0xdd, 0x6c, 0xa8, 0x46, 0xdd, 0x7f, 0xcf, 0x4a, 0x7f, 0x68, 0x0f, 0xd7, 0xb1, 0xf1, 0x70, - 0xdd, 0x0c, 0xbc, 0x75, 0x3d, 0xef, 0xff, 0xfc, 0x33, 0x49, 0xfa, 0x85, 0x44, 0x72, 0x71, 0xbd, - 0xfc, 0xd9, 0x44, 0x71, 0x91, 0x75, 0xb7, 0x2e, 0xcc, 0xa3, 0xe0, 0x9d, 0x06, 0xd6, 0x88, 0xca, - 0xf0, 0xed, 0x07, 0x61, 0xa2, 0x6e, 0xd6, 0x4d, 0xca, 0x71, 0x96, 0xfc, 0xe2, 0x6f, 0x6e, 0xb3, - 0x1e, 0xb4, 0x18, 0xfb, 0x9a, 0xb7, 0xb4, 0x0a, 0xe3, 0x1c, 0xb9, 0x4a, 0x5f, 0x1d, 0xb1, 0x8d, - 0x0d, 0xea, 0x59, 0x55, 0x2b, 0xfc, 0xda, 0xb7, 0xe8, 0x82, 0xae, 0x8c, 0x71, 0x52, 0xd2, 0xc6, - 0xf6, 0x3e, 0x25, 0x05, 0x8e, 0x86, 0xf8, 0xb1, 0x69, 0x8b, 0xed, 0x18, 0x8e, 0xbf, 0xc9, 0x39, - 0x8e, 0x07, 0x38, 0x6e, 0x70, 0xd2, 0xd2, 0x3c, 0x0c, 0x1f, 0x84, 0xd7, 0xbf, 0xe4, 0xbc, 0x72, - 0x38, 0xc8, 0x64, 0x11, 0x46, 0x29, 0x13, 0xad, 0xe5, 0xb8, 0x66, 0x93, 0xc6, 0xc4, 0xde, 0x6c, - 0x7e, 0xeb, 0x5b, 0x6c, 0x1e, 0x8d, 0x10, 0xb2, 0x79, 0x8f, 0xaa, 0x54, 0x02, 0xfa, 0xb6, 0xac, - 0x86, 0xb5, 0x46, 0x0c, 0x87, 0xaf, 0x70, 0x41, 0x3c, 0xfc, 0xd2, 0x65, 0x98, 0x20, 0xbf, 0x69, - 0xc8, 0x0a, 0x4a, 0x12, 0x5f, 0x82, 0x2b, 0x7c, 0xe3, 0x3d, 0x6c, 0xaa, 0x8e, 0x7b, 0x0c, 0x02, - 0x32, 0x05, 0x46, 0xb1, 0x8e, 0x5d, 0x17, 0xdb, 0x4e, 0x55, 0x6d, 0x74, 0x12, 0x2f, 0x50, 0xc3, - 0x28, 0x7c, 0xec, 0x3b, 0xe1, 0x51, 0x5c, 0x64, 0x94, 0x73, 0x8d, 0x46, 0x69, 0x0b, 0x8e, 0x77, - 0xf0, 0x8a, 0x3e, 0x78, 0xbe, 0xc6, 0x79, 0x4e, 0xb4, 0x79, 0x06, 0x61, 0xbb, 0x0e, 0x02, 0xee, - 0x8d, 0x65, 0x1f, 0x3c, 0x7f, 0x9e, 0xf3, 0x44, 0x9c, 0x56, 0x0c, 0x29, 0xe1, 0xf8, 0x2c, 0x8c, - 0x5d, 0xc1, 0xf6, 0xb6, 0xe9, 0xf0, 0xba, 0x51, 0x1f, 0xec, 0x3e, 0xce, 0xd9, 0x8d, 0x72, 0x42, - 0x5a, 0x48, 0x22, 0xbc, 0x9e, 0x82, 0xcc, 0x8e, 0xaa, 0xe1, 0x3e, 0x58, 0x5c, 0xe7, 0x2c, 0x06, - 0x09, 0x3e, 0x21, 0x9d, 0x83, 0x5c, 0xdd, 0xe4, 0xab, 0x56, 0x3c, 0xf9, 0x27, 0x38, 0xf9, 0x90, - 0xa0, 0xe1, 0x2c, 0x2c, 0xd3, 0x6a, 0x35, 0xc8, 0x92, 0x16, 0xcf, 0xe2, 0x6f, 0x0a, 0x16, 0x82, - 0x86, 0xb3, 0x38, 0x80, 0x59, 0x3f, 0x29, 0x58, 0x38, 0x01, 0x7b, 0x3e, 0x03, 0x43, 0xa6, 0xd1, - 0xd8, 0x37, 0x8d, 0x7e, 0x84, 0xf8, 0x14, 0xe7, 0x00, 0x9c, 0x84, 0x30, 0x38, 0x0f, 0xd9, 0x7e, - 0x07, 0xe2, 0x6f, 0x7d, 0x47, 0x4c, 0x0f, 0x31, 0x02, 0x8b, 0x30, 0x2a, 0x02, 0x94, 0x6e, 0x1a, - 0x7d, 0xb0, 0xf8, 0xdb, 0x9c, 0xc5, 0x48, 0x80, 0x8c, 0xab, 0xe1, 0x62, 0xc7, 0xad, 0xe3, 0x7e, - 0x98, 0x7c, 0x46, 0xa8, 0xc1, 0x49, 0xb8, 0x29, 0xb7, 0xb1, 0xa1, 0xed, 0xf6, 0xc7, 0xe1, 0x97, - 0x84, 0x29, 0x05, 0x0d, 0x61, 0x31, 0x0f, 0xc3, 0x4d, 0xd5, 0x76, 0x76, 0xd5, 0x46, 0x5f, 0xc3, - 0xf1, 0x77, 0x38, 0x8f, 0x9c, 0x47, 0xc4, 0x2d, 0xd2, 0x32, 0x0e, 0xc2, 0xe6, 0xb3, 0xc2, 0x22, - 0x01, 0x32, 0x3e, 0xf5, 0x1c, 0x97, 0x16, 0xd9, 0x0e, 0xc2, 0xed, 0x97, 0xc5, 0xd4, 0x63, 0xb4, - 0x2b, 0x41, 0x8e, 0xe7, 0x21, 0xeb, 0xe8, 0x2f, 0xf7, 0xc5, 0xe6, 0x73, 0x62, 0xa4, 0x29, 0x01, - 0x21, 0x7e, 0x0b, 0x9c, 0xe8, 0xb8, 0x4c, 0xf4, 0xc1, 0xec, 0xef, 0x72, 0x66, 0xc7, 0x3a, 0x2c, - 0x15, 0x3c, 0x24, 0x1c, 0x94, 0xe5, 0xdf, 0x13, 0x21, 0x01, 0x47, 0x78, 0xad, 0x93, 0x7d, 0x84, - 0xa3, 0xee, 0x1c, 0xcc, 0x6a, 0xbf, 0x22, 0xac, 0xc6, 0x68, 0x43, 0x56, 0xdb, 0x84, 0x63, 0x9c, - 0xe3, 0xc1, 0xc6, 0xf5, 0x57, 0x45, 0x60, 0x65, 0xd4, 0x5b, 0xe1, 0xd1, 0x7d, 0x1b, 0x14, 0x3d, - 0x73, 0x8a, 0x84, 0xd5, 0xa9, 0x36, 0x55, 0xab, 0x0f, 0xce, 0xbf, 0xc6, 0x39, 0x8b, 0x88, 0xef, - 0x65, 0xbc, 0xce, 0x8a, 0x6a, 0x11, 0xe6, 0x2f, 0x40, 0x41, 0x30, 0x6f, 0x19, 0x36, 0xd6, 0xcc, - 0xba, 0xa1, 0xbf, 0x8c, 0x6b, 0x7d, 0xb0, 0xfe, 0xf5, 0xc8, 0x50, 0x6d, 0x05, 0xc8, 0x09, 0xe7, - 0x25, 0xc8, 0x7b, 0xb9, 0x4a, 0x55, 0x6f, 0x5a, 0xa6, 0xed, 0xc6, 0x70, 0xfc, 0xbc, 0x18, 0x29, - 0x8f, 0x6e, 0x89, 0x92, 0x95, 0x2a, 0xc0, 0xde, 0x3c, 0xf7, 0xeb, 0x92, 0x5f, 0xe0, 0x8c, 0x86, - 0x7d, 0x2a, 0x1e, 0x38, 0x34, 0xb3, 0x69, 0xa9, 0x76, 0x3f, 0xf1, 0xef, 0xef, 0x8b, 0xc0, 0xc1, - 0x49, 0x78, 0xe0, 0x70, 0xf7, 0x2d, 0x4c, 0x56, 0xfb, 0x3e, 0x38, 0x7c, 0x51, 0x04, 0x0e, 0x41, - 0xc3, 0x59, 0x88, 0x84, 0xa1, 0x0f, 0x16, 0xff, 0x40, 0xb0, 0x10, 0x34, 0x84, 0xc5, 0x73, 0xfe, - 0x42, 0x6b, 0xe3, 0xba, 0xee, 0xb8, 0x36, 0x4b, 0x93, 0x7b, 0xb3, 0xfa, 0x87, 0xdf, 0x09, 0x27, - 0x61, 0x4a, 0x80, 0x94, 0x44, 0x22, 0x5e, 0x76, 0xa5, 0xbb, 0xa8, 0x78, 0xc1, 0x7e, 0x43, 0x44, - 0xa2, 0x00, 0x19, 0x91, 0x2d, 0x90, 0x21, 0x12, 0xb3, 0x6b, 0x64, 0xef, 0xd0, 0x07, 0xbb, 0x7f, - 0x14, 0x11, 0x6e, 0x43, 0xd0, 0x12, 0x9e, 0x81, 0xfc, 0xa7, 0x65, 0xec, 0xe1, 0xfd, 0xbe, 0xbc, - 0xf3, 0x1f, 0x47, 0xf2, 0x9f, 0x2d, 0x46, 0xc9, 0x62, 0xc8, 0x68, 0x24, 0x9f, 0x42, 0x71, 0xe7, - 0x8c, 0x0a, 0x3f, 0xf5, 0x3d, 0xae, 0x6f, 0x38, 0x9d, 0x2a, 0x2d, 0x13, 0x27, 0x0f, 0x27, 0x3d, - 0xf1, 0xcc, 0xde, 0xf3, 0x3d, 0xcf, 0xcf, 0x43, 0x39, 0x4f, 0xe9, 0x02, 0x0c, 0x87, 0x12, 0x9e, - 0x78, 0x56, 0xef, 0xe5, 0xac, 0x72, 0xc1, 0x7c, 0xa7, 0x74, 0x16, 0x52, 0x24, 0x79, 0x89, 0x27, - 0xff, 0xcb, 0x9c, 0x9c, 0xa2, 0x97, 0xde, 0x0c, 0x19, 0x91, 0xb4, 0xc4, 0x93, 0xbe, 0x8f, 0x93, - 0x7a, 0x24, 0x84, 0x5c, 0x24, 0x2c, 0xf1, 0xe4, 0x7f, 0x45, 0x90, 0x0b, 0x12, 0x42, 0xde, 0xbf, - 0x09, 0xbf, 0xf4, 0xd3, 0x29, 0xbe, 0xe8, 0x08, 0xdb, 0x9d, 0x87, 0x41, 0x9e, 0xa9, 0xc4, 0x53, - 0x7f, 0x80, 0x77, 0x2e, 0x28, 0x4a, 0x4f, 0x40, 0xba, 0x4f, 0x83, 0xff, 0x0c, 0x27, 0x65, 0xf8, - 0xa5, 0x79, 0x18, 0x0a, 0x64, 0x27, 0xf1, 0xe4, 0x7f, 0x8d, 0x93, 0x07, 0xa9, 0x88, 0xe8, 0x3c, - 0x3b, 0x89, 0x67, 0xf0, 0x41, 0x21, 0x3a, 0xa7, 0x20, 0x66, 0x13, 0x89, 0x49, 0x3c, 0xf5, 0x87, - 0x84, 0xd5, 0x05, 0x49, 0xe9, 0x19, 0xc8, 0x7a, 0x8b, 0x4d, 0x3c, 0xfd, 0x87, 0x39, 0xbd, 0x4f, - 0x43, 0x2c, 0x10, 0x58, 0xec, 0xe2, 0x59, 0xfc, 0x75, 0x61, 0x81, 0x00, 0x15, 0x99, 0x46, 0xd1, - 0x04, 0x26, 0x9e, 0xd3, 0x47, 0xc4, 0x34, 0x8a, 0xe4, 0x2f, 0x64, 0x34, 0x69, 0xcc, 0x8f, 0x67, - 0xf1, 0xb3, 0x62, 0x34, 0x29, 0x3e, 0x11, 0x23, 0x9a, 0x11, 0xc4, 0xf3, 0xf8, 0x1b, 0x42, 0x8c, - 0x48, 0x42, 0x50, 0x5a, 0x07, 0xd4, 0x9e, 0x0d, 0xc4, 0xf3, 0xfb, 0x28, 0xe7, 0x37, 0xd6, 0x96, - 0x0c, 0x94, 0x9e, 0x87, 0x63, 0x9d, 0x33, 0x81, 0x78, 0xae, 0x1f, 0xfb, 0x5e, 0x64, 0xef, 0x16, - 0x4c, 0x04, 0x4a, 0x9b, 0xfe, 0x92, 0x12, 0xcc, 0x02, 0xe2, 0xd9, 0xbe, 0xf6, 0xbd, 0x70, 0xe0, - 0x0e, 0x26, 0x01, 0xa5, 0x39, 0x00, 0x7f, 0x01, 0x8e, 0xe7, 0xf5, 0x71, 0xce, 0x2b, 0x40, 0x44, - 0xa6, 0x06, 0x5f, 0x7f, 0xe3, 0xe9, 0xaf, 0x8b, 0xa9, 0xc1, 0x29, 0xc8, 0xd4, 0x10, 0x4b, 0x6f, - 0x3c, 0xf5, 0x27, 0xc4, 0xd4, 0x10, 0x24, 0xc4, 0xb3, 0x03, 0xab, 0x5b, 0x3c, 0x87, 0x4f, 0x09, - 0xcf, 0x0e, 0x50, 0x95, 0x56, 0x61, 0xac, 0x6d, 0x41, 0x8c, 0x67, 0xf5, 0x0b, 0x9c, 0x55, 0x3e, - 0xba, 0x1e, 0x06, 0x17, 0x2f, 0xbe, 0x18, 0xc6, 0x73, 0xfb, 0x74, 0x64, 0xf1, 0xe2, 0x6b, 0x61, - 0xe9, 0x3c, 0x64, 0x8c, 0x56, 0xa3, 0x41, 0x26, 0x0f, 0xea, 0x7d, 0x36, 0xb0, 0xf0, 0x5f, 0xbe, - 0xcf, 0xad, 0x23, 0x08, 0x4a, 0x67, 0x21, 0x8d, 0x9b, 0xdb, 0xb8, 0x16, 0x47, 0xf9, 0xed, 0xef, - 0x8b, 0x80, 0x49, 0xb0, 0x4b, 0xcf, 0x00, 0xb0, 0xd2, 0x08, 0x7d, 0x3d, 0x18, 0x43, 0xfb, 0x5f, - 0xbf, 0xcf, 0x0f, 0xe3, 0xf8, 0x24, 0x3e, 0x03, 0x76, 0xb4, 0xa7, 0x37, 0x83, 0xef, 0x84, 0x19, - 0xd0, 0x11, 0x79, 0x0a, 0x06, 0x5f, 0x74, 0x4c, 0xc3, 0x55, 0xeb, 0x71, 0xd4, 0xff, 0x8d, 0x53, - 0x0b, 0x7c, 0x62, 0xb0, 0xa6, 0x69, 0x63, 0x57, 0xad, 0x3b, 0x71, 0xb4, 0xff, 0x9d, 0xd3, 0x7a, - 0x04, 0x84, 0x58, 0x53, 0x1d, 0xb7, 0x1f, 0xbd, 0xff, 0x48, 0x10, 0x0b, 0x02, 0x22, 0x34, 0xf9, - 0xbd, 0x87, 0xf7, 0xe3, 0x68, 0xbf, 0x2b, 0x84, 0xe6, 0xf8, 0xa5, 0x37, 0x43, 0x96, 0xfc, 0x64, - 0x27, 0xec, 0x62, 0x88, 0xff, 0x98, 0x13, 0xfb, 0x14, 0xa4, 0x67, 0xc7, 0xad, 0xb9, 0x7a, 0xbc, - 0xb1, 0x6f, 0xf2, 0x91, 0x16, 0xf8, 0xa5, 0x39, 0x18, 0x72, 0xdc, 0x5a, 0xad, 0xc5, 0xf3, 0xd3, - 0x18, 0xf2, 0x3f, 0xf9, 0xbe, 0x57, 0xb2, 0xf0, 0x68, 0xc8, 0x68, 0x5f, 0xdd, 0x73, 0x2d, 0x93, - 0xbe, 0x02, 0x89, 0xe3, 0xf0, 0x3d, 0xce, 0x21, 0x40, 0x52, 0x9a, 0x87, 0x1c, 0xd1, 0xc5, 0xc6, - 0x16, 0xa6, 0xef, 0xab, 0x62, 0x58, 0xfc, 0x29, 0x37, 0x40, 0x88, 0xa8, 0xfc, 0x93, 0x5f, 0x79, - 0x7d, 0x52, 0xfa, 0xfa, 0xeb, 0x93, 0xd2, 0x1f, 0xbc, 0x3e, 0x29, 0x7d, 0xe8, 0x9b, 0x93, 0x47, - 0xbe, 0xfe, 0xcd, 0xc9, 0x23, 0xbf, 0xfb, 0xcd, 0xc9, 0x23, 0x9d, 0xcb, 0xc6, 0xb0, 0x68, 0x2e, - 0x9a, 0xac, 0x60, 0xfc, 0x56, 0x39, 0x54, 0x2e, 0xae, 0x9b, 0x7e, 0xb5, 0xd6, 0xdb, 0xe4, 0xc0, - 0x9f, 0x4a, 0x64, 0xc3, 0x1c, 0xae, 0xe5, 0xaa, 0xc6, 0x7e, 0x97, 0xbb, 0x3a, 0xc5, 0x8e, 0x85, - 0x61, 0xf9, 0x4d, 0x90, 0x9c, 0x33, 0xf6, 0xd1, 0x09, 0x16, 0xf3, 0xaa, 0x2d, 0xbb, 0xc1, 0x4f, - 0x7e, 0x0d, 0x92, 0xe7, 0x2d, 0xbb, 0x81, 0x26, 0xfc, 0xe3, 0x99, 0xd2, 0xa9, 0x1c, 0x3f, 0x73, - 0x59, 0x4a, 0x7d, 0xf7, 0x53, 0x53, 0x47, 0xca, 0x7b, 0x51, 0x0d, 0xbf, 0x14, 0xab, 0x65, 0x66, - 0xce, 0xd8, 0xa7, 0x4a, 0xae, 0x4b, 0x6f, 0x4d, 0x93, 0x3e, 0x1c, 0x51, 0xd8, 0x9e, 0x8c, 0x16, - 0xb6, 0x9f, 0xc7, 0x8d, 0xc6, 0x25, 0xc3, 0xbc, 0x6a, 0x6c, 0x12, 0xb4, 0xed, 0x01, 0x76, 0x8c, - 0x18, 0x3e, 0x94, 0x80, 0xa9, 0xa8, 0xde, 0xc4, 0x71, 0x1c, 0x57, 0x6d, 0x5a, 0xdd, 0x6e, 0x2a, - 0x9d, 0x87, 0xec, 0xa6, 0xc0, 0x41, 0x05, 0x18, 0x74, 0xb0, 0x66, 0x1a, 0x35, 0x87, 0x2a, 0x9b, - 0x54, 0xc4, 0x23, 0x51, 0xd6, 0x50, 0x0d, 0xd3, 0xe1, 0xe7, 0x23, 0xd9, 0x43, 0xf9, 0xe7, 0xa4, - 0x83, 0x8d, 0xe4, 0x88, 0xd7, 0x95, 0xd0, 0xf4, 0xc1, 0x5e, 0xe5, 0x7f, 0x6a, 0x05, 0x5f, 0x85, - 0x40, 0xad, 0xbf, 0x5f, 0x93, 0xbc, 0x3b, 0x09, 0x27, 0x34, 0xd3, 0x69, 0x9a, 0x4e, 0x95, 0x8d, - 0x30, 0x7b, 0xe0, 0xc6, 0xc8, 0x05, 0x9b, 0xfa, 0xa8, 0xff, 0x5f, 0x84, 0x11, 0x3a, 0x0b, 0x68, - 0xe5, 0x93, 0x06, 0x9e, 0xd8, 0xb5, 0xe2, 0xab, 0xff, 0x36, 0x4d, 0xbd, 0x66, 0xd8, 0x23, 0xa4, - 0x47, 0x3b, 0x36, 0x61, 0x42, 0x6f, 0x5a, 0x0d, 0x4c, 0xdf, 0x01, 0x55, 0xbd, 0xb6, 0x78, 0x7e, - 0x5f, 0xe3, 0xfc, 0xc6, 0x7d, 0xf2, 0x25, 0x41, 0x5d, 0x5a, 0x86, 0x31, 0x55, 0xd3, 0xb0, 0x15, - 0x62, 0x19, 0x33, 0x43, 0x85, 0x80, 0x79, 0x4e, 0xe9, 0x71, 0x2b, 0x3f, 0xd3, 0x6d, 0x6c, 0xdf, - 0x7a, 0x6f, 0x60, 0xd0, 0x6c, 0x5c, 0xc7, 0xc6, 0xc3, 0x06, 0x76, 0xaf, 0x9a, 0xf6, 0x1e, 0x37, - 0xef, 0xc3, 0xac, 0x2b, 0x31, 0x08, 0xef, 0x4d, 0xc2, 0x24, 0x6b, 0x98, 0xdd, 0x56, 0x1d, 0x3c, - 0x7b, 0xe5, 0xd1, 0x6d, 0xec, 0xaa, 0x8f, 0xce, 0x6a, 0xa6, 0x6e, 0xf0, 0x91, 0x18, 0xe7, 0xe3, - 0x42, 0xda, 0x67, 0x78, 0x7b, 0x97, 0x89, 0xb9, 0x08, 0xa9, 0x79, 0x53, 0x37, 0x88, 0x47, 0xd6, - 0xb0, 0x61, 0x36, 0xf9, 0xb4, 0x64, 0x0f, 0xe8, 0x6e, 0x18, 0x50, 0x9b, 0x66, 0xcb, 0x70, 0xd9, - 0xeb, 0xab, 0xf2, 0xd0, 0x57, 0x6e, 0x4c, 0x1d, 0xf9, 0xbd, 0x1b, 0x53, 0xc9, 0x25, 0xc3, 0x55, - 0x78, 0x53, 0x29, 0xf5, 0xc6, 0x27, 0xa7, 0x24, 0xf9, 0x59, 0x18, 0x5c, 0xc0, 0xda, 0x61, 0x78, - 0x2d, 0x60, 0x2d, 0xc2, 0xeb, 0x01, 0xc8, 0x2c, 0x19, 0x2e, 0x3b, 0x32, 0x7b, 0x27, 0x24, 0x75, - 0x83, 0x9d, 0xc2, 0x8a, 0xf4, 0x4f, 0xe0, 0x04, 0x75, 0x01, 0x6b, 0x1e, 0x6a, 0x0d, 0x6b, 0x51, - 0x54, 0xc2, 0x9e, 0xc0, 0xcb, 0x0b, 0xbf, 0xfb, 0x9f, 0x26, 0x8f, 0xbc, 0xf2, 0xfa, 0xe4, 0x91, - 0xae, 0x23, 0x11, 0x0c, 0x87, 0xdc, 0xc4, 0x7c, 0x08, 0x9c, 0xda, 0xde, 0xac, 0x1b, 0x9a, 0x0b, - 0x7f, 0x35, 0x01, 0x93, 0x6d, 0x2e, 0xce, 0x17, 0x86, 0x6e, 0xd1, 0xa1, 0x04, 0x99, 0x05, 0xb1, - 0xde, 0x1c, 0x34, 0x38, 0xfc, 0xec, 0x01, 0x83, 0xc3, 0xb0, 0xe8, 0x49, 0xc4, 0x86, 0xd3, 0xf1, - 0xb1, 0x41, 0xc8, 0x7f, 0x88, 0xd0, 0xf0, 0xd9, 0x14, 0xdc, 0x49, 0x2f, 0x8f, 0xd8, 0x4d, 0xdd, - 0x70, 0x67, 0x35, 0x7b, 0xdf, 0x72, 0xe9, 0x72, 0x62, 0xee, 0x70, 0x6b, 0x8c, 0xf9, 0xcd, 0x33, - 0xac, 0xb9, 0x8b, 0x4b, 0xee, 0x40, 0x7a, 0x9d, 0xd0, 0x11, 0x43, 0xb8, 0xa6, 0xab, 0x36, 0xb8, - 0x81, 0xd8, 0x03, 0x81, 0xb2, 0x0b, 0x27, 0x09, 0x06, 0xd5, 0xc5, 0x5d, 0x93, 0x06, 0x56, 0x77, - 0xd8, 0xb9, 0xdd, 0x24, 0x5d, 0x42, 0x32, 0x04, 0x40, 0x8f, 0xe8, 0x4e, 0x40, 0x5a, 0x6d, 0xb1, - 0x57, 0xce, 0x49, 0xb2, 0xb6, 0xd0, 0x07, 0xf9, 0x12, 0x0c, 0xf2, 0xd7, 0x5c, 0x28, 0x0f, 0xc9, - 0x3d, 0xbc, 0x4f, 0xfb, 0xc9, 0x29, 0xe4, 0x27, 0x9a, 0x81, 0x34, 0x15, 0x9e, 0x5f, 0x48, 0x28, - 0xcc, 0xb4, 0x49, 0x3f, 0x43, 0x85, 0x54, 0x18, 0x9a, 0xfc, 0x2c, 0x64, 0x16, 0xcc, 0xa6, 0x6e, - 0x98, 0x61, 0x6e, 0x59, 0xc6, 0x8d, 0xca, 0x6c, 0xb5, 0xb8, 0xeb, 0x2b, 0xec, 0x01, 0x1d, 0x83, - 0x01, 0x76, 0x8e, 0x9b, 0xbf, 0x36, 0xe7, 0x4f, 0xf2, 0x3c, 0x0c, 0x52, 0xde, 0x6b, 0x16, 0x42, - 0xfc, 0x06, 0x10, 0x3f, 0x30, 0x4e, 0xa3, 0x24, 0x67, 0x9f, 0xf0, 0x85, 0x45, 0x90, 0xaa, 0xa9, - 0xae, 0xca, 0xf5, 0xa6, 0xbf, 0xe5, 0xa7, 0x21, 0xc3, 0x99, 0x38, 0xe8, 0x0c, 0x24, 0x4d, 0xcb, - 0xe1, 0x2f, 0xbe, 0x8b, 0xdd, 0x54, 0x59, 0xb3, 0xca, 0x29, 0x32, 0x69, 0x14, 0x82, 0x5c, 0x56, - 0xba, 0xce, 0x92, 0x27, 0x03, 0x8e, 0x14, 0x18, 0xf2, 0xc0, 0x4f, 0x36, 0xa4, 0x6d, 0xee, 0xe0, - 0x39, 0xcb, 0xa7, 0x12, 0x30, 0x19, 0x68, 0xbd, 0x82, 0x6d, 0xb2, 0xd7, 0x63, 0x13, 0x8c, 0x7b, - 0x0b, 0x0a, 0x08, 0xc9, 0xdb, 0xbb, 0xb8, 0xcb, 0x9b, 0x21, 0x39, 0x67, 0x59, 0xa8, 0x08, 0x19, - 0xf6, 0x82, 0xdb, 0x64, 0xfe, 0x92, 0x52, 0xbc, 0x67, 0xd2, 0xe6, 0x98, 0x3b, 0xee, 0x55, 0xd5, - 0xf6, 0xae, 0x3a, 0x89, 0x67, 0xf9, 0x29, 0xc8, 0xce, 0x9b, 0x86, 0x83, 0x0d, 0xa7, 0x45, 0xa7, - 0xde, 0x76, 0xc3, 0xd4, 0xf6, 0x38, 0x07, 0xf6, 0x40, 0x0c, 0xae, 0x5a, 0x16, 0xa5, 0x4c, 0x29, - 0xe4, 0x27, 0x0b, 0x53, 0xe5, 0x8d, 0xae, 0x26, 0x7a, 0xea, 0xe0, 0x26, 0xe2, 0x4a, 0x7a, 0x36, - 0xfa, 0xdf, 0x12, 0x9c, 0x6c, 0x9f, 0x50, 0x7b, 0x78, 0xdf, 0x39, 0xe8, 0x7c, 0x7a, 0x01, 0xb2, - 0xeb, 0xf4, 0xbe, 0xf1, 0x25, 0xbc, 0x8f, 0x8a, 0x30, 0x88, 0x6b, 0x67, 0xce, 0x9e, 0x7d, 0xf4, - 0x29, 0xe6, 0xed, 0x17, 0x8f, 0x28, 0x02, 0x80, 0x26, 0x21, 0xeb, 0x60, 0xcd, 0x3a, 0x73, 0xf6, - 0xdc, 0xde, 0xa3, 0xcc, 0xbd, 0x2e, 0x1e, 0x51, 0x7c, 0x50, 0x29, 0x43, 0xb4, 0x7e, 0xe3, 0x53, - 0x53, 0x52, 0x39, 0x0d, 0x49, 0xa7, 0xd5, 0xbc, 0xad, 0x3e, 0xf2, 0x5a, 0x1a, 0xa6, 0x83, 0x94, - 0x34, 0x40, 0x5d, 0x51, 0x1b, 0x7a, 0x4d, 0xf5, 0x6f, 0x8a, 0xe7, 0x03, 0x36, 0xa0, 0x18, 0x9d, - 0x4d, 0x50, 0xec, 0x69, 0x49, 0xf9, 0xd7, 0x25, 0xc8, 0x5d, 0x16, 0x9c, 0x37, 0xb0, 0x8b, 0xce, - 0x03, 0x78, 0x3d, 0x89, 0x69, 0x73, 0xc7, 0x4c, 0xb4, 0xaf, 0x19, 0x8f, 0x46, 0x09, 0xa0, 0xa3, - 0x27, 0xa8, 0x23, 0x5a, 0xa6, 0xc3, 0xaf, 0xbf, 0xc4, 0x90, 0x7a, 0xc8, 0xe8, 0x21, 0x40, 0x34, - 0xc2, 0x55, 0xaf, 0x98, 0xae, 0x6e, 0xd4, 0xab, 0x96, 0x79, 0x95, 0x5f, 0x2a, 0x4c, 0x2a, 0x79, - 0xda, 0x72, 0x99, 0x36, 0xac, 0x13, 0x38, 0x11, 0x3a, 0xeb, 0x71, 0x21, 0xab, 0x89, 0x5a, 0xab, - 0xd9, 0xd8, 0x71, 0x78, 0x10, 0x13, 0x8f, 0xe8, 0x3c, 0x0c, 0x5a, 0xad, 0xed, 0xaa, 0x88, 0x18, - 0x43, 0x67, 0x4e, 0x76, 0x9a, 0xff, 0xc2, 0x3f, 0x78, 0x04, 0x18, 0xb0, 0x5a, 0xdb, 0xc4, 0x5b, - 0xee, 0x82, 0x5c, 0x07, 0x61, 0x86, 0xae, 0xf8, 0x72, 0xd0, 0x6b, 0xee, 0x5c, 0x83, 0xaa, 0x65, - 0xeb, 0xa6, 0xad, 0xbb, 0xfb, 0xf4, 0xf4, 0x4a, 0x52, 0xc9, 0x8b, 0x86, 0x75, 0x0e, 0x97, 0xf7, - 0x60, 0x74, 0x83, 0xa6, 0x5a, 0xbe, 0xe4, 0x67, 0x7d, 0xf9, 0xa4, 0x78, 0xf9, 0xba, 0x4a, 0x96, - 0x68, 0x93, 0xac, 0xfc, 0x5c, 0x57, 0xef, 0x7c, 0xe2, 0xe0, 0xde, 0x19, 0x5e, 0xfc, 0xff, 0xe8, - 0x44, 0x68, 0x72, 0xf2, 0xcc, 0x3a, 0x10, 0xbe, 0xfa, 0x75, 0xcc, 0xb8, 0x1d, 0x46, 0xb1, 0xf7, - 0xa2, 0x5a, 0x8c, 0x09, 0xa3, 0xc5, 0xd8, 0x29, 0x24, 0x3f, 0x05, 0xc3, 0xeb, 0xaa, 0xed, 0x6e, - 0x60, 0xf7, 0x22, 0x56, 0x6b, 0xd8, 0x0e, 0xaf, 0xba, 0xc3, 0x62, 0xd5, 0x45, 0x90, 0xa2, 0x4b, - 0x2b, 0x5b, 0x75, 0xe8, 0x6f, 0x79, 0x17, 0x52, 0xf4, 0x04, 0x9b, 0xb7, 0x22, 0x73, 0x0a, 0xb6, - 0x22, 0x93, 0x58, 0xba, 0xef, 0x62, 0x47, 0x6c, 0xe8, 0xe8, 0x03, 0x7a, 0x5c, 0xac, 0xab, 0xc9, - 0xde, 0xeb, 0x2a, 0x77, 0x44, 0xbe, 0xba, 0x36, 0x60, 0xb0, 0x4c, 0x42, 0xf1, 0xd2, 0x82, 0x27, - 0x88, 0xe4, 0x0b, 0x82, 0x56, 0x60, 0xd4, 0x52, 0x6d, 0x97, 0x1e, 0xdd, 0xdf, 0xa5, 0x5a, 0x70, - 0x5f, 0x9f, 0x6a, 0x9f, 0x79, 0x21, 0x65, 0x79, 0x2f, 0xc3, 0x56, 0x10, 0x28, 0xff, 0x61, 0x0a, - 0x06, 0xb8, 0x31, 0xde, 0x0c, 0x83, 0xdc, 0xac, 0xdc, 0x3b, 0xef, 0x9c, 0x69, 0x5f, 0x98, 0x66, - 0xbc, 0x05, 0x84, 0xf3, 0x13, 0x34, 0xe8, 0x3e, 0xc8, 0x68, 0xbb, 0xaa, 0x6e, 0x54, 0xf5, 0x9a, - 0xc8, 0x7a, 0x5f, 0xbf, 0x31, 0x35, 0x38, 0x4f, 0x60, 0x4b, 0x0b, 0xca, 0x20, 0x6d, 0x5c, 0xaa, - 0x91, 0x4c, 0x60, 0x17, 0xeb, 0xf5, 0x5d, 0x97, 0xcf, 0x30, 0xfe, 0x84, 0x9e, 0x84, 0x14, 0x71, - 0x08, 0x7e, 0xb1, 0xab, 0xd8, 0xb6, 0xf7, 0xf0, 0x36, 0x80, 0xe5, 0x0c, 0xe9, 0xf8, 0x43, 0xbf, - 0x3f, 0x25, 0x29, 0x94, 0x02, 0xcd, 0xc3, 0x70, 0x43, 0x75, 0xdc, 0x2a, 0x5d, 0xc1, 0x48, 0xf7, - 0x69, 0xca, 0xe2, 0x44, 0xbb, 0x41, 0xb8, 0x61, 0xb9, 0xe8, 0x43, 0x84, 0x8a, 0x81, 0x6a, 0xe8, - 0x14, 0xe4, 0x29, 0x13, 0xcd, 0x6c, 0x36, 0x75, 0x97, 0xe5, 0x56, 0x03, 0xd4, 0xee, 0x23, 0x04, - 0x3e, 0x4f, 0xc1, 0x34, 0xc3, 0xba, 0x03, 0xb2, 0xf4, 0x2a, 0x09, 0x45, 0x61, 0xc7, 0x26, 0x33, - 0x04, 0x40, 0x1b, 0xef, 0x87, 0x51, 0x3f, 0x3e, 0x32, 0x94, 0x0c, 0xe3, 0xe2, 0x83, 0x29, 0xe2, - 0x23, 0x30, 0x61, 0xe0, 0x6b, 0xf4, 0x20, 0x67, 0x08, 0x3b, 0x4b, 0xb1, 0x11, 0x69, 0xbb, 0x1c, - 0xa6, 0xb8, 0x17, 0x46, 0x34, 0x61, 0x7c, 0x86, 0x0b, 0x14, 0x77, 0xd8, 0x83, 0x52, 0xb4, 0x13, - 0x90, 0x51, 0x2d, 0x8b, 0x21, 0x0c, 0xf1, 0xf8, 0x68, 0x59, 0xb4, 0xe9, 0x34, 0x8c, 0x51, 0x1d, - 0x6d, 0xec, 0xb4, 0x1a, 0x2e, 0x67, 0x92, 0xa3, 0x38, 0xa3, 0xa4, 0x41, 0x61, 0x70, 0x8a, 0x7b, - 0x37, 0x0c, 0xe3, 0x2b, 0x7a, 0x0d, 0x1b, 0x1a, 0x66, 0x78, 0xc3, 0x14, 0x2f, 0x27, 0x80, 0x14, - 0xe9, 0x01, 0xf0, 0xe2, 0x5e, 0x55, 0xc4, 0xe4, 0x11, 0xc6, 0x4f, 0xc0, 0xe7, 0x18, 0x58, 0x2e, - 0x40, 0x6a, 0x41, 0x75, 0x55, 0x92, 0x60, 0xb8, 0xd7, 0xd8, 0x42, 0x93, 0x53, 0xc8, 0x4f, 0xf9, - 0x8d, 0x04, 0xa4, 0x2e, 0x9b, 0x2e, 0x46, 0x8f, 0x05, 0x12, 0xc0, 0x91, 0x4e, 0xfe, 0xbc, 0xa1, - 0xd7, 0x0d, 0x5c, 0x5b, 0x71, 0xea, 0x81, 0x7b, 0xdf, 0xbe, 0x3b, 0x25, 0x42, 0xee, 0x34, 0x01, - 0x69, 0xdb, 0x6c, 0x19, 0x35, 0x71, 0xe2, 0x90, 0x3e, 0xa0, 0x0a, 0x64, 0x3c, 0x2f, 0x49, 0xc5, - 0x79, 0xc9, 0x28, 0xf1, 0x12, 0xe2, 0xc3, 0x1c, 0xa0, 0x0c, 0x6e, 0x73, 0x67, 0x29, 0x43, 0xd6, - 0x0b, 0x5e, 0xdc, 0xdb, 0xfa, 0x73, 0x58, 0x9f, 0x8c, 0x2c, 0x26, 0xde, 0xd8, 0x7b, 0xc6, 0x63, - 0x1e, 0x97, 0xf7, 0x1a, 0xb8, 0xf5, 0x42, 0x6e, 0xc5, 0xef, 0xa0, 0x0f, 0x52, 0xbd, 0x7c, 0xb7, - 0x62, 0xf7, 0xd0, 0x4f, 0x42, 0xd6, 0xd1, 0xeb, 0x86, 0xea, 0xb6, 0x6c, 0xcc, 0x3d, 0xcf, 0x07, - 0xc8, 0x5f, 0x92, 0x60, 0x80, 0x79, 0x72, 0xc0, 0x6e, 0x52, 0x67, 0xbb, 0x25, 0xba, 0xd9, 0x2d, - 0x79, 0x78, 0xbb, 0xcd, 0x01, 0x78, 0xc2, 0x38, 0xfc, 0x6a, 0x70, 0x87, 0x8c, 0x81, 0x89, 0xb8, - 0xa1, 0xd7, 0xf9, 0x44, 0x0d, 0x10, 0xc9, 0xff, 0x51, 0x22, 0x49, 0x2c, 0x6f, 0x47, 0x73, 0x30, - 0x2c, 0xe4, 0xaa, 0xee, 0x34, 0xd4, 0x3a, 0xf7, 0x9d, 0x3b, 0xbb, 0x0a, 0x77, 0xa1, 0xa1, 0xd6, - 0x95, 0x21, 0x2e, 0x0f, 0x79, 0xe8, 0x3c, 0x0e, 0x89, 0x2e, 0xe3, 0x10, 0x1a, 0xf8, 0xe4, 0xe1, - 0x06, 0x3e, 0x34, 0x44, 0xa9, 0xe8, 0x10, 0x7d, 0x3e, 0x41, 0x37, 0x33, 0x96, 0xe9, 0xa8, 0x8d, - 0x1f, 0xc6, 0x8c, 0xb8, 0x03, 0xb2, 0x96, 0xd9, 0xa8, 0xb2, 0x16, 0x76, 0x12, 0x37, 0x63, 0x99, - 0x0d, 0xa5, 0x6d, 0xd8, 0xd3, 0xb7, 0x68, 0xba, 0x0c, 0xdc, 0x02, 0xab, 0x0d, 0x46, 0xad, 0x66, - 0x43, 0x8e, 0x99, 0x82, 0xaf, 0x65, 0x8f, 0x10, 0x1b, 0xd0, 0xc5, 0x51, 0x6a, 0x5f, 0x7b, 0x99, - 0xd8, 0x0c, 0x53, 0xe1, 0x78, 0x84, 0x82, 0x85, 0xfe, 0x4e, 0xbb, 0xe0, 0xa0, 0x5b, 0x2a, 0x1c, - 0x4f, 0xfe, 0x39, 0x09, 0x60, 0x99, 0x58, 0x96, 0xea, 0x4b, 0x56, 0x21, 0x87, 0x8a, 0x50, 0x0d, - 0xf5, 0x3c, 0xd9, 0x6d, 0xd0, 0x78, 0xff, 0x39, 0x27, 0x28, 0xf7, 0x3c, 0x0c, 0xfb, 0xce, 0xe8, - 0x60, 0x21, 0xcc, 0x64, 0x8f, 0xac, 0x7a, 0x03, 0xbb, 0x4a, 0xee, 0x4a, 0xe0, 0x49, 0xfe, 0x67, - 0x12, 0x64, 0xa9, 0x4c, 0x2b, 0xd8, 0x55, 0x43, 0x63, 0x28, 0x1d, 0x7e, 0x0c, 0xef, 0x04, 0x60, - 0x6c, 0x1c, 0xfd, 0x65, 0xcc, 0x3d, 0x2b, 0x4b, 0x21, 0x1b, 0xfa, 0xcb, 0x18, 0x9d, 0xf3, 0x0c, - 0x9e, 0xec, 0x6d, 0x70, 0x91, 0x75, 0x73, 0xb3, 0x1f, 0x87, 0x41, 0xfa, 0x29, 0x9d, 0x6b, 0x0e, - 0x4f, 0xa4, 0x07, 0x8c, 0x56, 0x73, 0xf3, 0x9a, 0x23, 0xbf, 0x08, 0x83, 0x9b, 0xd7, 0x58, 0x6d, - 0xe4, 0x0e, 0xc8, 0xda, 0xa6, 0xc9, 0xd7, 0x64, 0x96, 0x0b, 0x65, 0x08, 0x80, 0x2e, 0x41, 0xa2, - 0x1e, 0x90, 0xf0, 0xeb, 0x01, 0x7e, 0x41, 0x23, 0xd9, 0x57, 0x41, 0xe3, 0xf4, 0xbf, 0x93, 0x60, - 0x28, 0x10, 0x1f, 0xd0, 0xa3, 0x70, 0xb4, 0xbc, 0xbc, 0x36, 0x7f, 0xa9, 0xba, 0xb4, 0x50, 0xbd, - 0xb0, 0x3c, 0xb7, 0xe8, 0xdf, 0x35, 0x29, 0x1e, 0x7b, 0xf5, 0xfa, 0x34, 0x0a, 0xe0, 0x6e, 0x19, - 0x7b, 0x86, 0x79, 0xd5, 0x40, 0xb3, 0x30, 0x11, 0x26, 0x99, 0x2b, 0x6f, 0x54, 0x56, 0x37, 0xf3, - 0x52, 0xf1, 0xe8, 0xab, 0xd7, 0xa7, 0xc7, 0x02, 0x14, 0x73, 0xdb, 0x0e, 0x36, 0xdc, 0x76, 0x82, - 0xf9, 0xb5, 0x95, 0x95, 0xa5, 0xcd, 0x7c, 0xa2, 0x8d, 0x80, 0x07, 0xec, 0x07, 0x60, 0x2c, 0x4c, - 0xb0, 0xba, 0xb4, 0x9c, 0x4f, 0x16, 0xd1, 0xab, 0xd7, 0xa7, 0x47, 0x02, 0xd8, 0xab, 0x7a, 0xa3, - 0x98, 0x79, 0xff, 0xa7, 0x27, 0x8f, 0xfc, 0xd2, 0x2f, 0x4e, 0x4a, 0x44, 0xb3, 0xe1, 0x50, 0x8c, - 0x40, 0x0f, 0xc1, 0xf1, 0x8d, 0xa5, 0xc5, 0xd5, 0xca, 0x42, 0x75, 0x65, 0x63, 0xb1, 0xca, 0xbe, - 0xb1, 0xe1, 0x69, 0x37, 0xfa, 0xea, 0xf5, 0xe9, 0x21, 0xae, 0x52, 0x37, 0xec, 0x75, 0xa5, 0x72, - 0x79, 0x6d, 0xb3, 0x92, 0x97, 0x18, 0xf6, 0xba, 0x8d, 0xaf, 0x98, 0x2e, 0xfb, 0xd6, 0xd6, 0x23, - 0x70, 0xa2, 0x03, 0xb6, 0xa7, 0xd8, 0xd8, 0xab, 0xd7, 0xa7, 0x87, 0xd7, 0x6d, 0xcc, 0xe6, 0x0f, - 0xa5, 0x98, 0x81, 0x42, 0x3b, 0xc5, 0xda, 0xfa, 0xda, 0xc6, 0xdc, 0x72, 0x7e, 0xba, 0x98, 0x7f, - 0xf5, 0xfa, 0x74, 0x4e, 0x04, 0x43, 0x82, 0xef, 0x6b, 0x76, 0x3b, 0x77, 0x3c, 0x7f, 0xf2, 0x30, - 0xdc, 0xc3, 0x4b, 0xa2, 0x8e, 0xab, 0xee, 0xe9, 0x46, 0xdd, 0x2b, 0x3c, 0xf3, 0x67, 0xbe, 0xf3, - 0x39, 0xc6, 0x6b, 0xcf, 0x02, 0xda, 0xb3, 0xfc, 0x5c, 0xec, 0xfe, 0x66, 0xa9, 0x18, 0x53, 0x5d, - 0x8d, 0xdf, 0x3a, 0x75, 0x7f, 0x55, 0x51, 0x8c, 0x29, 0xa0, 0x17, 0x7b, 0x6e, 0xee, 0xe4, 0x0f, - 0x48, 0x30, 0x72, 0x51, 0x77, 0x5c, 0xd3, 0xd6, 0x35, 0xb5, 0x41, 0x6f, 0x98, 0x9c, 0xeb, 0x37, - 0xb6, 0x46, 0xa6, 0xfa, 0x33, 0x30, 0x70, 0x45, 0x6d, 0xb0, 0xa0, 0x96, 0xa4, 0x1f, 0xc4, 0xe8, - 0x6c, 0x3e, 0x3f, 0xb4, 0x09, 0x06, 0x8c, 0x4c, 0xfe, 0x95, 0x04, 0x8c, 0xd2, 0xc9, 0xe0, 0xb0, - 0x4f, 0x25, 0x91, 0x3d, 0x56, 0x19, 0x52, 0xb6, 0xea, 0xf2, 0xa2, 0x61, 0x79, 0x86, 0x17, 0xc2, - 0xef, 0x8b, 0x2f, 0x6e, 0xcf, 0x2c, 0x60, 0x4d, 0xa1, 0xb4, 0xe8, 0xed, 0x90, 0x69, 0xaa, 0xd7, - 0xaa, 0x94, 0x0f, 0xdb, 0xb9, 0xcc, 0x1d, 0x8c, 0xcf, 0xcd, 0x1b, 0x53, 0xa3, 0xfb, 0x6a, 0xb3, - 0x51, 0x92, 0x05, 0x1f, 0x59, 0x19, 0x6c, 0xaa, 0xd7, 0x88, 0x88, 0xc8, 0x82, 0x51, 0x02, 0xd5, - 0x76, 0x55, 0xa3, 0x8e, 0x59, 0x27, 0xb4, 0x04, 0x5a, 0xbe, 0x78, 0xe0, 0x4e, 0x8e, 0xf9, 0x9d, - 0x04, 0xd8, 0xc9, 0xca, 0x70, 0x53, 0xbd, 0x36, 0x4f, 0x01, 0xa4, 0xc7, 0x52, 0xe6, 0xa3, 0x9f, - 0x9c, 0x3a, 0x42, 0x5f, 0x2e, 0x7c, 0x43, 0x02, 0xf0, 0x2d, 0x86, 0xde, 0x0e, 0x79, 0xcd, 0x7b, - 0xa2, 0xb4, 0x0e, 0x1f, 0xc3, 0xfb, 0xbb, 0x8d, 0x45, 0xc4, 0xde, 0x6c, 0x6d, 0xfe, 0xfa, 0x8d, - 0x29, 0x49, 0x19, 0xd5, 0x22, 0x43, 0xf1, 0x36, 0x18, 0x6a, 0x59, 0x35, 0xd5, 0xc5, 0x55, 0xba, - 0x8f, 0x4b, 0xc4, 0xae, 0xf3, 0x93, 0x84, 0xd7, 0xcd, 0x1b, 0x53, 0x88, 0xa9, 0x15, 0x20, 0x96, - 0xe9, 0xea, 0x0f, 0x0c, 0x42, 0x08, 0x02, 0x3a, 0x7d, 0x55, 0x82, 0xa1, 0x85, 0xc0, 0x49, 0xaf, - 0x02, 0x0c, 0x36, 0x4d, 0x43, 0xdf, 0xe3, 0xfe, 0x98, 0x55, 0xc4, 0x23, 0x2a, 0x42, 0x86, 0x5d, - 0xba, 0x73, 0xf7, 0x45, 0x29, 0x54, 0x3c, 0x13, 0xaa, 0xab, 0x78, 0xdb, 0xd1, 0xc5, 0x68, 0x28, - 0xe2, 0x11, 0x5d, 0x80, 0xbc, 0x83, 0xb5, 0x96, 0xad, 0xbb, 0xfb, 0x55, 0xcd, 0x34, 0x5c, 0x55, - 0x73, 0xd9, 0xf5, 0xad, 0xf2, 0x1d, 0x37, 0x6f, 0x4c, 0x1d, 0x67, 0xb2, 0x46, 0x31, 0x64, 0x65, - 0x54, 0x80, 0xe6, 0x19, 0x84, 0xf4, 0x50, 0xc3, 0xae, 0xaa, 0x37, 0x9c, 0x02, 0x7b, 0x4f, 0x26, - 0x1e, 0x03, 0xba, 0x7c, 0x6e, 0x30, 0x58, 0xd8, 0xba, 0x00, 0x79, 0xd3, 0xc2, 0x76, 0x28, 0x11, - 0x95, 0xa2, 0x3d, 0x47, 0x31, 0x64, 0x65, 0x54, 0x80, 0x44, 0x92, 0xea, 0x92, 0x61, 0x16, 0x1b, - 0x45, 0xab, 0xb5, 0xed, 0xd7, 0xc3, 0x26, 0xda, 0x46, 0x63, 0xce, 0xd8, 0x2f, 0x3f, 0xe6, 0x73, - 0x8f, 0xd2, 0xc9, 0x5f, 0xfb, 0xc2, 0xc3, 0x13, 0xdc, 0x35, 0xfc, 0xfa, 0xd4, 0x25, 0xbc, 0x4f, - 0x86, 0x9f, 0xa3, 0xae, 0x53, 0x4c, 0x92, 0x76, 0xbe, 0xa8, 0xea, 0x0d, 0x71, 0x0d, 0x59, 0xe1, - 0x4f, 0xa8, 0x04, 0x03, 0x8e, 0xab, 0xba, 0x2d, 0x87, 0x7f, 0x1c, 0x4c, 0xee, 0xe6, 0x6a, 0x65, - 0xd3, 0xa8, 0x6d, 0x50, 0x4c, 0x85, 0x53, 0xa0, 0x0b, 0x30, 0xe0, 0x9a, 0x7b, 0xd8, 0xe0, 0x26, - 0x3c, 0xd0, 0xfc, 0xa6, 0xaf, 0xed, 0x18, 0x35, 0xb1, 0x48, 0x0d, 0x37, 0x70, 0x9d, 0xa5, 0x55, - 0xbb, 0x2a, 0xd9, 0x7d, 0xd0, 0x6f, 0x84, 0x95, 0x97, 0x0e, 0x3c, 0x09, 0xb9, 0xa5, 0xa2, 0xfc, - 0x64, 0x65, 0xd4, 0x03, 0x6d, 0x50, 0x08, 0xba, 0x14, 0x3a, 0x92, 0xc8, 0x3f, 0xa4, 0x77, 0x77, - 0x37, 0xf5, 0x03, 0x3e, 0x2d, 0xea, 0x13, 0xc1, 0x03, 0x8d, 0x17, 0x20, 0xdf, 0x32, 0xb6, 0x4d, - 0x83, 0xde, 0x15, 0xe4, 0xf9, 0x3d, 0xd9, 0xdf, 0x25, 0x83, 0xce, 0x11, 0xc5, 0x90, 0x95, 0x51, - 0x0f, 0x74, 0x91, 0xed, 0x02, 0x6a, 0x30, 0xe2, 0x63, 0xd1, 0x89, 0x9a, 0x8d, 0x9d, 0xa8, 0x77, - 0xf1, 0x89, 0x7a, 0x34, 0xda, 0x8b, 0x3f, 0x57, 0x87, 0x3d, 0x20, 0x21, 0x43, 0x17, 0x01, 0xfc, - 0xf0, 0x40, 0xeb, 0x14, 0x43, 0xdd, 0x07, 0xde, 0x8f, 0x31, 0x62, 0xbf, 0xe7, 0xd3, 0xa2, 0x77, - 0xc2, 0x78, 0x53, 0x37, 0xaa, 0x0e, 0x6e, 0xec, 0x54, 0xb9, 0x81, 0x09, 0x4b, 0xfa, 0xa9, 0x97, - 0xf2, 0xf2, 0xc1, 0xfc, 0xe1, 0xe6, 0x8d, 0xa9, 0x22, 0x0f, 0xa1, 0xed, 0x2c, 0x65, 0x65, 0xac, - 0xa9, 0x1b, 0x1b, 0xb8, 0xb1, 0xb3, 0xe0, 0xc1, 0x4a, 0xb9, 0xf7, 0x7f, 0x72, 0xea, 0x08, 0x9f, - 0xae, 0x47, 0xe4, 0x73, 0xb4, 0x76, 0xce, 0xa7, 0x19, 0x76, 0xc8, 0x9e, 0x44, 0x15, 0x0f, 0xb4, - 0xa2, 0x91, 0x55, 0x7c, 0x00, 0x9b, 0xe6, 0xaf, 0xfc, 0x87, 0x69, 0x49, 0xfe, 0x9c, 0x04, 0x03, - 0x0b, 0x97, 0xd7, 0x55, 0xdd, 0x46, 0x4b, 0x30, 0xe6, 0x7b, 0x4e, 0x78, 0x92, 0x9f, 0xbc, 0x79, - 0x63, 0xaa, 0x10, 0x75, 0x2e, 0x6f, 0x96, 0xfb, 0x0e, 0x2c, 0xa6, 0xf9, 0x52, 0xb7, 0x8d, 0x6b, - 0x88, 0x55, 0x1b, 0x8a, 0xdc, 0xbe, 0xad, 0x8d, 0xa8, 0x59, 0x81, 0x41, 0x26, 0xad, 0x83, 0x4a, - 0x90, 0xb6, 0xc8, 0x0f, 0xfe, 0x62, 0x60, 0xb2, 0xab, 0xf3, 0x52, 0x7c, 0xaf, 0x90, 0x49, 0x48, - 0xe4, 0x0f, 0x27, 0x00, 0x16, 0x2e, 0x5f, 0xde, 0xb4, 0x75, 0xab, 0x81, 0xdd, 0x5b, 0xa9, 0xf9, - 0x26, 0x1c, 0x0d, 0xec, 0x92, 0x6c, 0x2d, 0xa2, 0xfd, 0xf4, 0xcd, 0x1b, 0x53, 0x27, 0xa3, 0xda, - 0x07, 0xd0, 0x64, 0x65, 0xdc, 0xdf, 0x2f, 0xd9, 0x5a, 0x47, 0xae, 0x35, 0xc7, 0xf5, 0xb8, 0x26, - 0xbb, 0x73, 0x0d, 0xa0, 0x05, 0xb9, 0x2e, 0x38, 0x6e, 0x67, 0xd3, 0x6e, 0xc0, 0x90, 0x6f, 0x12, - 0x07, 0x2d, 0x40, 0xc6, 0xe5, 0xbf, 0xb9, 0x85, 0xe5, 0xee, 0x16, 0x16, 0x64, 0xdc, 0xca, 0x1e, - 0xa5, 0xfc, 0x67, 0x12, 0x80, 0xef, 0xb3, 0x3f, 0x9e, 0x2e, 0x46, 0x42, 0x39, 0x0f, 0xbc, 0xc9, - 0x43, 0xa5, 0x6a, 0x9c, 0x3a, 0x62, 0xcf, 0x9f, 0x4e, 0xc0, 0xf8, 0x96, 0x88, 0x3c, 0x3f, 0xf6, - 0x36, 0x58, 0x87, 0x41, 0x6c, 0xb8, 0xb6, 0x4e, 0x8d, 0x40, 0x46, 0xfb, 0x91, 0x6e, 0xa3, 0xdd, - 0x41, 0x27, 0xfa, 0xb1, 0x1b, 0x51, 0x74, 0xe7, 0x6c, 0x22, 0xd6, 0xf8, 0x60, 0x12, 0x0a, 0xdd, - 0x28, 0xd1, 0x3c, 0x8c, 0x6a, 0x36, 0xa6, 0x80, 0x6a, 0xb0, 0xf2, 0x57, 0x2e, 0xfa, 0x99, 0x65, - 0x04, 0x41, 0x56, 0x46, 0x04, 0x84, 0xaf, 0x1e, 0x75, 0x20, 0x69, 0x1f, 0x71, 0x3b, 0x82, 0xd5, - 0x67, 0x9e, 0x27, 0xf3, 0xe5, 0x43, 0x74, 0x12, 0x66, 0xc0, 0xd6, 0x8f, 0x11, 0x1f, 0x4a, 0x17, - 0x90, 0x97, 0x60, 0x54, 0x37, 0x74, 0x57, 0x57, 0x1b, 0xd5, 0x6d, 0xb5, 0xa1, 0x1a, 0xda, 0x61, - 0xb2, 0x66, 0x16, 0xf2, 0x79, 0xb7, 0x11, 0x76, 0xb2, 0x32, 0xc2, 0x21, 0x65, 0x06, 0x40, 0x17, - 0x61, 0x50, 0x74, 0x95, 0x3a, 0x54, 0xb6, 0x21, 0xc8, 0x03, 0x09, 0xde, 0xcf, 0x24, 0x61, 0x4c, - 0xc1, 0xb5, 0xff, 0x3f, 0x14, 0x07, 0x1b, 0x8a, 0x15, 0x00, 0x36, 0xdd, 0x49, 0x80, 0x3d, 0xc4, - 0x68, 0x90, 0x80, 0x91, 0x65, 0x1c, 0x16, 0x1c, 0x37, 0x30, 0x1e, 0x37, 0x12, 0x90, 0x0b, 0x8e, - 0xc7, 0x5f, 0xd0, 0x55, 0x09, 0x2d, 0xf9, 0x91, 0x28, 0xc5, 0x3f, 0x11, 0xda, 0x25, 0x12, 0xb5, - 0x79, 0x6f, 0xef, 0x10, 0xf4, 0x3f, 0x12, 0x30, 0xb0, 0xae, 0xda, 0x6a, 0xd3, 0x41, 0x5a, 0x5b, - 0xa6, 0x29, 0xca, 0x8f, 0x6d, 0x1f, 0x82, 0xe6, 0xd5, 0x8e, 0x98, 0x44, 0xf3, 0xa3, 0x1d, 0x12, - 0xcd, 0x9f, 0x80, 0x11, 0xb2, 0x1d, 0x0e, 0x1c, 0x61, 0x20, 0xd6, 0x1e, 0x2e, 0x9f, 0xf0, 0xb9, - 0x84, 0xdb, 0xd9, 0x6e, 0xf9, 0x72, 0xf0, 0x0c, 0xc3, 0x10, 0xc1, 0xf0, 0x03, 0x33, 0x21, 0x3f, - 0xe6, 0x6f, 0x4b, 0x03, 0x8d, 0xb2, 0x02, 0x4d, 0xf5, 0x5a, 0x85, 0x3d, 0xa0, 0x65, 0x40, 0xbb, - 0x5e, 0x65, 0xa4, 0xea, 0x9b, 0x93, 0xd0, 0xdf, 0x79, 0xf3, 0xc6, 0xd4, 0x09, 0x46, 0xdf, 0x8e, - 0x23, 0x2b, 0x63, 0x3e, 0x50, 0x70, 0x7b, 0x1c, 0x80, 0xe8, 0x55, 0x65, 0xa7, 0x09, 0xd9, 0x76, - 0xe7, 0xe8, 0xcd, 0x1b, 0x53, 0x63, 0x8c, 0x8b, 0xdf, 0x26, 0x2b, 0x59, 0xf2, 0xb0, 0x40, 0x7e, - 0x07, 0x3c, 0xfb, 0xd3, 0x12, 0x20, 0x3f, 0xe4, 0x2b, 0xd8, 0xb1, 0xc8, 0xfe, 0x8c, 0x24, 0xe2, - 0x81, 0xac, 0x59, 0xea, 0x9d, 0x88, 0xfb, 0xf4, 0x22, 0x11, 0x0f, 0xcc, 0x94, 0xa7, 0xfc, 0xf0, - 0x98, 0xe0, 0xe3, 0xd8, 0xe1, 0xe8, 0xe5, 0xcc, 0xbc, 0xa9, 0x0b, 0xea, 0xb6, 0x78, 0x78, 0x44, - 0xfe, 0x57, 0x12, 0x9c, 0x68, 0xf3, 0x28, 0x4f, 0xd8, 0xbf, 0x04, 0xc8, 0x0e, 0x34, 0xf2, 0xef, - 0xbd, 0x31, 0xa1, 0x0f, 0xec, 0xa0, 0x63, 0x76, 0x5b, 0xdc, 0xbd, 0x75, 0x11, 0x9e, 0x9d, 0xdd, - 0xfc, 0xa7, 0x12, 0x4c, 0x04, 0xbb, 0xf7, 0x14, 0x59, 0x85, 0x5c, 0xb0, 0x77, 0xae, 0xc2, 0x3d, - 0xfd, 0xa8, 0xc0, 0xa5, 0x0f, 0xd1, 0xa3, 0xe7, 0xfc, 0xe9, 0xca, 0x6a, 0x67, 0x8f, 0xf6, 0x6d, - 0x0d, 0x21, 0x53, 0x74, 0xda, 0xa6, 0xe8, 0x78, 0xfc, 0x1f, 0x09, 0x52, 0xeb, 0xa6, 0xd9, 0x40, - 0x26, 0x8c, 0x19, 0xa6, 0x5b, 0x25, 0x9e, 0x85, 0x6b, 0x55, 0xbe, 0xe9, 0x66, 0x71, 0x70, 0xfe, - 0x60, 0x46, 0xfa, 0xf6, 0x8d, 0xa9, 0x76, 0x56, 0xca, 0xa8, 0x61, 0xba, 0x65, 0x0a, 0xd9, 0x64, - 0x5b, 0xf2, 0x77, 0xc2, 0x70, 0xb8, 0x33, 0x16, 0x25, 0x9f, 0x3f, 0x70, 0x67, 0x61, 0x36, 0x37, - 0x6f, 0x4c, 0x4d, 0xf8, 0x33, 0xc6, 0x03, 0xcb, 0x4a, 0x6e, 0x3b, 0xd0, 0x3b, 0x3b, 0xde, 0xf5, - 0xdd, 0x4f, 0x4e, 0x49, 0xa7, 0xbf, 0x28, 0x01, 0xf8, 0x95, 0x07, 0xf4, 0x10, 0x1c, 0x2f, 0xaf, - 0xad, 0x2e, 0x54, 0x37, 0x36, 0xe7, 0x36, 0xb7, 0x36, 0xaa, 0x5b, 0xab, 0x1b, 0xeb, 0x95, 0xf9, - 0xa5, 0x0b, 0x4b, 0x95, 0x05, 0xbf, 0x3c, 0xee, 0x58, 0x58, 0xd3, 0x77, 0x74, 0x5c, 0x43, 0xf7, - 0xc1, 0x44, 0x18, 0x9b, 0x3c, 0x55, 0x16, 0xf2, 0x52, 0x31, 0xf7, 0xea, 0xf5, 0xe9, 0x0c, 0xcb, - 0xc5, 0x70, 0x0d, 0x9d, 0x82, 0xa3, 0xed, 0x78, 0x4b, 0xab, 0x8b, 0xf9, 0x44, 0x71, 0xf8, 0xd5, - 0xeb, 0xd3, 0x59, 0x2f, 0x69, 0x43, 0x32, 0xa0, 0x20, 0x26, 0xe7, 0x97, 0x2c, 0xc2, 0xab, 0xd7, - 0xa7, 0x07, 0x98, 0x01, 0x8b, 0xa9, 0xf7, 0x7f, 0x7a, 0xf2, 0x48, 0xf9, 0x42, 0xd7, 0x02, 0xf8, - 0x43, 0x3d, 0x6d, 0x77, 0xcd, 0x2b, 0x6a, 0x87, 0xab, 0xde, 0xaf, 0x1e, 0x87, 0xa9, 0x2e, 0x55, - 0x6f, 0xf7, 0x5a, 0x4c, 0xc1, 0xbb, 0x47, 0x69, 0x3b, 0xb6, 0x74, 0xdd, 0xa5, 0x58, 0x7e, 0xf8, - 0x82, 0x76, 0x5f, 0xb5, 0x7b, 0xf9, 0x5f, 0xa7, 0x00, 0xad, 0x38, 0xf5, 0x79, 0x92, 0x54, 0x05, - 0x8e, 0x68, 0x45, 0x6a, 0x36, 0xd2, 0x0f, 0x54, 0xb3, 0x59, 0x09, 0x55, 0x41, 0x12, 0x07, 0xab, - 0xb4, 0xf6, 0x5d, 0x0a, 0x49, 0xfe, 0x50, 0x4a, 0x21, 0x9d, 0x33, 0xa5, 0xd4, 0xad, 0xdb, 0x52, - 0xa5, 0x0f, 0xbb, 0xad, 0xe4, 0x15, 0xce, 0x81, 0x1e, 0x15, 0xce, 0x42, 0xd7, 0x32, 0x26, 0xa7, - 0x46, 0x67, 0xc5, 0x95, 0x9c, 0xc1, 0xfe, 0xd6, 0x36, 0x7e, 0x67, 0x27, 0xf3, 0x7e, 0xb1, 0xb2, - 0x9d, 0x84, 0x62, 0xbb, 0x3b, 0x89, 0xe0, 0x2b, 0x7f, 0x24, 0x09, 0xf9, 0x15, 0xa7, 0x5e, 0xa9, - 0xe9, 0xee, 0x6d, 0xf2, 0xb5, 0x67, 0xba, 0x6f, 0x53, 0xd1, 0xcd, 0x1b, 0x53, 0x23, 0xcc, 0xa6, - 0x3d, 0x2c, 0xd9, 0x84, 0xd1, 0xc8, 0xcb, 0x01, 0xee, 0x59, 0x0b, 0x87, 0x79, 0x47, 0x11, 0x61, - 0x25, 0xd3, 0x5d, 0x45, 0xc0, 0xbf, 0xd1, 0xb5, 0xce, 0xce, 0xcc, 0x1c, 0xea, 0xe2, 0xed, 0xac, - 0xe9, 0xf9, 0x63, 0x56, 0x84, 0x42, 0x74, 0x50, 0xbc, 0x11, 0xfb, 0x43, 0x09, 0x86, 0x56, 0x1c, - 0xb1, 0x8b, 0xc6, 0x3f, 0xa6, 0x15, 0x85, 0x27, 0xbc, 0x8b, 0x26, 0xc9, 0xfe, 0xfc, 0x56, 0x5c, - 0x3e, 0xf1, 0x8d, 0x70, 0x14, 0xc6, 0x03, 0x7a, 0x7a, 0xfa, 0xff, 0x76, 0x82, 0xc6, 0xc7, 0x32, - 0xae, 0xeb, 0x86, 0x97, 0x54, 0xe0, 0xbf, 0xa8, 0xfb, 0x25, 0xdf, 0xce, 0xa9, 0xc3, 0xda, 0x79, - 0x8f, 0x06, 0x88, 0x88, 0x3d, 0xbd, 0x8c, 0x71, 0xa5, 0x7d, 0x37, 0x2f, 0x1d, 0xe0, 0xa0, 0x4c, - 0x64, 0xcf, 0x2e, 0xbf, 0x21, 0xc1, 0xf0, 0x8a, 0x53, 0xdf, 0x32, 0x6a, 0xff, 0xcf, 0xfb, 0xef, - 0x0e, 0x1c, 0x0d, 0x69, 0x7a, 0x9b, 0x4c, 0x7a, 0xe6, 0xb5, 0x14, 0x24, 0x57, 0x9c, 0x3a, 0x7a, - 0x09, 0x46, 0xa3, 0x49, 0xc3, 0xe9, 0x6e, 0x31, 0xbb, 0x7d, 0x45, 0x28, 0x9e, 0xe9, 0x1f, 0xd7, - 0xd3, 0x64, 0x0f, 0x86, 0xc3, 0x2b, 0xc7, 0xa9, 0x1e, 0x4c, 0x42, 0x98, 0xc5, 0x47, 0xfa, 0xc5, - 0xf4, 0x3a, 0x7b, 0x3b, 0x64, 0xbc, 0xa0, 0x77, 0x77, 0x0f, 0x6a, 0x81, 0x54, 0x7c, 0xb0, 0x0f, - 0x24, 0x8f, 0xfb, 0x4b, 0x30, 0x1a, 0x0d, 0x29, 0xbd, 0xac, 0x17, 0xc1, 0xed, 0x69, 0xbd, 0x6e, - 0x53, 0x6b, 0x1b, 0x20, 0x30, 0x0f, 0xee, 0xed, 0xc1, 0xc1, 0x47, 0x2b, 0x3e, 0xdc, 0x17, 0x9a, - 0xb7, 0xb9, 0xba, 0xd5, 0xc9, 0xf8, 0xbf, 0x48, 0xc0, 0xe9, 0x60, 0x9a, 0xfb, 0x52, 0x0b, 0xdb, - 0xfb, 0x5e, 0x26, 0x6b, 0xa9, 0x75, 0xdd, 0x08, 0xde, 0xbe, 0x3b, 0x11, 0x9c, 0x35, 0x14, 0x57, - 0xc8, 0x2b, 0x1b, 0x30, 0xb4, 0xae, 0xd6, 0xb1, 0x82, 0x5f, 0x6a, 0x61, 0xc7, 0xed, 0x70, 0xfb, - 0xeb, 0x18, 0x0c, 0x98, 0x3b, 0x3b, 0xe2, 0xac, 0x59, 0x4a, 0xe1, 0x4f, 0x68, 0x02, 0xd2, 0x0d, - 0xbd, 0xa9, 0xb3, 0x99, 0x99, 0x52, 0xd8, 0x03, 0x9a, 0x82, 0x21, 0x8d, 0x4c, 0xc0, 0x2a, 0x3b, - 0x37, 0x9f, 0x12, 0x5f, 0x66, 0x6a, 0x19, 0xee, 0x26, 0x81, 0xc8, 0xcf, 0x40, 0x8e, 0xf5, 0xc7, - 0xad, 0x7f, 0x02, 0x32, 0xf4, 0x9c, 0xb3, 0xdf, 0xeb, 0x20, 0x79, 0xbe, 0xc4, 0x6e, 0x8a, 0x31, - 0x2e, 0xac, 0x63, 0xf6, 0x50, 0x2e, 0x77, 0x35, 0xe5, 0xa9, 0xf8, 0x8c, 0x80, 0x19, 0xca, 0x33, - 0xe3, 0x6f, 0xa6, 0xe1, 0x28, 0xdf, 0x7f, 0xa8, 0x96, 0x3e, 0xbb, 0xeb, 0xba, 0xe2, 0x36, 0x33, - 0xf0, 0x10, 0xa0, 0x5a, 0xba, 0xbc, 0x0f, 0xa9, 0x8b, 0xae, 0x6b, 0xa1, 0xd3, 0x90, 0xb6, 0x5b, - 0x0d, 0x2c, 0x5e, 0xc5, 0x78, 0xa9, 0xa4, 0x6a, 0xe9, 0x33, 0x04, 0x41, 0x69, 0x35, 0xb0, 0xc2, - 0x50, 0x50, 0x05, 0xa6, 0x76, 0x5a, 0x8d, 0xc6, 0x7e, 0xb5, 0x86, 0xe9, 0x3f, 0xd5, 0xf3, 0xfe, - 0x2d, 0x0d, 0xbe, 0x66, 0xa9, 0x86, 0x97, 0xef, 0x67, 0x94, 0x93, 0x14, 0x6d, 0x81, 0x62, 0x89, - 0x7f, 0x49, 0x53, 0x11, 0x38, 0xf2, 0xef, 0x25, 0x20, 0x23, 0x58, 0xd3, 0xab, 0x5b, 0xb8, 0x81, - 0x35, 0xd7, 0x14, 0x47, 0x19, 0xbc, 0x67, 0x84, 0x20, 0x59, 0xe7, 0x43, 0x94, 0xbd, 0x78, 0x44, - 0x21, 0x0f, 0x04, 0xe6, 0x5d, 0xa8, 0x23, 0x30, 0xab, 0x45, 0x46, 0x2d, 0x65, 0x99, 0xa2, 0x66, - 0x7a, 0xf1, 0x88, 0x42, 0x9f, 0x50, 0x01, 0x06, 0x88, 0xcb, 0xba, 0xec, 0x8b, 0xc1, 0x04, 0xce, - 0x9f, 0xd1, 0x31, 0x48, 0x5b, 0xaa, 0xab, 0xb1, 0xb3, 0xee, 0xa4, 0x81, 0x3d, 0x92, 0xc0, 0xcc, - 0xbe, 0xd4, 0x10, 0xfd, 0x8f, 0x55, 0xc4, 0x18, 0xec, 0x93, 0x98, 0x44, 0xee, 0x75, 0xd5, 0x75, - 0xb1, 0x6d, 0x10, 0x86, 0x0c, 0x1d, 0x21, 0x48, 0x6d, 0x9b, 0xb5, 0x7d, 0xfe, 0x5f, 0xb4, 0xe8, - 0x6f, 0xfe, 0x6f, 0x7b, 0xa8, 0x3f, 0x54, 0x69, 0x23, 0xfb, 0xe7, 0x81, 0x39, 0x01, 0x2c, 0x13, - 0xa4, 0x0a, 0x8c, 0xab, 0xb5, 0x9a, 0xce, 0xfe, 0xa1, 0x55, 0x75, 0x5b, 0xa7, 0xfb, 0x61, 0x87, - 0xfe, 0x6b, 0xc8, 0x6e, 0x63, 0x81, 0x7c, 0x82, 0x32, 0xc7, 0x2f, 0x67, 0x61, 0xd0, 0x62, 0x42, - 0xc9, 0xe7, 0x61, 0xac, 0x4d, 0x52, 0x22, 0xdf, 0x9e, 0x6e, 0xd4, 0xc4, 0x2d, 0x43, 0xf2, 0x9b, - 0xc0, 0xe8, 0x67, 0x6d, 0xd9, 0x21, 0x11, 0xfa, 0xbb, 0xfc, 0xee, 0xee, 0x77, 0x50, 0x47, 0x02, - 0x77, 0x50, 0x55, 0x4b, 0x2f, 0x67, 0x29, 0x7f, 0x7e, 0xf5, 0x74, 0x8e, 0x37, 0xb0, 0x6b, 0xa7, - 0x33, 0xa6, 0x5d, 0x9f, 0xad, 0x63, 0x43, 0xec, 0x6f, 0x49, 0x93, 0x6a, 0xe9, 0x0e, 0x75, 0x47, - 0xff, 0x33, 0xbb, 0xce, 0xf9, 0xc0, 0x6f, 0x7a, 0x23, 0x35, 0xb5, 0x38, 0xb7, 0xbe, 0xe4, 0xf9, - 0xf1, 0x97, 0x13, 0x70, 0x32, 0xe0, 0xc7, 0x01, 0xe4, 0x76, 0x77, 0x2e, 0x76, 0xf6, 0xf8, 0x3e, - 0x2e, 0xa9, 0x5f, 0x82, 0x14, 0xc1, 0x47, 0x31, 0xff, 0x54, 0xa7, 0xf0, 0xab, 0x5f, 0xfb, 0x27, - 0x72, 0x78, 0xb3, 0x15, 0x1a, 0x15, 0xca, 0xa4, 0xfc, 0xbe, 0xfe, 0xed, 0x97, 0xf7, 0xbf, 0x30, - 0xec, 0xdc, 0x3a, 0x33, 0x46, 0x6d, 0xf8, 0xad, 0xb3, 0x20, 0x77, 0xa9, 0x0c, 0xb0, 0x88, 0xd9, - 0xbb, 0xc4, 0x71, 0x80, 0x70, 0xdc, 0xed, 0x62, 0x5e, 0xaf, 0x11, 0xec, 0xb3, 0x6a, 0x71, 0x0d, - 0x8e, 0x3d, 0x47, 0xfa, 0xf6, 0xeb, 0xd7, 0x22, 0xb0, 0x1f, 0xf3, 0x8e, 0xd9, 0x48, 0xfc, 0x3f, - 0x73, 0x8a, 0x23, 0x34, 0xe0, 0xcb, 0xc7, 0x6b, 0x10, 0xf7, 0xcd, 0x74, 0x5d, 0x2f, 0x66, 0x02, - 0x8b, 0x85, 0x12, 0xa0, 0x94, 0x7f, 0x59, 0x82, 0xe3, 0x6d, 0x5d, 0xf3, 0x18, 0xbf, 0xd8, 0xe1, - 0x0e, 0x61, 0xdf, 0xa7, 0xfb, 0x82, 0xf7, 0x09, 0x17, 0x3b, 0x08, 0x7b, 0x7f, 0xac, 0xb0, 0x4c, - 0x8a, 0x90, 0xb4, 0x4f, 0xc3, 0xd1, 0xb0, 0xb0, 0xc2, 0x4c, 0xf7, 0xc2, 0x48, 0x38, 0x31, 0xe5, - 0xe6, 0x1a, 0x0e, 0xa5, 0xa6, 0x72, 0x35, 0x6a, 0x67, 0x4f, 0xd7, 0x0a, 0x64, 0x3d, 0x54, 0x9e, - 0x4f, 0xf6, 0xad, 0xaa, 0x4f, 0x29, 0x7f, 0x58, 0x82, 0xe9, 0x70, 0x0f, 0xfe, 0x0e, 0xd5, 0x39, - 0x98, 0xb0, 0xb7, 0x6c, 0x88, 0xdf, 0x90, 0xe0, 0xae, 0x1e, 0x32, 0x71, 0x03, 0xbc, 0x0c, 0x13, - 0x81, 0x12, 0xbd, 0x08, 0xe1, 0x62, 0xd8, 0x4f, 0xc7, 0xbf, 0x5b, 0xf0, 0x92, 0xa6, 0x3b, 0x88, - 0x51, 0x3e, 0xfb, 0xfb, 0x53, 0xe3, 0xed, 0x6d, 0x8e, 0x32, 0xde, 0x5e, 0x56, 0xbf, 0x85, 0xfe, - 0xf1, 0x9a, 0x04, 0x0f, 0x84, 0x55, 0xed, 0xf0, 0xde, 0xfc, 0x47, 0x35, 0x0e, 0xff, 0x5e, 0x82, - 0xd3, 0xfd, 0x08, 0xe7, 0xe5, 0xb7, 0xe3, 0xfe, 0x8b, 0xb2, 0xe8, 0x78, 0x3c, 0x78, 0x80, 0x13, - 0x06, 0xdc, 0x4b, 0x91, 0xc7, 0xed, 0x36, 0x18, 0xde, 0xe2, 0x13, 0x2b, 0x38, 0xe4, 0x9e, 0x91, - 0xc3, 0xbb, 0x4f, 0x61, 0xe4, 0xd0, 0xfe, 0xb3, 0xc3, 0x58, 0x24, 0x3a, 0x8c, 0x45, 0x60, 0x7f, - 0x78, 0x85, 0xc7, 0xad, 0x0e, 0x2f, 0xc7, 0xde, 0x06, 0xe3, 0x1d, 0x5c, 0x99, 0xcf, 0xea, 0x03, - 0x78, 0xb2, 0x82, 0xda, 0x9d, 0x55, 0xde, 0x87, 0x29, 0xda, 0x6f, 0x07, 0x43, 0xdf, 0x6e, 0x95, - 0x9b, 0x3c, 0xb6, 0x74, 0xec, 0x9a, 0xeb, 0xbe, 0x04, 0x03, 0x6c, 0x9c, 0xb9, 0xba, 0x87, 0x70, - 0x14, 0xce, 0x40, 0xfe, 0x79, 0x11, 0xcb, 0x16, 0x84, 0xd8, 0x9d, 0xe7, 0x50, 0x3f, 0xba, 0xde, - 0xa2, 0x39, 0x14, 0x30, 0xc6, 0x37, 0x44, 0x54, 0xeb, 0x2c, 0x1d, 0x37, 0x87, 0x76, 0xcb, 0xa2, - 0x1a, 0xb3, 0xcd, 0xed, 0x0d, 0x5f, 0xbf, 0x28, 0xc2, 0x97, 0xa7, 0x53, 0x4c, 0xf8, 0xfa, 0xd1, - 0x98, 0xde, 0x0b, 0x64, 0x31, 0x62, 0xfe, 0x79, 0x0c, 0x64, 0xdf, 0x95, 0xe0, 0x04, 0xd5, 0x2d, - 0xf8, 0xc6, 0xf5, 0xa0, 0x26, 0x7f, 0x08, 0x90, 0x63, 0x6b, 0xd5, 0x8e, 0xb3, 0x3b, 0xef, 0xd8, - 0xda, 0xe5, 0xd0, 0xfa, 0xf2, 0x10, 0xa0, 0x9a, 0xe3, 0x46, 0xb1, 0xd9, 0xf1, 0xf5, 0x7c, 0xcd, - 0x71, 0x2f, 0xf7, 0x58, 0x8d, 0x52, 0xb7, 0x60, 0x38, 0xbf, 0x2e, 0x41, 0xb1, 0x93, 0xca, 0x7c, - 0xf8, 0x74, 0x38, 0x16, 0x7a, 0x7b, 0x1f, 0x1d, 0xc1, 0x87, 0xfa, 0x79, 0x67, 0x1d, 0x99, 0x46, - 0x47, 0x6d, 0x7c, 0xbb, 0xf3, 0x80, 0xa9, 0xb0, 0x87, 0xb6, 0x67, 0xd6, 0x3f, 0xb2, 0xe9, 0xf3, - 0x85, 0xb6, 0xb8, 0xfa, 0xe7, 0x22, 0xf7, 0xbe, 0x06, 0x93, 0x5d, 0xa4, 0xbe, 0xdd, 0xeb, 0xde, - 0x6e, 0xd7, 0xc1, 0xbc, 0xd5, 0xe9, 0xfb, 0xe3, 0x7c, 0x26, 0x84, 0xaf, 0x46, 0x05, 0xf6, 0x62, - 0x9d, 0xee, 0x56, 0xcb, 0x6f, 0x81, 0x3b, 0x3a, 0x52, 0x71, 0xd9, 0x4a, 0x90, 0xda, 0xd5, 0x1d, - 0x97, 0x8b, 0x75, 0x5f, 0x37, 0xb1, 0x22, 0xd4, 0x94, 0x46, 0x46, 0x90, 0xa7, 0xac, 0xd7, 0x4d, - 0xb3, 0xc1, 0xc5, 0x90, 0x2f, 0xc1, 0x58, 0x00, 0xc6, 0x3b, 0x39, 0x07, 0x29, 0xcb, 0xe4, 0xdf, - 0x0d, 0x1a, 0x3a, 0x73, 0xb2, 0x5b, 0x27, 0x84, 0x86, 0xab, 0x4d, 0xf1, 0xe5, 0x09, 0x40, 0x8c, - 0x19, 0x3d, 0xdc, 0x25, 0xba, 0xd8, 0x80, 0xf1, 0x10, 0x94, 0x77, 0xf2, 0x26, 0x18, 0xb0, 0x28, - 0xc4, 0xbb, 0x04, 0xdb, 0xad, 0x1b, 0x8a, 0xe5, 0x7d, 0x89, 0x85, 0x3e, 0x9d, 0xf9, 0xf6, 0x51, - 0x48, 0x53, 0xae, 0xe8, 0x63, 0x12, 0x40, 0xe0, 0xa8, 0xd6, 0x4c, 0x37, 0x36, 0x9d, 0xf7, 0xc4, - 0xc5, 0xd9, 0xbe, 0xf1, 0x79, 0xce, 0x76, 0xfa, 0xdd, 0xff, 0xe6, 0x5b, 0x1f, 0x49, 0xdc, 0x83, - 0xe4, 0xd9, 0x2e, 0xbb, 0xf1, 0xc0, 0x7c, 0xf9, 0x4c, 0xe8, 0xa3, 0x34, 0x0f, 0xf7, 0xd7, 0x95, - 0x90, 0x6c, 0xa6, 0x5f, 0x74, 0x2e, 0xd8, 0x79, 0x2a, 0xd8, 0x59, 0xf4, 0x58, 0xbc, 0x60, 0xb3, - 0xef, 0x08, 0x4f, 0x9a, 0x77, 0xa1, 0xdf, 0x91, 0x60, 0xa2, 0xd3, 0x96, 0x0e, 0x3d, 0xd9, 0x9f, - 0x14, 0xed, 0x29, 0x45, 0xf1, 0xa9, 0x43, 0x50, 0x72, 0x55, 0x16, 0xa9, 0x2a, 0x73, 0xe8, 0x99, - 0x43, 0xa8, 0x32, 0x1b, 0x58, 0x77, 0xd0, 0xff, 0x92, 0xe0, 0xce, 0x9e, 0x3b, 0x24, 0x34, 0xd7, - 0x9f, 0x94, 0x3d, 0x72, 0xa7, 0x62, 0xf9, 0x07, 0x61, 0xc1, 0x35, 0x7e, 0x8e, 0x6a, 0x7c, 0x09, - 0x2d, 0x1d, 0x46, 0x63, 0x3f, 0x23, 0x0a, 0xea, 0xfe, 0x5b, 0xe1, 0x23, 0xff, 0xbd, 0xdd, 0xa9, - 0x6d, 0xe3, 0x11, 0x33, 0x31, 0xda, 0x93, 0x5a, 0xf9, 0x05, 0xaa, 0x82, 0x82, 0xd6, 0x7f, 0xc0, - 0x41, 0x9b, 0x7d, 0x47, 0x38, 0xf0, 0xbf, 0x0b, 0xfd, 0x4f, 0xa9, 0xf3, 0x09, 0xfe, 0x27, 0x7a, - 0x8a, 0xd8, 0x7d, 0x53, 0x55, 0x7c, 0xf2, 0xe0, 0x84, 0x5c, 0xc9, 0x26, 0x55, 0xb2, 0x8e, 0xf0, - 0xad, 0x56, 0xb2, 0xe3, 0x20, 0xa2, 0xaf, 0x4a, 0x30, 0xd1, 0x69, 0x4f, 0x12, 0x33, 0x2d, 0x7b, - 0x6c, 0xb2, 0x62, 0xa6, 0x65, 0xaf, 0x0d, 0x90, 0xfc, 0x26, 0xaa, 0xfc, 0x39, 0xf4, 0x78, 0x37, - 0xe5, 0x7b, 0x8e, 0x22, 0x99, 0x8b, 0x3d, 0x93, 0xfc, 0x98, 0xb9, 0xd8, 0xcf, 0x3e, 0x26, 0x66, - 0x2e, 0xf6, 0xb5, 0xc7, 0x88, 0x9f, 0x8b, 0x9e, 0x66, 0x7d, 0x0e, 0xa3, 0x83, 0xbe, 0x2c, 0xc1, - 0x70, 0x28, 0x23, 0x46, 0x8f, 0xf6, 0x14, 0xb4, 0xd3, 0x86, 0xa1, 0xfb, 0x8b, 0xcd, 0xee, 0x09, - 0xb7, 0xbc, 0x44, 0x75, 0x99, 0x47, 0x73, 0x87, 0xd1, 0xc5, 0x0e, 0x49, 0xfc, 0x75, 0x09, 0xc6, - 0x3b, 0x64, 0x99, 0x31, 0xb3, 0xb0, 0x7b, 0xd2, 0x5c, 0x7c, 0xf2, 0xe0, 0x84, 0x5c, 0xab, 0x0b, - 0x54, 0xab, 0x9f, 0x40, 0x4f, 0x1f, 0x46, 0xab, 0xc0, 0xfa, 0x7c, 0xc3, 0x3f, 0x10, 0x1d, 0xe8, - 0x07, 0x9d, 0x3b, 0xa0, 0x60, 0x42, 0xa1, 0x27, 0x0e, 0x4c, 0xc7, 0xf5, 0x79, 0x9e, 0xea, 0xf3, - 0x1c, 0x5a, 0xfb, 0xc1, 0xf4, 0x69, 0x5f, 0xd6, 0x3f, 0xdf, 0x7e, 0x35, 0xbf, 0xb7, 0x17, 0x75, - 0x4c, 0x56, 0x8b, 0x8f, 0x1d, 0x88, 0x86, 0x2b, 0xf5, 0x24, 0x55, 0xea, 0x0c, 0x7a, 0xa4, 0x9b, - 0x52, 0x81, 0x53, 0xef, 0xba, 0xb1, 0x63, 0xce, 0xbe, 0x83, 0xa5, 0xc0, 0xef, 0x42, 0x3f, 0x25, - 0x4e, 0x1c, 0x9f, 0xea, 0xd9, 0x6f, 0x20, 0x8f, 0x2d, 0x3e, 0xd0, 0x07, 0x26, 0x97, 0xeb, 0x1e, - 0x2a, 0xd7, 0x24, 0x3a, 0xd9, 0x4d, 0x2e, 0x92, 0xcb, 0xa2, 0x0f, 0x48, 0xde, 0x25, 0x85, 0xd3, - 0xbd, 0x79, 0x07, 0x93, 0xdd, 0xee, 0x07, 0x1d, 0x3a, 0xa4, 0xc0, 0xf2, 0x7d, 0x54, 0x92, 0x69, - 0x34, 0xd9, 0x55, 0x12, 0x96, 0xfa, 0xde, 0xea, 0x93, 0x03, 0x7f, 0x3c, 0xd8, 0xf5, 0xe3, 0x15, - 0x75, 0x6c, 0x60, 0x47, 0x77, 0x0e, 0xf5, 0xf1, 0x8a, 0xfe, 0x5e, 0x4f, 0xfd, 0x4e, 0x1a, 0x72, - 0x8b, 0xac, 0x97, 0x0d, 0x57, 0x75, 0x7f, 0xc0, 0x8d, 0x00, 0x72, 0xf8, 0x37, 0xd9, 0xd8, 0xa7, - 0x22, 0xfd, 0x8f, 0x1f, 0xe6, 0x0e, 0x74, 0x6d, 0x9b, 0x1d, 0x12, 0xe4, 0x37, 0xa4, 0xa3, 0xfc, - 0x64, 0xf6, 0x79, 0x37, 0x7a, 0x76, 0x81, 0x7d, 0xe4, 0xf1, 0xbd, 0x12, 0x1c, 0xa5, 0x58, 0xfe, - 0x7c, 0xa3, 0x98, 0xe2, 0xce, 0x5e, 0x57, 0x8f, 0x59, 0x56, 0x03, 0x25, 0x18, 0xf6, 0x59, 0xc6, - 0x7b, 0xf8, 0x7d, 0x96, 0x93, 0x81, 0xce, 0xa3, 0x6c, 0x65, 0x65, 0xbc, 0xd1, 0x46, 0xe9, 0x44, - 0xf6, 0xf5, 0xa9, 0xc3, 0xef, 0xeb, 0x9f, 0x85, 0xa1, 0x40, 0xa4, 0x2f, 0xa4, 0x63, 0xae, 0x99, - 0x46, 0x8b, 0x68, 0x41, 0x62, 0xf4, 0x3e, 0x09, 0x8e, 0x76, 0x5c, 0x04, 0xe9, 0xff, 0xaa, 0x3d, - 0x60, 0x91, 0x2e, 0x62, 0x9c, 0x8e, 0x7c, 0x65, 0x65, 0xa2, 0xd5, 0x29, 0x9b, 0x58, 0x87, 0xe1, - 0xd0, 0x02, 0x56, 0x10, 0xff, 0x71, 0xba, 0xff, 0x1b, 0x16, 0x61, 0x06, 0xa8, 0x08, 0x19, 0x7c, - 0xcd, 0x32, 0x6d, 0x17, 0xd7, 0xe8, 0x91, 0x87, 0x8c, 0xe2, 0x3d, 0xcb, 0xab, 0x80, 0xda, 0x07, - 0x37, 0xfa, 0x1d, 0xd2, 0xac, 0xff, 0x1d, 0xd2, 0x09, 0x48, 0x07, 0xbf, 0xd4, 0xc9, 0x1e, 0xfc, - 0x3a, 0xc5, 0xad, 0x9e, 0xf3, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x4f, 0xa1, 0x5b, 0x6b, 0x6a, - 0x94, 0x00, 0x00, + 0x06, 0x1d, 0x6c, 0x5f, 0xd1, 0x35, 0x5c, 0x18, 0xa0, 0x0c, 0xee, 0x6f, 0x63, 0xb0, 0xc1, 0x9e, + 0x47, 0x79, 0x08, 0x3a, 0x34, 0x0f, 0x59, 0x7c, 0xcd, 0xc5, 0x86, 0xa3, 0x9b, 0x46, 0x61, 0x90, + 0x32, 0xb9, 0xb7, 0xc3, 0x28, 0xe2, 0x46, 0x2d, 0xca, 0xc2, 0xa7, 0x43, 0xe7, 0x60, 0xd0, 0xb4, + 0x5c, 0xdd, 0x34, 0x9c, 0x42, 0x66, 0x5a, 0x3a, 0x35, 0x74, 0xe6, 0x64, 0x47, 0x47, 0x58, 0x63, + 0x38, 0x8a, 0x40, 0x46, 0x4b, 0x90, 0x77, 0xcc, 0x96, 0xad, 0xe1, 0xaa, 0x66, 0xd6, 0x70, 0x55, + 0x37, 0x76, 0xcc, 0x42, 0x96, 0x32, 0x98, 0x6a, 0x57, 0x84, 0x22, 0xce, 0x9b, 0x35, 0xbc, 0x64, + 0xec, 0x98, 0xca, 0x88, 0x13, 0x6a, 0xa3, 0x63, 0x30, 0xe0, 0xec, 0x1b, 0xae, 0x7a, 0xad, 0x90, + 0xa3, 0x1e, 0xc2, 0x5b, 0xf2, 0x6f, 0x0c, 0xc0, 0x68, 0x3f, 0x2e, 0x76, 0x1e, 0xd2, 0x3b, 0x44, + 0xcb, 0x42, 0xe2, 0x20, 0x36, 0x60, 0x34, 0x61, 0x23, 0x0e, 0x1c, 0xd2, 0x88, 0x73, 0x30, 0x64, + 0x60, 0xc7, 0xc5, 0x35, 0xe6, 0x11, 0xc9, 0x3e, 0x7d, 0x0a, 0x18, 0x51, 0xbb, 0x4b, 0xa5, 0x0e, + 0xe5, 0x52, 0x2f, 0xc0, 0xa8, 0x27, 0x52, 0xd5, 0x56, 0x8d, 0xba, 0xf0, 0xcd, 0xd9, 0x38, 0x49, + 0x66, 0x2a, 0x82, 0x4e, 0x21, 0x64, 0xca, 0x08, 0x0e, 0xb5, 0xd1, 0x02, 0x80, 0x69, 0x60, 0x73, + 0xa7, 0x5a, 0xc3, 0x5a, 0xa3, 0x90, 0xe9, 0x62, 0xa5, 0x35, 0x82, 0xd2, 0x66, 0x25, 0x93, 0x41, + 0xb5, 0x06, 0x7a, 0xca, 0x77, 0xb5, 0xc1, 0x2e, 0x9e, 0xb2, 0xc2, 0x26, 0x59, 0x9b, 0xb7, 0x6d, + 0xc1, 0x88, 0x8d, 0x89, 0xdf, 0xe3, 0x1a, 0xd7, 0x2c, 0x4b, 0x85, 0x98, 0x89, 0xd5, 0x4c, 0xe1, + 0x64, 0x4c, 0xb1, 0x61, 0x3b, 0xd8, 0x44, 0x77, 0x83, 0x07, 0xa8, 0x52, 0xb7, 0x02, 0x1a, 0x85, + 0x72, 0x02, 0xb8, 0xaa, 0x36, 0x71, 0xf1, 0x65, 0x18, 0x09, 0x9b, 0x07, 0x4d, 0x40, 0xda, 0x71, + 0x55, 0xdb, 0xa5, 0x5e, 0x98, 0x56, 0x58, 0x03, 0xe5, 0x21, 0x89, 0x8d, 0x1a, 0x8d, 0x72, 0x69, + 0x85, 0xfc, 0x44, 0x3f, 0xe1, 0x2b, 0x9c, 0xa4, 0x0a, 0xdf, 0xd7, 0x3e, 0xa2, 0x21, 0xce, 0x51, + 0xbd, 0x8b, 0x4f, 0xc0, 0x70, 0x48, 0x81, 0x7e, 0xbb, 0x96, 0xdf, 0x09, 0x47, 0x3b, 0xb2, 0x46, + 0x2f, 0xc0, 0x44, 0xcb, 0xd0, 0x0d, 0x17, 0xdb, 0x96, 0x8d, 0x89, 0xc7, 0xb2, 0xae, 0x0a, 0xff, + 0x79, 0xb0, 0x8b, 0xcf, 0x6d, 0x05, 0xb1, 0x19, 0x17, 0x65, 0xbc, 0xd5, 0x0e, 0x3c, 0x9d, 0xcd, + 0xbc, 0x31, 0x98, 0x7f, 0xe5, 0x95, 0x57, 0x5e, 0x49, 0xc8, 0x1f, 0x1d, 0x80, 0x89, 0x4e, 0x73, + 0xa6, 0xe3, 0xf4, 0x3d, 0x06, 0x03, 0x46, 0xab, 0xb9, 0x8d, 0x6d, 0x6a, 0xa4, 0xb4, 0xc2, 0x5b, + 0x68, 0x0e, 0xd2, 0x0d, 0x75, 0x1b, 0x37, 0x0a, 0xa9, 0x69, 0xe9, 0xd4, 0xc8, 0x99, 0x07, 0xfb, + 0x9a, 0x95, 0x33, 0xcb, 0x84, 0x44, 0x61, 0x94, 0xe8, 0x69, 0x48, 0xf1, 0x10, 0x4d, 0x38, 0x9c, + 0xee, 0x8f, 0x03, 0x99, 0x4b, 0x0a, 0xa5, 0x43, 0x77, 0x40, 0x96, 0xfc, 0x65, 0xbe, 0x31, 0x40, + 0x65, 0xce, 0x10, 0x00, 0xf1, 0x0b, 0x54, 0x84, 0x0c, 0x9d, 0x26, 0x35, 0x2c, 0x96, 0x36, 0xaf, + 0x4d, 0x1c, 0xab, 0x86, 0x77, 0xd4, 0x56, 0xc3, 0xad, 0x5e, 0x51, 0x1b, 0x2d, 0x4c, 0x1d, 0x3e, + 0xab, 0xe4, 0x38, 0xf0, 0x32, 0x81, 0xa1, 0x29, 0x18, 0x62, 0xb3, 0x4a, 0x37, 0x6a, 0xf8, 0x1a, + 0x8d, 0x9e, 0x69, 0x85, 0x4d, 0xb4, 0x25, 0x02, 0x21, 0xdd, 0xbf, 0xe8, 0x98, 0x86, 0x70, 0x4d, + 0xda, 0x05, 0x01, 0xd0, 0xee, 0x9f, 0x88, 0x06, 0xee, 0x3b, 0x3b, 0xab, 0x17, 0xf5, 0x29, 0xf9, + 0x4b, 0x09, 0x48, 0xd1, 0x78, 0x31, 0x0a, 0x43, 0x9b, 0x6f, 0x59, 0xaf, 0x54, 0x17, 0xd6, 0xb6, + 0xca, 0xcb, 0x95, 0xbc, 0x84, 0x46, 0x00, 0x28, 0xe0, 0xc2, 0xf2, 0xda, 0xdc, 0x66, 0x3e, 0xe1, + 0xb5, 0x97, 0x56, 0x37, 0xcf, 0x3d, 0x9e, 0x4f, 0x7a, 0x04, 0x5b, 0x0c, 0x90, 0x0a, 0x22, 0x3c, + 0x76, 0x26, 0x9f, 0x46, 0x79, 0xc8, 0x31, 0x06, 0x4b, 0x2f, 0x54, 0x16, 0xce, 0x3d, 0x9e, 0x1f, + 0x08, 0x43, 0x1e, 0x3b, 0x93, 0x1f, 0x44, 0xc3, 0x90, 0xa5, 0x90, 0xf2, 0xda, 0xda, 0x72, 0x3e, + 0xe3, 0xf1, 0xdc, 0xd8, 0x54, 0x96, 0x56, 0x17, 0xf3, 0x59, 0x8f, 0xe7, 0xa2, 0xb2, 0xb6, 0xb5, + 0x9e, 0x07, 0x8f, 0xc3, 0x4a, 0x65, 0x63, 0x63, 0x6e, 0xb1, 0x92, 0x1f, 0xf2, 0x30, 0xca, 0x6f, + 0xd9, 0xac, 0x6c, 0xe4, 0x73, 0x21, 0xb1, 0x1e, 0x3b, 0x93, 0x1f, 0xf6, 0xba, 0xa8, 0xac, 0x6e, + 0xad, 0xe4, 0x47, 0xd0, 0x18, 0x0c, 0xb3, 0x2e, 0x84, 0x10, 0xa3, 0x11, 0xd0, 0xb9, 0xc7, 0xf3, + 0x79, 0x5f, 0x10, 0xc6, 0x65, 0x2c, 0x04, 0x38, 0xf7, 0x78, 0x1e, 0xc9, 0xf3, 0x90, 0xa6, 0xde, + 0x85, 0x10, 0x8c, 0x2c, 0xcf, 0x95, 0x2b, 0xcb, 0xd5, 0xb5, 0xf5, 0xcd, 0xa5, 0xb5, 0xd5, 0xb9, + 0xe5, 0xbc, 0xe4, 0xc3, 0x94, 0xca, 0x73, 0x5b, 0x4b, 0x4a, 0x65, 0x21, 0x9f, 0x08, 0xc2, 0xd6, + 0x2b, 0x73, 0x9b, 0x95, 0x85, 0x7c, 0x52, 0xd6, 0x60, 0xa2, 0x53, 0x9c, 0xec, 0x38, 0x33, 0x02, + 0x43, 0x9c, 0xe8, 0x32, 0xc4, 0x94, 0x57, 0xdb, 0x10, 0x7f, 0x33, 0x01, 0xe3, 0x1d, 0xd6, 0x8a, + 0x8e, 0x9d, 0x3c, 0x03, 0x69, 0xe6, 0xa2, 0x6c, 0xf5, 0x7c, 0xa0, 0xe3, 0xa2, 0x43, 0x1d, 0xb6, + 0x6d, 0x05, 0xa5, 0x74, 0xc1, 0x0c, 0x22, 0xd9, 0x25, 0x83, 0x20, 0x2c, 0xda, 0x62, 0xfa, 0x4f, + 0xb6, 0xc5, 0x74, 0xb6, 0xec, 0x9d, 0xeb, 0x67, 0xd9, 0xa3, 0xb0, 0x83, 0xc5, 0xf6, 0x74, 0x87, + 0xd8, 0x7e, 0x1e, 0xc6, 0xda, 0x18, 0xf5, 0x1d, 0x63, 0xdf, 0x23, 0x41, 0xa1, 0x9b, 0x71, 0x62, + 0x22, 0x5d, 0x22, 0x14, 0xe9, 0xce, 0x47, 0x2d, 0x78, 0x57, 0xf7, 0x41, 0x68, 0x1b, 0xeb, 0xcf, + 0x4a, 0x70, 0xac, 0x73, 0xa6, 0xd8, 0x51, 0x86, 0xa7, 0x61, 0xa0, 0x89, 0xdd, 0x5d, 0x53, 0x64, + 0x4b, 0xf7, 0x75, 0x58, 0x83, 0xc9, 0xe3, 0xe8, 0x60, 0x73, 0xaa, 0xe0, 0x22, 0x9e, 0xec, 0x96, + 0xee, 0x31, 0x69, 0xda, 0x24, 0xfd, 0x40, 0x02, 0x8e, 0x76, 0x64, 0xde, 0x51, 0xd0, 0x3b, 0x01, + 0x74, 0xc3, 0x6a, 0xb9, 0x2c, 0x23, 0x62, 0x01, 0x36, 0x4b, 0x21, 0x34, 0x78, 0x91, 0xe0, 0xd9, + 0x72, 0xbd, 0xe7, 0x49, 0xfa, 0x1c, 0x18, 0x88, 0x22, 0x3c, 0xe9, 0x0b, 0x9a, 0xa2, 0x82, 0x4e, + 0x76, 0xd1, 0xb4, 0xcd, 0x31, 0x1f, 0x81, 0xbc, 0xd6, 0xd0, 0xb1, 0xe1, 0x56, 0x1d, 0xd7, 0xc6, + 0x6a, 0x53, 0x37, 0xea, 0x74, 0x05, 0xc9, 0x94, 0xd2, 0x3b, 0x6a, 0xc3, 0xc1, 0xca, 0x28, 0x7b, + 0xbc, 0x21, 0x9e, 0x12, 0x0a, 0xea, 0x40, 0x76, 0x80, 0x62, 0x20, 0x44, 0xc1, 0x1e, 0x7b, 0x14, + 0xf2, 0xcf, 0x66, 0x61, 0x28, 0x90, 0x57, 0xa3, 0xbb, 0x20, 0xf7, 0xa2, 0x7a, 0x45, 0xad, 0x8a, + 0xbd, 0x12, 0xb3, 0xc4, 0x10, 0x81, 0xad, 0xf3, 0xfd, 0xd2, 0x23, 0x30, 0x41, 0x51, 0xcc, 0x96, + 0x8b, 0xed, 0xaa, 0xd6, 0x50, 0x1d, 0x87, 0x1a, 0x2d, 0x43, 0x51, 0x11, 0x79, 0xb6, 0x46, 0x1e, + 0xcd, 0x8b, 0x27, 0xe8, 0x2c, 0x8c, 0x53, 0x8a, 0x66, 0xab, 0xe1, 0xea, 0x56, 0x03, 0x57, 0xc9, + 0xee, 0xcd, 0xa1, 0x2b, 0x89, 0x27, 0xd9, 0x18, 0xc1, 0x58, 0xe1, 0x08, 0x44, 0x22, 0x07, 0x2d, + 0xc0, 0x9d, 0x94, 0xac, 0x8e, 0x0d, 0x6c, 0xab, 0x2e, 0xae, 0xe2, 0x97, 0x5a, 0x6a, 0xc3, 0xa9, + 0xaa, 0x46, 0xad, 0xba, 0xab, 0x3a, 0xbb, 0x85, 0x09, 0xc2, 0xa0, 0x9c, 0x28, 0x48, 0xca, 0x09, + 0x82, 0xb8, 0xc8, 0xf1, 0x2a, 0x14, 0x6d, 0xce, 0xa8, 0x5d, 0x54, 0x9d, 0x5d, 0x54, 0x82, 0x63, + 0x94, 0x8b, 0xe3, 0xda, 0xba, 0x51, 0xaf, 0x6a, 0xbb, 0x58, 0xdb, 0xab, 0xb6, 0xdc, 0x9d, 0x27, + 0x0b, 0x77, 0x04, 0xfb, 0xa7, 0x12, 0x6e, 0x50, 0x9c, 0x79, 0x82, 0xb2, 0xe5, 0xee, 0x3c, 0x89, + 0x36, 0x20, 0x47, 0x06, 0xa3, 0xa9, 0xbf, 0x8c, 0xab, 0x3b, 0xa6, 0x4d, 0x97, 0xc6, 0x91, 0x0e, + 0xa1, 0x29, 0x60, 0xc1, 0x99, 0x35, 0x4e, 0xb0, 0x62, 0xd6, 0x70, 0x29, 0xbd, 0xb1, 0x5e, 0xa9, + 0x2c, 0x28, 0x43, 0x82, 0xcb, 0x05, 0xd3, 0x26, 0x0e, 0x55, 0x37, 0x3d, 0x03, 0x0f, 0x31, 0x87, + 0xaa, 0x9b, 0xc2, 0xbc, 0x67, 0x61, 0x5c, 0xd3, 0x98, 0xce, 0xba, 0x56, 0xe5, 0x7b, 0x2c, 0xa7, + 0x90, 0x0f, 0x19, 0x4b, 0xd3, 0x16, 0x19, 0x02, 0xf7, 0x71, 0x07, 0x3d, 0x05, 0x47, 0x7d, 0x63, + 0x05, 0x09, 0xc7, 0xda, 0xb4, 0x8c, 0x92, 0x9e, 0x85, 0x71, 0x6b, 0xbf, 0x9d, 0x10, 0x85, 0x7a, + 0xb4, 0xf6, 0xa3, 0x64, 0x4f, 0xc0, 0x84, 0xb5, 0x6b, 0xb5, 0xd3, 0x9d, 0x0e, 0xd2, 0x21, 0x6b, + 0xd7, 0x8a, 0x12, 0xde, 0x4b, 0x37, 0xdc, 0x36, 0xd6, 0x54, 0x17, 0xd7, 0x0a, 0xc7, 0x83, 0xe8, + 0x81, 0x07, 0x68, 0x16, 0xf2, 0x9a, 0x56, 0xc5, 0x86, 0xba, 0xdd, 0xc0, 0x55, 0xd5, 0xc6, 0x86, + 0xea, 0x14, 0xa6, 0x82, 0xc8, 0x23, 0x9a, 0x56, 0xa1, 0x4f, 0xe7, 0xe8, 0x43, 0x74, 0x1a, 0xc6, + 0xcc, 0xed, 0x17, 0x35, 0xe6, 0x92, 0x55, 0xcb, 0xc6, 0x3b, 0xfa, 0xb5, 0xc2, 0x3d, 0xd4, 0xbe, + 0xa3, 0xe4, 0x01, 0x75, 0xc8, 0x75, 0x0a, 0x46, 0x0f, 0x40, 0x5e, 0x73, 0x76, 0x55, 0xdb, 0xa2, + 0x31, 0xd9, 0xb1, 0x54, 0x0d, 0x17, 0xee, 0x65, 0xa8, 0x0c, 0xbe, 0x2a, 0xc0, 0x64, 0x4a, 0x38, + 0x57, 0xf5, 0x1d, 0x57, 0x70, 0xbc, 0x9f, 0x4d, 0x09, 0x0a, 0xe3, 0xdc, 0x4e, 0x41, 0x9e, 0x98, + 0x22, 0xd4, 0xf1, 0x29, 0x8a, 0x36, 0x62, 0xed, 0x5a, 0xc1, 0x7e, 0xef, 0x86, 0x61, 0x82, 0xe9, + 0x77, 0xfa, 0x00, 0x4b, 0xc8, 0xac, 0xdd, 0x40, 0x8f, 0x8f, 0xc3, 0x31, 0x82, 0xd4, 0xc4, 0xae, + 0x5a, 0x53, 0x5d, 0x35, 0x80, 0xfd, 0x10, 0xc5, 0x26, 0x76, 0x5f, 0xe1, 0x0f, 0x43, 0x72, 0xda, + 0xad, 0xed, 0x7d, 0xcf, 0xb3, 0x1e, 0x66, 0x72, 0x12, 0x98, 0xf0, 0xad, 0xdb, 0x96, 0x74, 0xcb, + 0x25, 0xc8, 0x05, 0x1d, 0x1f, 0x65, 0x81, 0xb9, 0x7e, 0x5e, 0x22, 0x59, 0xd0, 0xfc, 0xda, 0x02, + 0xc9, 0x5f, 0xde, 0x5a, 0xc9, 0x27, 0x48, 0x1e, 0xb5, 0xbc, 0xb4, 0x59, 0xa9, 0x2a, 0x5b, 0xab, + 0x9b, 0x4b, 0x2b, 0x95, 0x7c, 0x32, 0x90, 0xb0, 0x3f, 0x9b, 0xca, 0xdc, 0x97, 0xbf, 0x5f, 0xfe, + 0x46, 0x02, 0x46, 0xc2, 0x3b, 0x30, 0xf4, 0x26, 0x38, 0x2e, 0xca, 0x25, 0x0e, 0x76, 0xab, 0x57, + 0x75, 0x9b, 0xce, 0xc8, 0xa6, 0xca, 0x56, 0x47, 0xcf, 0x27, 0x26, 0x38, 0xd6, 0x06, 0x76, 0x9f, + 0xd7, 0x6d, 0x32, 0xdf, 0x9a, 0xaa, 0x8b, 0x96, 0x61, 0xca, 0x30, 0xab, 0x8e, 0xab, 0x1a, 0x35, + 0xd5, 0xae, 0x55, 0xfd, 0x42, 0x55, 0x55, 0xd5, 0x34, 0xec, 0x38, 0x26, 0x5b, 0x09, 0x3d, 0x2e, + 0x27, 0x0d, 0x73, 0x83, 0x23, 0xfb, 0x4b, 0xc4, 0x1c, 0x47, 0x8d, 0xf8, 0x6f, 0xb2, 0x9b, 0xff, + 0xde, 0x01, 0xd9, 0xa6, 0x6a, 0x55, 0xb1, 0xe1, 0xda, 0xfb, 0x34, 0xef, 0xce, 0x28, 0x99, 0xa6, + 0x6a, 0x55, 0x48, 0xfb, 0x87, 0xb2, 0xfd, 0x79, 0x36, 0x95, 0xc9, 0xe4, 0xb3, 0xcf, 0xa6, 0x32, + 0xd9, 0x3c, 0xc8, 0xaf, 0x27, 0x21, 0x17, 0xcc, 0xc3, 0xc9, 0xb6, 0x46, 0xa3, 0x4b, 0x96, 0x44, + 0x83, 0xda, 0xdd, 0x3d, 0xb3, 0xf6, 0x99, 0x79, 0xb2, 0x96, 0x95, 0x06, 0x58, 0x76, 0xac, 0x30, + 0x4a, 0x92, 0x47, 0x10, 0x67, 0xc3, 0x2c, 0x1b, 0xc9, 0x28, 0xbc, 0x85, 0x16, 0x61, 0xe0, 0x45, + 0x87, 0xf2, 0x1e, 0xa0, 0xbc, 0xef, 0xe9, 0xcd, 0xfb, 0xd9, 0x0d, 0xca, 0x3c, 0xfb, 0xec, 0x46, + 0x75, 0x75, 0x4d, 0x59, 0x99, 0x5b, 0x56, 0x38, 0x39, 0x3a, 0x01, 0xa9, 0x86, 0xfa, 0xf2, 0x7e, + 0x78, 0xd5, 0xa3, 0xa0, 0x7e, 0x07, 0xe1, 0x04, 0xa4, 0xae, 0x62, 0x75, 0x2f, 0xbc, 0xd6, 0x50, + 0xd0, 0x6d, 0x9c, 0x0c, 0xb3, 0x90, 0xa6, 0xf6, 0x42, 0x00, 0xdc, 0x62, 0xf9, 0x23, 0x28, 0x03, + 0xa9, 0xf9, 0x35, 0x85, 0x4c, 0x88, 0x3c, 0xe4, 0x18, 0xb4, 0xba, 0xbe, 0x54, 0x99, 0xaf, 0xe4, + 0x13, 0xf2, 0x59, 0x18, 0x60, 0x46, 0x20, 0x93, 0xc5, 0x33, 0x43, 0xfe, 0x08, 0x6f, 0x72, 0x1e, + 0x92, 0x78, 0xba, 0xb5, 0x52, 0xae, 0x28, 0xf9, 0x44, 0x78, 0xa8, 0x53, 0xf9, 0xb4, 0xec, 0x40, + 0x2e, 0x98, 0x88, 0xff, 0x70, 0x36, 0xd9, 0x5f, 0x96, 0x60, 0x28, 0x90, 0x58, 0x93, 0x8c, 0x48, + 0x6d, 0x34, 0xcc, 0xab, 0x55, 0xb5, 0xa1, 0xab, 0x0e, 0x77, 0x0d, 0xa0, 0xa0, 0x39, 0x02, 0xe9, + 0x77, 0xe8, 0x7e, 0x48, 0x53, 0x24, 0x9d, 0x1f, 0x90, 0x3f, 0x29, 0x41, 0x3e, 0x9a, 0xd9, 0x46, + 0xc4, 0x94, 0x7e, 0x94, 0x62, 0xca, 0x9f, 0x90, 0x60, 0x24, 0x9c, 0xce, 0x46, 0xc4, 0xbb, 0xeb, + 0x47, 0x2a, 0xde, 0x1f, 0x26, 0x60, 0x38, 0x94, 0xc4, 0xf6, 0x2b, 0xdd, 0x4b, 0x30, 0xa6, 0xd7, + 0x70, 0xd3, 0x32, 0x5d, 0x6c, 0x68, 0xfb, 0xd5, 0x06, 0xbe, 0x82, 0x1b, 0x05, 0x99, 0x06, 0x8d, + 0xd9, 0xde, 0x69, 0xf2, 0xcc, 0x92, 0x4f, 0xb7, 0x4c, 0xc8, 0x4a, 0xe3, 0x4b, 0x0b, 0x95, 0x95, + 0xf5, 0xb5, 0xcd, 0xca, 0xea, 0xfc, 0x5b, 0xaa, 0x5b, 0xab, 0x97, 0x56, 0xd7, 0x9e, 0x5f, 0x55, + 0xf2, 0x7a, 0x04, 0xed, 0x36, 0x4e, 0xfb, 0x75, 0xc8, 0x47, 0x85, 0x42, 0xc7, 0xa1, 0x93, 0x58, + 0xf9, 0x23, 0x68, 0x1c, 0x46, 0x57, 0xd7, 0xaa, 0x1b, 0x4b, 0x0b, 0x95, 0x6a, 0xe5, 0xc2, 0x85, + 0xca, 0xfc, 0xe6, 0x06, 0x2b, 0x7c, 0x78, 0xd8, 0x9b, 0xa1, 0x09, 0x2e, 0xbf, 0x96, 0x84, 0xf1, + 0x0e, 0x92, 0xa0, 0x39, 0xbe, 0x65, 0x61, 0xbb, 0xa8, 0x87, 0xfb, 0x91, 0x7e, 0x86, 0xe4, 0x0c, + 0xeb, 0xaa, 0xed, 0xf2, 0x1d, 0xce, 0x03, 0x40, 0xac, 0x64, 0xb8, 0xfa, 0x8e, 0x8e, 0x6d, 0x5e, + 0x27, 0x62, 0xfb, 0x98, 0x51, 0x1f, 0xce, 0x4a, 0x45, 0x0f, 0x01, 0xb2, 0x4c, 0x47, 0x77, 0xf5, + 0x2b, 0xb8, 0xaa, 0x1b, 0xa2, 0xa8, 0x44, 0xf6, 0x35, 0x29, 0x25, 0x2f, 0x9e, 0x2c, 0x19, 0xae, + 0x87, 0x6d, 0xe0, 0xba, 0x1a, 0xc1, 0x26, 0xc1, 0x3c, 0xa9, 0xe4, 0xc5, 0x13, 0x0f, 0xfb, 0x2e, + 0xc8, 0xd5, 0xcc, 0x16, 0x49, 0xf6, 0x18, 0x1e, 0x59, 0x3b, 0x24, 0x65, 0x88, 0xc1, 0x3c, 0x14, + 0x9e, 0xc6, 0xfb, 0xd5, 0xac, 0x9c, 0x32, 0xc4, 0x60, 0x0c, 0xe5, 0x7e, 0x18, 0x55, 0xeb, 0x75, + 0x9b, 0x30, 0x17, 0x8c, 0xd8, 0xc6, 0x64, 0xc4, 0x03, 0x53, 0xc4, 0xe2, 0xb3, 0x90, 0x11, 0x76, + 0x20, 0x4b, 0x35, 0xb1, 0x44, 0xd5, 0x62, 0xbb, 0xed, 0xc4, 0xa9, 0xac, 0x92, 0x31, 0xc4, 0xc3, + 0xbb, 0x20, 0xa7, 0x3b, 0x55, 0xbf, 0x38, 0x9f, 0x98, 0x4e, 0x9c, 0xca, 0x28, 0x43, 0xba, 0xe3, + 0x15, 0x36, 0xe5, 0xcf, 0x26, 0x60, 0x24, 0xfc, 0x72, 0x01, 0x2d, 0x40, 0xa6, 0x61, 0x6a, 0x2a, + 0x75, 0x2d, 0xf6, 0x66, 0xeb, 0x54, 0xcc, 0xfb, 0x88, 0x99, 0x65, 0x8e, 0xaf, 0x78, 0x94, 0xc5, + 0xdf, 0x91, 0x20, 0x23, 0xc0, 0xe8, 0x18, 0xa4, 0x2c, 0xd5, 0xdd, 0xa5, 0xec, 0xd2, 0xe5, 0x44, + 0x5e, 0x52, 0x68, 0x9b, 0xc0, 0x1d, 0x4b, 0x35, 0xa8, 0x0b, 0x70, 0x38, 0x69, 0x93, 0x71, 0x6d, + 0x60, 0xb5, 0x46, 0x77, 0x3d, 0x66, 0xb3, 0x89, 0x0d, 0xd7, 0x11, 0xe3, 0xca, 0xe1, 0xf3, 0x1c, + 0x8c, 0x1e, 0x84, 0x31, 0xd7, 0x56, 0xf5, 0x46, 0x08, 0x37, 0x45, 0x71, 0xf3, 0xe2, 0x81, 0x87, + 0x5c, 0x82, 0x13, 0x82, 0x6f, 0x0d, 0xbb, 0xaa, 0xb6, 0x8b, 0x6b, 0x3e, 0xd1, 0x00, 0xad, 0x6e, + 0x1c, 0xe7, 0x08, 0x0b, 0xfc, 0xb9, 0xa0, 0x95, 0xbf, 0x21, 0xc1, 0x98, 0xd8, 0xa7, 0xd5, 0x3c, + 0x63, 0xad, 0x00, 0xa8, 0x86, 0x61, 0xba, 0x41, 0x73, 0xb5, 0xbb, 0x72, 0x1b, 0xdd, 0xcc, 0x9c, + 0x47, 0xa4, 0x04, 0x18, 0x14, 0x9b, 0x00, 0xfe, 0x93, 0xae, 0x66, 0x9b, 0x82, 0x21, 0xfe, 0xe6, + 0x88, 0xbe, 0x7e, 0x64, 0x3b, 0x7b, 0x60, 0x20, 0xb2, 0xa1, 0x43, 0x13, 0x90, 0xde, 0xc6, 0x75, + 0xdd, 0xe0, 0xf5, 0x60, 0xd6, 0x10, 0xf5, 0x97, 0x94, 0x57, 0x7f, 0x29, 0x7f, 0x50, 0x82, 0x71, + 0xcd, 0x6c, 0x46, 0xe5, 0x2d, 0xe7, 0x23, 0xe5, 0x05, 0xe7, 0xa2, 0xf4, 0xd6, 0xa7, 0xeb, 0xba, + 0xbb, 0xdb, 0xda, 0x9e, 0xd1, 0xcc, 0xe6, 0x6c, 0xdd, 0x6c, 0xa8, 0x46, 0xdd, 0x7f, 0x7f, 0x4a, + 0x7f, 0x68, 0x0f, 0xd7, 0xb1, 0xf1, 0x70, 0xdd, 0x0c, 0xbc, 0x4d, 0x3d, 0xef, 0xff, 0xfc, 0x73, + 0x49, 0xfa, 0x85, 0x44, 0x72, 0x71, 0xbd, 0xfc, 0xb9, 0x44, 0x71, 0x91, 0x75, 0xb7, 0x2e, 0xcc, + 0xa3, 0xe0, 0x9d, 0x06, 0xd6, 0x88, 0xca, 0xf0, 0xed, 0x07, 0x61, 0xa2, 0x6e, 0xd6, 0x4d, 0xca, + 0x71, 0x96, 0xfc, 0xe2, 0x6f, 0x64, 0xb3, 0x1e, 0xb4, 0x18, 0xfb, 0xfa, 0xb6, 0xb4, 0x0a, 0xe3, + 0x1c, 0xb9, 0x4a, 0x5f, 0x09, 0xb1, 0x8d, 0x0d, 0xea, 0x59, 0x56, 0x2b, 0xfc, 0xda, 0xb7, 0xe8, + 0x82, 0xae, 0x8c, 0x71, 0x52, 0xf2, 0x8c, 0xed, 0x7d, 0x4a, 0x0a, 0x1c, 0x0d, 0xf1, 0x63, 0xd3, + 0x16, 0xdb, 0x31, 0x1c, 0x7f, 0x8b, 0x73, 0x1c, 0x0f, 0x70, 0xdc, 0xe0, 0xa4, 0xa5, 0x79, 0x18, + 0x3e, 0x08, 0xaf, 0x7f, 0xc9, 0x79, 0xe5, 0x70, 0x90, 0xc9, 0x22, 0x8c, 0x52, 0x26, 0x5a, 0xcb, + 0x71, 0xcd, 0x26, 0x8d, 0x89, 0xbd, 0xd9, 0xfc, 0xf6, 0xb7, 0xd8, 0x3c, 0x1a, 0x21, 0x64, 0xf3, + 0x1e, 0x55, 0xa9, 0x04, 0xf4, 0x2d, 0x58, 0x0d, 0x6b, 0x8d, 0x18, 0x0e, 0x5f, 0xe1, 0x82, 0x78, + 0xf8, 0xa5, 0xcb, 0x30, 0x41, 0x7e, 0xd3, 0x90, 0x15, 0x94, 0x24, 0xbe, 0x06, 0x57, 0xf8, 0xc6, + 0x7b, 0xd8, 0x54, 0x1d, 0xf7, 0x18, 0x04, 0x64, 0x0a, 0x8c, 0x62, 0x1d, 0xbb, 0x2e, 0xb6, 0x9d, + 0xaa, 0xda, 0xe8, 0x24, 0x5e, 0xa0, 0x88, 0x51, 0xf8, 0xd8, 0x77, 0xc2, 0xa3, 0xb8, 0xc8, 0x28, + 0xe7, 0x1a, 0x8d, 0xd2, 0x16, 0x1c, 0xef, 0xe0, 0x15, 0x7d, 0xf0, 0x7c, 0x8d, 0xf3, 0x9c, 0x68, + 0xf3, 0x0c, 0xc2, 0x76, 0x1d, 0x04, 0xdc, 0x1b, 0xcb, 0x3e, 0x78, 0x7e, 0x9c, 0xf3, 0x44, 0x9c, + 0x56, 0x0c, 0x29, 0xe1, 0xf8, 0x2c, 0x8c, 0x5d, 0xc1, 0xf6, 0xb6, 0xe9, 0xf0, 0xc2, 0x51, 0x1f, + 0xec, 0x3e, 0xc1, 0xd9, 0x8d, 0x72, 0x42, 0x5a, 0x49, 0x22, 0xbc, 0x9e, 0x82, 0xcc, 0x8e, 0xaa, + 0xe1, 0x3e, 0x58, 0x5c, 0xe7, 0x2c, 0x06, 0x09, 0x3e, 0x21, 0x9d, 0x83, 0x5c, 0xdd, 0xe4, 0xab, + 0x56, 0x3c, 0xf9, 0x27, 0x39, 0xf9, 0x90, 0xa0, 0xe1, 0x2c, 0x2c, 0xd3, 0x6a, 0x35, 0xc8, 0x92, + 0x16, 0xcf, 0xe2, 0x6f, 0x09, 0x16, 0x82, 0x86, 0xb3, 0x38, 0x80, 0x59, 0x3f, 0x25, 0x58, 0x38, + 0x01, 0x7b, 0x3e, 0x03, 0x43, 0xa6, 0xd1, 0xd8, 0x37, 0x8d, 0x7e, 0x84, 0xf8, 0x34, 0xe7, 0x00, + 0x9c, 0x84, 0x30, 0x38, 0x0f, 0xd9, 0x7e, 0x07, 0xe2, 0x6f, 0x7f, 0x47, 0x4c, 0x0f, 0x31, 0x02, + 0x8b, 0x30, 0x2a, 0x02, 0x94, 0x6e, 0x1a, 0x7d, 0xb0, 0xf8, 0x3b, 0x9c, 0xc5, 0x48, 0x80, 0x8c, + 0xab, 0xe1, 0x62, 0xc7, 0xad, 0xe3, 0x7e, 0x98, 0x7c, 0x56, 0xa8, 0xc1, 0x49, 0xb8, 0x29, 0xb7, + 0xb1, 0xa1, 0xed, 0xf6, 0xc7, 0xe1, 0x97, 0x84, 0x29, 0x05, 0x0d, 0x61, 0x31, 0x0f, 0xc3, 0x4d, + 0xd5, 0x76, 0x76, 0xd5, 0x46, 0x5f, 0xc3, 0xf1, 0x77, 0x39, 0x8f, 0x9c, 0x47, 0xc4, 0x2d, 0xd2, + 0x32, 0x0e, 0xc2, 0xe6, 0x73, 0xc2, 0x22, 0x01, 0x32, 0x3e, 0xf5, 0x1c, 0x97, 0x56, 0xd9, 0x0e, + 0xc2, 0xed, 0x97, 0xc5, 0xd4, 0x63, 0xb4, 0x2b, 0x41, 0x8e, 0xe7, 0x21, 0xeb, 0xe8, 0x2f, 0xf7, + 0xc5, 0xe6, 0xf3, 0x62, 0xa4, 0x29, 0x01, 0x21, 0x7e, 0x0b, 0x9c, 0xe8, 0xb8, 0x4c, 0xf4, 0xc1, + 0xec, 0xef, 0x71, 0x66, 0xc7, 0x3a, 0x2c, 0x15, 0x3c, 0x24, 0x1c, 0x94, 0xe5, 0xdf, 0x17, 0x21, + 0x01, 0x47, 0x78, 0xad, 0x93, 0x7d, 0x84, 0xa3, 0xee, 0x1c, 0xcc, 0x6a, 0xbf, 0x22, 0xac, 0xc6, + 0x68, 0x43, 0x56, 0xdb, 0x84, 0x63, 0x9c, 0xe3, 0xc1, 0xc6, 0xf5, 0x57, 0x45, 0x60, 0x65, 0xd4, + 0x5b, 0xe1, 0xd1, 0x7d, 0x1b, 0x14, 0x3d, 0x73, 0x8a, 0x84, 0xd5, 0xa9, 0x36, 0x55, 0xab, 0x0f, + 0xce, 0xbf, 0xc6, 0x39, 0x8b, 0x88, 0xef, 0x65, 0xbc, 0xce, 0x8a, 0x6a, 0x11, 0xe6, 0x2f, 0x40, + 0x41, 0x30, 0x6f, 0x19, 0x36, 0xd6, 0xcc, 0xba, 0xa1, 0xbf, 0x8c, 0x6b, 0x7d, 0xb0, 0xfe, 0xf5, + 0xc8, 0x50, 0x6d, 0x05, 0xc8, 0x09, 0xe7, 0x25, 0xc8, 0x7b, 0xb9, 0x4a, 0x55, 0x6f, 0x5a, 0xa6, + 0xed, 0xc6, 0x70, 0xfc, 0x82, 0x18, 0x29, 0x8f, 0x6e, 0x89, 0x92, 0x95, 0x2a, 0x30, 0x42, 0x9b, + 0xfd, 0xba, 0xe4, 0x17, 0x39, 0xa3, 0x61, 0x9f, 0x8a, 0x07, 0x0e, 0xcd, 0x6c, 0x5a, 0xaa, 0xdd, + 0x4f, 0xfc, 0xfb, 0x07, 0x22, 0x70, 0x70, 0x12, 0x1e, 0x38, 0xdc, 0x7d, 0x0b, 0x93, 0xd5, 0xbe, + 0x0f, 0x0e, 0x5f, 0x12, 0x81, 0x43, 0xd0, 0x70, 0x16, 0x22, 0x61, 0xe8, 0x83, 0xc5, 0x3f, 0x14, + 0x2c, 0x04, 0x0d, 0x61, 0xf1, 0x9c, 0xbf, 0xd0, 0xda, 0xb8, 0xae, 0x3b, 0xae, 0xcd, 0xd2, 0xe4, + 0xde, 0xac, 0xfe, 0xd1, 0x77, 0xc2, 0x49, 0x98, 0x12, 0x20, 0x25, 0x91, 0x88, 0x97, 0x5d, 0xe9, + 0x2e, 0x2a, 0x5e, 0xb0, 0xdf, 0x10, 0x91, 0x28, 0x40, 0x46, 0x64, 0x0b, 0x64, 0x88, 0xc4, 0xec, + 0x1a, 0xd9, 0x3b, 0xf4, 0xc1, 0xee, 0x1f, 0x47, 0x84, 0xdb, 0x10, 0xb4, 0x84, 0x67, 0x20, 0xff, + 0x69, 0x19, 0x7b, 0x78, 0xbf, 0x2f, 0xef, 0xfc, 0x27, 0x91, 0xfc, 0x67, 0x8b, 0x51, 0xb2, 0x18, + 0x32, 0x1a, 0xc9, 0xa7, 0x50, 0xdc, 0xf9, 0xa1, 0xc2, 0x4f, 0x7d, 0x8f, 0xeb, 0x1b, 0x4e, 0xa7, + 0x4a, 0xcb, 0xc4, 0xc9, 0xc3, 0x49, 0x4f, 0x3c, 0xb3, 0xf7, 0x7c, 0xcf, 0xf3, 0xf3, 0x50, 0xce, + 0x53, 0xba, 0x00, 0xc3, 0xa1, 0x84, 0x27, 0x9e, 0xd5, 0x7b, 0x39, 0xab, 0x5c, 0x30, 0xdf, 0x29, + 0x9d, 0x85, 0x14, 0x49, 0x5e, 0xe2, 0xc9, 0xff, 0x2a, 0x27, 0xa7, 0xe8, 0xa5, 0x37, 0x43, 0x46, + 0x24, 0x2d, 0xf1, 0xa4, 0xef, 0xe3, 0xa4, 0x1e, 0x09, 0x21, 0x17, 0x09, 0x4b, 0x3c, 0xf9, 0x5f, + 0x13, 0xe4, 0x82, 0x84, 0x90, 0xf7, 0x6f, 0xc2, 0x2f, 0xff, 0x74, 0x8a, 0x2f, 0x3a, 0xc2, 0x76, + 0xe7, 0x61, 0x90, 0x67, 0x2a, 0xf1, 0xd4, 0x1f, 0xe0, 0x9d, 0x0b, 0x8a, 0xd2, 0x13, 0x90, 0xee, + 0xd3, 0xe0, 0x3f, 0xc3, 0x49, 0x19, 0x7e, 0x69, 0x1e, 0x86, 0x02, 0xd9, 0x49, 0x3c, 0xf9, 0xdf, + 0xe0, 0xe4, 0x41, 0x2a, 0x22, 0x3a, 0xcf, 0x4e, 0xe2, 0x19, 0x7c, 0x50, 0x88, 0xce, 0x29, 0x88, + 0xd9, 0x44, 0x62, 0x12, 0x4f, 0xfd, 0x21, 0x61, 0x75, 0x41, 0x52, 0x7a, 0x06, 0xb2, 0xde, 0x62, + 0x13, 0x4f, 0xff, 0x61, 0x4e, 0xef, 0xd3, 0x10, 0x0b, 0x04, 0x16, 0xbb, 0x78, 0x16, 0x3f, 0x2b, + 0x2c, 0x10, 0xa0, 0x22, 0xd3, 0x28, 0x9a, 0xc0, 0xc4, 0x73, 0xfa, 0x88, 0x98, 0x46, 0x91, 0xfc, + 0x85, 0x8c, 0x26, 0x8d, 0xf9, 0xf1, 0x2c, 0x7e, 0x4e, 0x8c, 0x26, 0xc5, 0x27, 0x62, 0x44, 0x33, + 0x82, 0x78, 0x1e, 0x7f, 0x53, 0x88, 0x11, 0x49, 0x08, 0x4a, 0xeb, 0x80, 0xda, 0xb3, 0x81, 0x78, + 0x7e, 0x1f, 0xe5, 0xfc, 0xc6, 0xda, 0x92, 0x81, 0xd2, 0xf3, 0x70, 0xac, 0x73, 0x26, 0x10, 0xcf, + 0xf5, 0x63, 0xdf, 0x8b, 0xec, 0xdd, 0x82, 0x89, 0x40, 0x69, 0xd3, 0x5f, 0x52, 0x82, 0x59, 0x40, + 0x3c, 0xdb, 0xd7, 0xbe, 0x17, 0x0e, 0xdc, 0xc1, 0x24, 0xa0, 0x34, 0x07, 0xe0, 0x2f, 0xc0, 0xf1, + 0xbc, 0x3e, 0xc1, 0x79, 0x05, 0x88, 0xc8, 0xd4, 0xe0, 0xeb, 0x6f, 0x3c, 0xfd, 0x75, 0x31, 0x35, + 0x38, 0x05, 0x99, 0x1a, 0x62, 0xe9, 0x8d, 0xa7, 0xfe, 0xa4, 0x98, 0x1a, 0x82, 0x84, 0x78, 0x76, + 0x60, 0x75, 0x8b, 0xe7, 0xf0, 0x69, 0xe1, 0xd9, 0x01, 0xaa, 0xd2, 0x2a, 0x8c, 0xb5, 0x2d, 0x88, + 0xf1, 0xac, 0x7e, 0x81, 0xb3, 0xca, 0x47, 0xd7, 0xc3, 0xe0, 0xe2, 0xc5, 0x17, 0xc3, 0x78, 0x6e, + 0x9f, 0x89, 0x2c, 0x5e, 0x7c, 0x2d, 0x2c, 0x9d, 0x87, 0x8c, 0xd1, 0x6a, 0x34, 0xc8, 0xe4, 0x41, + 0xbd, 0xcf, 0xfc, 0x15, 0xfe, 0xcb, 0xf7, 0xb9, 0x75, 0x04, 0x41, 0xe9, 0x2c, 0xa4, 0x71, 0x73, + 0x1b, 0xd7, 0xe2, 0x28, 0xbf, 0xfd, 0x7d, 0x11, 0x30, 0x09, 0x76, 0xe9, 0x19, 0x00, 0x56, 0x1a, + 0xa1, 0xaf, 0x07, 0x63, 0x68, 0xff, 0xeb, 0xf7, 0xf9, 0x69, 0x1c, 0x9f, 0xc4, 0x67, 0xc0, 0xce, + 0xf6, 0xf4, 0x66, 0xf0, 0x9d, 0x30, 0x03, 0x3a, 0x22, 0x4f, 0xc1, 0xe0, 0x8b, 0x8e, 0x69, 0xb8, + 0x6a, 0x3d, 0x8e, 0xfa, 0xbf, 0x71, 0x6a, 0x81, 0x4f, 0x0c, 0xd6, 0x34, 0x6d, 0xec, 0xaa, 0x75, + 0x27, 0x8e, 0xf6, 0xbf, 0x73, 0x5a, 0x8f, 0x80, 0x10, 0x6b, 0xaa, 0xe3, 0xf6, 0xa3, 0xf7, 0x1f, + 0x0b, 0x62, 0x41, 0x40, 0x84, 0x26, 0xbf, 0xf7, 0xf0, 0x7e, 0x1c, 0xed, 0x77, 0x85, 0xd0, 0x1c, + 0xbf, 0xf4, 0x66, 0xc8, 0x92, 0x9f, 0xec, 0x88, 0x5d, 0x0c, 0xf1, 0x9f, 0x70, 0x62, 0x9f, 0x82, + 0xf4, 0xec, 0xb8, 0x35, 0x57, 0x8f, 0x37, 0xf6, 0x4d, 0x3e, 0xd2, 0x02, 0xbf, 0x34, 0x07, 0x43, + 0x8e, 0x5b, 0xab, 0xb5, 0x78, 0x7e, 0x1a, 0x43, 0xfe, 0xa7, 0xdf, 0xf7, 0x4a, 0x16, 0x1e, 0x0d, + 0x19, 0xed, 0xab, 0x7b, 0xae, 0x65, 0xd2, 0x57, 0x20, 0x71, 0x1c, 0xbe, 0xc7, 0x39, 0x04, 0x48, + 0x4a, 0xf3, 0x90, 0x23, 0xba, 0xd8, 0xd8, 0xc2, 0xf4, 0x7d, 0x55, 0x0c, 0x8b, 0x3f, 0xe3, 0x06, + 0x08, 0x11, 0x95, 0x7f, 0xf2, 0x2b, 0xaf, 0x4f, 0x4a, 0x5f, 0x7f, 0x7d, 0x52, 0xfa, 0xc3, 0xd7, + 0x27, 0xa5, 0x0f, 0x7d, 0x73, 0xf2, 0xc8, 0xd7, 0xbf, 0x39, 0x79, 0xe4, 0xf7, 0xbe, 0x39, 0x79, + 0xa4, 0x73, 0xd9, 0x18, 0x16, 0xcd, 0x45, 0x93, 0x15, 0x8c, 0xdf, 0x2a, 0x87, 0xca, 0xc5, 0x75, + 0xd3, 0xaf, 0xd6, 0x7a, 0x9b, 0x1c, 0xf8, 0x33, 0x89, 0x6c, 0x98, 0xc3, 0xb5, 0x5c, 0xd5, 0xd8, + 0xef, 0x72, 0x07, 0xa7, 0xd8, 0xb1, 0x30, 0x2c, 0xbf, 0x09, 0x92, 0x73, 0xc6, 0x3e, 0x3a, 0xc1, + 0x62, 0x5e, 0xb5, 0x65, 0x37, 0xf8, 0xd1, 0xaf, 0x41, 0xd2, 0xde, 0xb2, 0x1b, 0x68, 0xc2, 0x3f, + 0x9f, 0x29, 0x9d, 0xca, 0xf1, 0x43, 0x97, 0xa5, 0xd4, 0x77, 0x3f, 0x3d, 0x75, 0xa4, 0xbc, 0x17, + 0xd5, 0xf0, 0xcb, 0xb1, 0x5a, 0x66, 0xe6, 0x8c, 0x7d, 0xaa, 0xe4, 0xba, 0xf4, 0xd6, 0x34, 0xe9, + 0xc3, 0x11, 0x85, 0xed, 0xc9, 0x68, 0x61, 0xfb, 0x79, 0xdc, 0x68, 0x5c, 0x32, 0xcc, 0xab, 0xc6, + 0x26, 0x41, 0xdb, 0x1e, 0xa0, 0x3c, 0x1e, 0x83, 0x0f, 0x25, 0x60, 0x2a, 0xaa, 0x37, 0x71, 0x1c, + 0xc7, 0x55, 0x9b, 0x56, 0xb7, 0x1b, 0x48, 0xe7, 0x21, 0xbb, 0x29, 0x70, 0x50, 0x01, 0x06, 0x1d, + 0xac, 0x99, 0x46, 0xcd, 0xa1, 0xca, 0x26, 0x15, 0xd1, 0x24, 0xca, 0x1a, 0xaa, 0x61, 0x3a, 0xfc, + 0x80, 0x24, 0x6b, 0x94, 0x7f, 0x5e, 0x3a, 0xd8, 0x48, 0x8e, 0x78, 0x5d, 0x09, 0x4d, 0x1f, 0xec, + 0x55, 0xfe, 0xa7, 0x56, 0xf0, 0x55, 0x08, 0xd4, 0xfa, 0xfb, 0x35, 0xc9, 0xbb, 0x93, 0x70, 0x42, + 0x33, 0x9d, 0xa6, 0xe9, 0x54, 0xd9, 0x08, 0xb3, 0x06, 0x37, 0x46, 0x2e, 0xf8, 0xa8, 0x8f, 0xfa, + 0xff, 0x45, 0x18, 0xa1, 0xb3, 0x80, 0x56, 0x3e, 0x69, 0xe0, 0x89, 0x5d, 0x2b, 0xbe, 0xfa, 0x6f, + 0xd3, 0xd4, 0x6b, 0x86, 0x3d, 0x42, 0x7a, 0xb4, 0x63, 0x13, 0x26, 0xf4, 0xa6, 0xd5, 0xc0, 0xf4, + 0x1d, 0x50, 0xd5, 0x7b, 0x16, 0xcf, 0xef, 0x6b, 0x9c, 0xdf, 0xb8, 0x4f, 0xbe, 0x24, 0xa8, 0x4b, + 0xcb, 0x30, 0xa6, 0x6a, 0x1a, 0xb6, 0x42, 0x2c, 0x63, 0x66, 0xa8, 0x10, 0x30, 0xcf, 0x29, 0x3d, + 0x6e, 0xe5, 0x67, 0xba, 0x8d, 0xed, 0x5b, 0xef, 0x0d, 0x0c, 0x9a, 0x8d, 0xeb, 0xd8, 0x78, 0xd8, + 0xc0, 0xee, 0x55, 0xd3, 0xde, 0xe3, 0xe6, 0x7d, 0x98, 0x75, 0x25, 0x06, 0xe1, 0xbd, 0x49, 0x98, + 0x64, 0x0f, 0x66, 0xb7, 0x55, 0x07, 0xcf, 0x5e, 0x79, 0x74, 0x1b, 0xbb, 0xea, 0xa3, 0xb3, 0x9a, + 0xa9, 0x1b, 0x7c, 0x24, 0xc6, 0xf9, 0xb8, 0x90, 0xe7, 0x33, 0xfc, 0x79, 0x97, 0x89, 0xb9, 0x08, + 0xa9, 0x79, 0x53, 0x37, 0x88, 0x47, 0xd6, 0xb0, 0x61, 0x36, 0xf9, 0xb4, 0x64, 0x0d, 0x74, 0x37, + 0x0c, 0xa8, 0x4d, 0xb3, 0x65, 0xb8, 0xec, 0xf5, 0x55, 0x79, 0xe8, 0x2b, 0x37, 0xa6, 0x8e, 0xfc, + 0xfe, 0x8d, 0xa9, 0xe4, 0x92, 0xe1, 0x2a, 0xfc, 0x51, 0x29, 0xf5, 0xc6, 0xa7, 0xa6, 0x24, 0xf9, + 0x59, 0x18, 0x5c, 0xc0, 0xda, 0x61, 0x78, 0x2d, 0x60, 0x2d, 0xc2, 0xeb, 0x01, 0xc8, 0x2c, 0x19, + 0x2e, 0x3b, 0x33, 0x7b, 0x27, 0x24, 0x75, 0x83, 0x9d, 0xc2, 0x8a, 0xf4, 0x4f, 0xe0, 0x04, 0x75, + 0x01, 0x6b, 0x1e, 0x6a, 0x0d, 0x6b, 0x51, 0x54, 0xc2, 0x9e, 0xc0, 0xcb, 0x0b, 0xbf, 0xf7, 0x9f, + 0x26, 0x8f, 0xbc, 0xf2, 0xfa, 0xe4, 0x91, 0xae, 0x23, 0x11, 0x0c, 0x87, 0xdc, 0xc4, 0x7c, 0x08, + 0x9c, 0xda, 0xde, 0xac, 0x1b, 0x9a, 0x0b, 0x7f, 0x3d, 0x01, 0x93, 0x6d, 0x2e, 0xce, 0x17, 0x86, + 0x6e, 0xd1, 0xa1, 0x04, 0x99, 0x05, 0xb1, 0xde, 0x1c, 0x34, 0x38, 0xfc, 0xdc, 0x01, 0x83, 0xc3, + 0xb0, 0xe8, 0x49, 0xc4, 0x86, 0xd3, 0xf1, 0xb1, 0x41, 0xc8, 0x7f, 0x88, 0xd0, 0xf0, 0xb9, 0x14, + 0xdc, 0x49, 0x2f, 0x85, 0xd8, 0x4d, 0xdd, 0x70, 0x67, 0x35, 0x7b, 0xdf, 0x72, 0xe9, 0x72, 0x62, + 0xee, 0x70, 0x6b, 0x8c, 0xf9, 0x8f, 0x67, 0xd8, 0xe3, 0x2e, 0x2e, 0xb9, 0x03, 0xe9, 0x75, 0x42, + 0x47, 0x0c, 0xe1, 0x9a, 0xae, 0xda, 0xe0, 0x06, 0x62, 0x0d, 0x02, 0x65, 0x17, 0x49, 0x12, 0x0c, + 0xaa, 0x8b, 0x3b, 0x24, 0x0d, 0xac, 0xee, 0xb0, 0x83, 0xbb, 0x49, 0xba, 0x84, 0x64, 0x08, 0x80, + 0x9e, 0xd1, 0x9d, 0x80, 0xb4, 0xda, 0x62, 0xaf, 0x9c, 0x93, 0x64, 0x6d, 0xa1, 0x0d, 0xf9, 0x12, + 0x0c, 0xf2, 0xd7, 0x5c, 0x28, 0x0f, 0xc9, 0x3d, 0xbc, 0x4f, 0xfb, 0xc9, 0x29, 0xe4, 0x27, 0x9a, + 0x81, 0x34, 0x15, 0x9e, 0xdf, 0x48, 0x28, 0xcc, 0xb4, 0x49, 0x3f, 0x43, 0x85, 0x54, 0x18, 0x9a, + 0xfc, 0x2c, 0x64, 0x16, 0xcc, 0xa6, 0x6e, 0x98, 0x61, 0x6e, 0x59, 0xc6, 0x8d, 0xca, 0x6c, 0xb5, + 0xb8, 0xeb, 0x2b, 0xac, 0x81, 0x8e, 0xc1, 0x00, 0x3b, 0xc8, 0xcd, 0x5f, 0x9b, 0xf3, 0x96, 0x3c, + 0x0f, 0x83, 0x94, 0xf7, 0x9a, 0x85, 0x10, 0xbf, 0xd9, 0xc3, 0x4f, 0x8c, 0xd3, 0x28, 0xc9, 0xd9, + 0x27, 0x7c, 0x61, 0x11, 0xa4, 0x6a, 0xaa, 0xab, 0x72, 0xbd, 0xe9, 0x6f, 0xf9, 0x69, 0xc8, 0x70, + 0x26, 0x0e, 0x3a, 0x03, 0x49, 0xd3, 0x72, 0xf8, 0x8b, 0xef, 0x62, 0x37, 0x55, 0xd6, 0xac, 0x72, + 0x8a, 0x4c, 0x1a, 0x85, 0x20, 0x97, 0x95, 0xae, 0xb3, 0xe4, 0xc9, 0x80, 0x23, 0x05, 0x86, 0x3c, + 0xf0, 0x93, 0x0d, 0x69, 0x9b, 0x3b, 0x78, 0xce, 0xf2, 0xe9, 0x04, 0x4c, 0x06, 0x9e, 0x5e, 0xc1, + 0x36, 0xd9, 0xeb, 0xb1, 0x09, 0xc6, 0xbd, 0x05, 0x05, 0x84, 0xe4, 0xcf, 0xbb, 0xb8, 0xcb, 0x9b, + 0x21, 0x39, 0x67, 0x59, 0xa8, 0x08, 0x19, 0xf6, 0x82, 0xdb, 0x64, 0xfe, 0x92, 0x52, 0xbc, 0x36, + 0x79, 0xe6, 0x98, 0x3b, 0xee, 0x55, 0xd5, 0xf6, 0xae, 0x30, 0x89, 0xb6, 0xfc, 0x14, 0x64, 0xe7, + 0x4d, 0xc3, 0xc1, 0x86, 0xd3, 0xa2, 0x53, 0x6f, 0xbb, 0x61, 0x6a, 0x7b, 0x9c, 0x03, 0x6b, 0x10, + 0x83, 0xab, 0x96, 0x45, 0x29, 0x53, 0x0a, 0xf9, 0xc9, 0xc2, 0x54, 0x79, 0xa3, 0xab, 0x89, 0x9e, + 0x3a, 0xb8, 0x89, 0xb8, 0x92, 0x9e, 0x8d, 0xfe, 0xb7, 0x04, 0x27, 0xdb, 0x27, 0xd4, 0x1e, 0xde, + 0x77, 0x0e, 0x3a, 0x9f, 0x5e, 0x80, 0xec, 0x3a, 0xbd, 0x47, 0x7c, 0x09, 0xef, 0xa3, 0x22, 0x0c, + 0xe2, 0xda, 0x99, 0xb3, 0x67, 0x1f, 0x7d, 0x8a, 0x79, 0xfb, 0xc5, 0x23, 0x8a, 0x00, 0xa0, 0x49, + 0xc8, 0x3a, 0x58, 0xb3, 0xce, 0x9c, 0x3d, 0xb7, 0xf7, 0x28, 0x73, 0xaf, 0x8b, 0x47, 0x14, 0x1f, + 0x54, 0xca, 0x10, 0xad, 0xdf, 0xf8, 0xf4, 0x94, 0x54, 0x4e, 0x43, 0xd2, 0x69, 0x35, 0x6f, 0xab, + 0x8f, 0xbc, 0x96, 0x86, 0xe9, 0x20, 0x25, 0x0d, 0x50, 0x57, 0xd4, 0x86, 0x5e, 0x53, 0xfd, 0x1b, + 0xe0, 0xf9, 0x80, 0x0d, 0x28, 0x46, 0x67, 0x13, 0x14, 0x7b, 0x5a, 0x52, 0xfe, 0x75, 0x09, 0x72, + 0x97, 0x05, 0xe7, 0x0d, 0xec, 0xa2, 0xf3, 0x00, 0x5e, 0x4f, 0x62, 0xda, 0xdc, 0x31, 0x13, 0xed, + 0x6b, 0xc6, 0xa3, 0x51, 0x02, 0xe8, 0xe8, 0x09, 0xea, 0x88, 0x96, 0xe9, 0xf0, 0xfb, 0x2f, 0x31, + 0xa4, 0x1e, 0x32, 0x7a, 0x08, 0x10, 0x8d, 0x70, 0xd5, 0x2b, 0xa6, 0xab, 0x1b, 0xf5, 0xaa, 0x65, + 0x5e, 0xe5, 0x97, 0x05, 0x93, 0x4a, 0x9e, 0x3e, 0xb9, 0x4c, 0x1f, 0xac, 0x13, 0x38, 0x11, 0x3a, + 0xeb, 0x71, 0x21, 0xab, 0x89, 0x5a, 0xab, 0xd9, 0xd8, 0x71, 0x78, 0x10, 0x13, 0x4d, 0x74, 0x1e, + 0x06, 0xad, 0xd6, 0x76, 0x55, 0x44, 0x8c, 0xa1, 0x33, 0x27, 0x3b, 0xcd, 0x7f, 0xe1, 0x1f, 0x3c, + 0x02, 0x0c, 0x58, 0xad, 0x6d, 0xe2, 0x2d, 0x77, 0x41, 0xae, 0x83, 0x30, 0x43, 0x57, 0x7c, 0x39, + 0xe8, 0xf5, 0x75, 0xae, 0x41, 0xd5, 0xb2, 0x75, 0xd3, 0xd6, 0xdd, 0x7d, 0x7a, 0x7a, 0x25, 0xa9, + 0xe4, 0xc5, 0x83, 0x75, 0x0e, 0x97, 0xf7, 0x60, 0x74, 0x83, 0xa6, 0x5a, 0xbe, 0xe4, 0x67, 0x7d, + 0xf9, 0xa4, 0x78, 0xf9, 0xba, 0x4a, 0x96, 0x68, 0x93, 0xac, 0xfc, 0x5c, 0x57, 0xef, 0x7c, 0xe2, + 0xe0, 0xde, 0x19, 0x5e, 0xfc, 0xff, 0xf8, 0x44, 0x68, 0x72, 0xf2, 0xcc, 0x3a, 0x10, 0xbe, 0xfa, + 0x75, 0xcc, 0xb8, 0x1d, 0x46, 0xb1, 0xf7, 0xa2, 0x5a, 0x8c, 0x09, 0xa3, 0xc5, 0xd8, 0x29, 0x24, + 0x3f, 0x05, 0xc3, 0xeb, 0xaa, 0xed, 0x6e, 0x60, 0xf7, 0x22, 0x56, 0x6b, 0xd8, 0x0e, 0xaf, 0xba, + 0xc3, 0x62, 0xd5, 0x45, 0x90, 0xa2, 0x4b, 0x2b, 0x5b, 0x75, 0xe8, 0x6f, 0x79, 0x17, 0x52, 0xf4, + 0x04, 0x9b, 0xb7, 0x22, 0x73, 0x0a, 0xb6, 0x22, 0x93, 0x58, 0xba, 0xef, 0x62, 0x47, 0x6c, 0xe8, + 0x68, 0x03, 0x3d, 0x2e, 0xd6, 0xd5, 0x64, 0xef, 0x75, 0x95, 0x3b, 0x22, 0x5f, 0x5d, 0x1b, 0x30, + 0x58, 0x26, 0xa1, 0x78, 0x69, 0xc1, 0x13, 0x44, 0xf2, 0x05, 0x41, 0x2b, 0x30, 0x6a, 0xa9, 0xb6, + 0x4b, 0x8f, 0xee, 0xef, 0x52, 0x2d, 0xb8, 0xaf, 0x4f, 0xb5, 0xcf, 0xbc, 0x90, 0xb2, 0xbc, 0x97, + 0x61, 0x2b, 0x08, 0x94, 0xff, 0x28, 0x05, 0x03, 0xdc, 0x18, 0x6f, 0x86, 0x41, 0x6e, 0x56, 0xee, + 0x9d, 0x77, 0xce, 0xb4, 0x2f, 0x4c, 0x33, 0xde, 0x02, 0xc2, 0xf9, 0x09, 0x1a, 0x74, 0x1f, 0x64, + 0xb4, 0x5d, 0x55, 0x37, 0xaa, 0x7a, 0x4d, 0x64, 0xbd, 0xaf, 0xdf, 0x98, 0x1a, 0x9c, 0x27, 0xb0, + 0xa5, 0x05, 0x65, 0x90, 0x3e, 0x5c, 0xaa, 0x91, 0x4c, 0x60, 0x17, 0xeb, 0xf5, 0x5d, 0x97, 0xcf, + 0x30, 0xde, 0x42, 0x4f, 0x42, 0x8a, 0x38, 0x04, 0xbf, 0xd9, 0x55, 0x6c, 0xdb, 0x7b, 0x78, 0x1b, + 0xc0, 0x72, 0x86, 0x74, 0xfc, 0xa1, 0x3f, 0x98, 0x92, 0x14, 0x4a, 0x81, 0xe6, 0x61, 0xb8, 0xa1, + 0x3a, 0x6e, 0x95, 0xae, 0x60, 0xa4, 0xfb, 0x34, 0x65, 0x71, 0xa2, 0xdd, 0x20, 0xdc, 0xb0, 0x5c, + 0xf4, 0x21, 0x42, 0xc5, 0x40, 0x35, 0x74, 0x0a, 0xf2, 0x94, 0x89, 0x66, 0x36, 0x9b, 0xba, 0xcb, + 0x72, 0xab, 0x01, 0x6a, 0xf7, 0x11, 0x02, 0x9f, 0xa7, 0x60, 0x9a, 0x61, 0xdd, 0x01, 0x59, 0x7a, + 0x95, 0x84, 0xa2, 0xb0, 0x63, 0x93, 0x19, 0x02, 0xa0, 0x0f, 0xef, 0x87, 0x51, 0x3f, 0x3e, 0x32, + 0x94, 0x0c, 0xe3, 0xe2, 0x83, 0x29, 0xe2, 0x23, 0x30, 0x61, 0xe0, 0x6b, 0xf4, 0x20, 0x67, 0x08, + 0x3b, 0x4b, 0xb1, 0x11, 0x79, 0x76, 0x39, 0x4c, 0x71, 0x2f, 0x8c, 0x68, 0xc2, 0xf8, 0x0c, 0x17, + 0x28, 0xee, 0xb0, 0x07, 0xa5, 0x68, 0x27, 0x20, 0xa3, 0x5a, 0x16, 0x43, 0x18, 0xe2, 0xf1, 0xd1, + 0xb2, 0xe8, 0xa3, 0xd3, 0x30, 0x46, 0x75, 0xb4, 0xb1, 0xd3, 0x6a, 0xb8, 0x9c, 0x49, 0x8e, 0xe2, + 0x8c, 0x92, 0x07, 0x0a, 0x83, 0x53, 0xdc, 0xbb, 0x61, 0x18, 0x5f, 0xd1, 0x6b, 0xd8, 0xd0, 0x30, + 0xc3, 0x1b, 0xa6, 0x78, 0x39, 0x01, 0xa4, 0x48, 0x0f, 0x80, 0x17, 0xf7, 0xaa, 0x22, 0x26, 0x8f, + 0x30, 0x7e, 0x02, 0x3e, 0xc7, 0xc0, 0x72, 0x01, 0x52, 0x0b, 0xaa, 0xab, 0x92, 0x04, 0xc3, 0xbd, + 0xc6, 0x16, 0x9a, 0x9c, 0x42, 0x7e, 0xca, 0x6f, 0x24, 0x20, 0x75, 0xd9, 0x74, 0x31, 0x7a, 0x2c, + 0x90, 0x00, 0x8e, 0x74, 0xf2, 0xe7, 0x0d, 0xbd, 0x6e, 0xe0, 0xda, 0x8a, 0x53, 0x0f, 0xdc, 0xe7, + 0xf6, 0xdd, 0x29, 0x11, 0x72, 0xa7, 0x09, 0x48, 0xdb, 0x66, 0xcb, 0xa8, 0x89, 0x13, 0x87, 0xb4, + 0x81, 0x2a, 0x90, 0xf1, 0xbc, 0x24, 0x15, 0xe7, 0x25, 0xa3, 0xc4, 0x4b, 0x88, 0x0f, 0x73, 0x80, + 0x32, 0xb8, 0xcd, 0x9d, 0xa5, 0x0c, 0x59, 0x2f, 0x78, 0x71, 0x6f, 0xeb, 0xcf, 0x61, 0x7d, 0x32, + 0xb2, 0x98, 0x78, 0x63, 0xef, 0x19, 0x8f, 0x79, 0x5c, 0xde, 0x7b, 0xc0, 0xad, 0x17, 0x72, 0x2b, + 0x7e, 0xb7, 0x7c, 0x90, 0xea, 0xe5, 0xbb, 0x15, 0xbb, 0x5f, 0x7e, 0x12, 0xb2, 0x8e, 0x5e, 0x37, + 0x54, 0xb7, 0x65, 0x63, 0xee, 0x79, 0x3e, 0x40, 0xfe, 0xb2, 0x04, 0x03, 0xcc, 0x93, 0x03, 0x76, + 0x93, 0x3a, 0xdb, 0x2d, 0xd1, 0xcd, 0x6e, 0xc9, 0xc3, 0xdb, 0x6d, 0x0e, 0xc0, 0x13, 0xc6, 0xe1, + 0x77, 0x83, 0x3b, 0x64, 0x0c, 0x4c, 0xc4, 0x0d, 0xbd, 0xce, 0x27, 0x6a, 0x80, 0x48, 0xfe, 0x8f, + 0x12, 0x49, 0x62, 0xf9, 0x73, 0x34, 0x07, 0xc3, 0x42, 0xae, 0xea, 0x4e, 0x43, 0xad, 0x73, 0xdf, + 0xb9, 0xb3, 0xab, 0x70, 0x17, 0x1a, 0x6a, 0x5d, 0x19, 0xe2, 0xf2, 0x90, 0x46, 0xe7, 0x71, 0x48, + 0x74, 0x19, 0x87, 0xd0, 0xc0, 0x27, 0x0f, 0x37, 0xf0, 0xa1, 0x21, 0x4a, 0x45, 0x87, 0xe8, 0x0b, + 0x09, 0xba, 0x99, 0xb1, 0x4c, 0x47, 0x6d, 0xfc, 0x30, 0x66, 0xc4, 0x1d, 0x90, 0xb5, 0xcc, 0x46, + 0x95, 0x3d, 0x61, 0x27, 0x71, 0x33, 0x96, 0xd9, 0x50, 0xda, 0x86, 0x3d, 0x7d, 0x8b, 0xa6, 0xcb, + 0xc0, 0x2d, 0xb0, 0xda, 0x60, 0xd4, 0x6a, 0x36, 0xe4, 0x98, 0x29, 0xf8, 0x5a, 0xf6, 0x08, 0xb1, + 0x01, 0x5d, 0x1c, 0xa5, 0xf6, 0xb5, 0x97, 0x89, 0xcd, 0x30, 0x15, 0x8e, 0x47, 0x28, 0x58, 0xe8, + 0xef, 0xb4, 0x0b, 0x0e, 0xba, 0xa5, 0xc2, 0xf1, 0xe4, 0x9f, 0x97, 0x00, 0x96, 0x89, 0x65, 0xa9, + 0xbe, 0x64, 0x15, 0x72, 0xa8, 0x08, 0xd5, 0x50, 0xcf, 0x93, 0xdd, 0x06, 0x8d, 0xf7, 0x9f, 0x73, + 0x82, 0x72, 0xcf, 0xc3, 0xb0, 0xef, 0x8c, 0x0e, 0x16, 0xc2, 0x4c, 0xf6, 0xc8, 0xaa, 0x37, 0xb0, + 0xab, 0xe4, 0xae, 0x04, 0x5a, 0xf2, 0x3f, 0x97, 0x20, 0x4b, 0x65, 0x5a, 0xc1, 0xae, 0x1a, 0x1a, + 0x43, 0xe9, 0xf0, 0x63, 0x78, 0x27, 0x00, 0x63, 0xe3, 0xe8, 0x2f, 0x63, 0xee, 0x59, 0x59, 0x0a, + 0xd9, 0xd0, 0x5f, 0xc6, 0xe8, 0x9c, 0x67, 0xf0, 0x64, 0x6f, 0x83, 0x8b, 0xac, 0x9b, 0x9b, 0xfd, + 0x38, 0x0c, 0xd2, 0x4f, 0xe4, 0x5c, 0x73, 0x78, 0x22, 0x3d, 0x60, 0xb4, 0x9a, 0x9b, 0xd7, 0x1c, + 0xf9, 0x45, 0x18, 0xdc, 0xbc, 0xc6, 0x6a, 0x23, 0x77, 0x40, 0xd6, 0x36, 0x4d, 0xbe, 0x26, 0xb3, + 0x5c, 0x28, 0x43, 0x00, 0x74, 0x09, 0x12, 0xf5, 0x80, 0x84, 0x5f, 0x0f, 0xf0, 0x0b, 0x1a, 0xc9, + 0xbe, 0x0a, 0x1a, 0xa7, 0xff, 0x9d, 0x04, 0x43, 0x81, 0xf8, 0x80, 0x1e, 0x85, 0xa3, 0xe5, 0xe5, + 0xb5, 0xf9, 0x4b, 0xd5, 0xa5, 0x85, 0xea, 0x85, 0xe5, 0xb9, 0x45, 0xff, 0xae, 0x49, 0xf1, 0xd8, + 0xab, 0xd7, 0xa7, 0x51, 0x00, 0x77, 0xcb, 0xd8, 0x33, 0xcc, 0xab, 0x06, 0x9a, 0x85, 0x89, 0x30, + 0xc9, 0x5c, 0x79, 0xa3, 0xb2, 0xba, 0x99, 0x97, 0x8a, 0x47, 0x5f, 0xbd, 0x3e, 0x3d, 0x16, 0xa0, + 0x98, 0xdb, 0x76, 0xb0, 0xe1, 0xb6, 0x13, 0xcc, 0xaf, 0xad, 0xac, 0x2c, 0x6d, 0xe6, 0x13, 0x6d, + 0x04, 0x3c, 0x60, 0x3f, 0x00, 0x63, 0x61, 0x82, 0xd5, 0xa5, 0xe5, 0x7c, 0xb2, 0x88, 0x5e, 0xbd, + 0x3e, 0x3d, 0x12, 0xc0, 0x5e, 0xd5, 0x1b, 0xc5, 0xcc, 0xfb, 0x3f, 0x33, 0x79, 0xe4, 0x97, 0x7e, + 0x71, 0x52, 0x22, 0x9a, 0x0d, 0x87, 0x62, 0x04, 0x7a, 0x08, 0x8e, 0x6f, 0x2c, 0x2d, 0xae, 0x56, + 0x16, 0xaa, 0x2b, 0x1b, 0x8b, 0x55, 0xf6, 0x91, 0x0d, 0x4f, 0xbb, 0xd1, 0x57, 0xaf, 0x4f, 0x0f, + 0x71, 0x95, 0xba, 0x61, 0xaf, 0x2b, 0x95, 0xcb, 0x6b, 0x9b, 0x95, 0xbc, 0xc4, 0xb0, 0xd7, 0x6d, + 0x7c, 0xc5, 0x74, 0xd9, 0x37, 0xb4, 0x1e, 0x81, 0x13, 0x1d, 0xb0, 0x3d, 0xc5, 0xc6, 0x5e, 0xbd, + 0x3e, 0x3d, 0xbc, 0x6e, 0x63, 0x36, 0x7f, 0x28, 0xc5, 0x0c, 0x14, 0xda, 0x29, 0xd6, 0xd6, 0xd7, + 0x36, 0xe6, 0x96, 0xf3, 0xd3, 0xc5, 0xfc, 0xab, 0xd7, 0xa7, 0x73, 0x22, 0x18, 0x12, 0x7c, 0x5f, + 0xb3, 0xdb, 0xb9, 0xe3, 0xf9, 0xd3, 0x87, 0xe1, 0x1e, 0x5e, 0x12, 0x75, 0x5c, 0x75, 0x4f, 0x37, + 0xea, 0x5e, 0xe1, 0x99, 0xb7, 0xf9, 0xce, 0xe7, 0x18, 0xaf, 0x3d, 0x0b, 0x68, 0xcf, 0xf2, 0x73, + 0xb1, 0xfb, 0x9b, 0xa5, 0x62, 0x4c, 0x75, 0x35, 0x7e, 0xeb, 0xd4, 0xfd, 0x55, 0x45, 0x31, 0xa6, + 0x80, 0x5e, 0xec, 0xb9, 0xb9, 0x93, 0x3f, 0x20, 0xc1, 0xc8, 0x45, 0xdd, 0x71, 0x4d, 0x5b, 0xd7, + 0xd4, 0x06, 0xbd, 0x61, 0x72, 0xae, 0xdf, 0xd8, 0x1a, 0x99, 0xea, 0xcf, 0xc0, 0xc0, 0x15, 0xb5, + 0xc1, 0x82, 0x5a, 0x92, 0x7e, 0x11, 0xa3, 0xb3, 0xf9, 0xfc, 0xd0, 0x26, 0x18, 0x30, 0x32, 0xf9, + 0x57, 0x12, 0x30, 0x4a, 0x27, 0x83, 0xc3, 0x3e, 0x81, 0x44, 0xf6, 0x58, 0x65, 0x48, 0xd9, 0xaa, + 0xcb, 0x8b, 0x86, 0xe5, 0x19, 0x5e, 0x08, 0xbf, 0x2f, 0xbe, 0xb8, 0x3d, 0xb3, 0x80, 0x35, 0x85, + 0xd2, 0xa2, 0xb7, 0x43, 0xa6, 0xa9, 0x5e, 0xab, 0x52, 0x3e, 0x6c, 0xe7, 0x32, 0x77, 0x30, 0x3e, + 0x37, 0x6f, 0x4c, 0x8d, 0xee, 0xab, 0xcd, 0x46, 0x49, 0x16, 0x7c, 0x64, 0x65, 0xb0, 0xa9, 0x5e, + 0x23, 0x22, 0x22, 0x0b, 0x46, 0x09, 0x54, 0xdb, 0x55, 0x8d, 0x3a, 0x66, 0x9d, 0xd0, 0x12, 0x68, + 0xf9, 0xe2, 0x81, 0x3b, 0x39, 0xe6, 0x77, 0x12, 0x60, 0x27, 0x2b, 0xc3, 0x4d, 0xf5, 0xda, 0x3c, + 0x05, 0x90, 0x1e, 0x4b, 0x99, 0x8f, 0x7e, 0x6a, 0xea, 0x08, 0x7d, 0xb9, 0xf0, 0x0d, 0x09, 0xc0, + 0xb7, 0x18, 0x7a, 0x3b, 0xe4, 0x35, 0xaf, 0x45, 0x69, 0x1d, 0x3e, 0x86, 0xf7, 0x77, 0x1b, 0x8b, + 0x88, 0xbd, 0xd9, 0xda, 0xfc, 0xf5, 0x1b, 0x53, 0x92, 0x32, 0xaa, 0x45, 0x86, 0xe2, 0x6d, 0x30, + 0xd4, 0xb2, 0x6a, 0xaa, 0x8b, 0xab, 0x74, 0x1f, 0x97, 0x88, 0x5d, 0xe7, 0x27, 0x09, 0xaf, 0x9b, + 0x37, 0xa6, 0x10, 0x53, 0x2b, 0x40, 0x2c, 0xd3, 0xd5, 0x1f, 0x18, 0x84, 0x10, 0x04, 0x74, 0xfa, + 0xaa, 0x04, 0x43, 0x0b, 0x81, 0x93, 0x5e, 0x05, 0x18, 0x6c, 0x9a, 0x86, 0xbe, 0xc7, 0xfd, 0x31, + 0xab, 0x88, 0x26, 0x2a, 0x42, 0x86, 0x5d, 0xba, 0x73, 0xf7, 0x45, 0x29, 0x54, 0xb4, 0x09, 0xd5, + 0x55, 0xbc, 0xed, 0xe8, 0x62, 0x34, 0x14, 0xd1, 0x44, 0x17, 0x20, 0xef, 0x60, 0xad, 0x65, 0xeb, + 0xee, 0x7e, 0x55, 0x33, 0x0d, 0x57, 0xd5, 0x5c, 0x76, 0x7d, 0xab, 0x7c, 0xc7, 0xcd, 0x1b, 0x53, + 0xc7, 0x99, 0xac, 0x51, 0x0c, 0x59, 0x19, 0x15, 0xa0, 0x79, 0x06, 0x21, 0x3d, 0xd4, 0xb0, 0xab, + 0xea, 0x0d, 0xa7, 0xc0, 0xde, 0x93, 0x89, 0x66, 0x40, 0x97, 0xcf, 0x0f, 0x06, 0x0b, 0x5b, 0x17, + 0x20, 0x6f, 0x5a, 0xd8, 0x0e, 0x25, 0xa2, 0x52, 0xb4, 0xe7, 0x28, 0x86, 0xac, 0x8c, 0x0a, 0x90, + 0x48, 0x52, 0x5d, 0x32, 0xcc, 0x62, 0xa3, 0x68, 0xb5, 0xb6, 0xfd, 0x7a, 0xd8, 0x44, 0xdb, 0x68, + 0xcc, 0x19, 0xfb, 0xe5, 0xc7, 0x7c, 0xee, 0x51, 0x3a, 0xf9, 0x6b, 0x5f, 0x7c, 0x78, 0x82, 0xbb, + 0x86, 0x5f, 0x9f, 0xba, 0x84, 0xf7, 0xc9, 0xf0, 0x73, 0xd4, 0x75, 0x8a, 0x49, 0xd2, 0xce, 0x17, + 0x55, 0xbd, 0x21, 0xae, 0x21, 0x2b, 0xbc, 0x85, 0x4a, 0x30, 0xe0, 0xb8, 0xaa, 0xdb, 0x72, 0xf8, + 0x47, 0xbf, 0xe4, 0x6e, 0xae, 0x56, 0x36, 0x8d, 0xda, 0x06, 0xc5, 0x54, 0x38, 0x05, 0xba, 0x00, + 0x03, 0xae, 0xb9, 0x87, 0x0d, 0x6e, 0xc2, 0x03, 0xcd, 0x6f, 0xfa, 0xda, 0x8e, 0x51, 0x13, 0x8b, + 0xd4, 0x70, 0x03, 0xd7, 0x59, 0x5a, 0xb5, 0xab, 0x92, 0xdd, 0x07, 0xfd, 0xf6, 0x57, 0x79, 0xe9, + 0xc0, 0x93, 0x90, 0x5b, 0x2a, 0xca, 0x4f, 0x56, 0x46, 0x3d, 0xd0, 0x06, 0x85, 0xa0, 0x4b, 0xa1, + 0x23, 0x89, 0xfc, 0x03, 0x79, 0x77, 0x77, 0x53, 0x3f, 0xe0, 0xd3, 0xa2, 0x3e, 0x11, 0x3c, 0xd0, + 0x78, 0x01, 0xf2, 0x2d, 0x63, 0xdb, 0x34, 0xe8, 0x5d, 0x41, 0x9e, 0xdf, 0x93, 0xfd, 0x5d, 0x32, + 0xe8, 0x1c, 0x51, 0x0c, 0x59, 0x19, 0xf5, 0x40, 0x17, 0xd9, 0x2e, 0xa0, 0x06, 0x23, 0x3e, 0x16, + 0x9d, 0xa8, 0xd9, 0xd8, 0x89, 0x7a, 0x17, 0x9f, 0xa8, 0x47, 0xa3, 0xbd, 0xf8, 0x73, 0x75, 0xd8, + 0x03, 0x12, 0x32, 0x74, 0x11, 0xc0, 0x0f, 0x0f, 0xb4, 0x4e, 0x31, 0xd4, 0x7d, 0xe0, 0xfd, 0x18, + 0x23, 0xf6, 0x7b, 0x3e, 0x2d, 0x7a, 0x27, 0x8c, 0x37, 0x75, 0xa3, 0xea, 0xe0, 0xc6, 0x4e, 0x95, + 0x1b, 0x98, 0xb0, 0xa4, 0xdf, 0x7a, 0x29, 0x2f, 0x1f, 0xcc, 0x1f, 0x6e, 0xde, 0x98, 0x2a, 0xf2, + 0x10, 0xda, 0xce, 0x52, 0x56, 0xc6, 0x9a, 0xba, 0xb1, 0x81, 0x1b, 0x3b, 0x0b, 0x1e, 0xac, 0x94, + 0x7b, 0xff, 0xa7, 0xa6, 0x8e, 0xf0, 0xe9, 0x7a, 0x44, 0x3e, 0x47, 0x6b, 0xe7, 0x7c, 0x9a, 0x61, + 0x87, 0xec, 0x49, 0x54, 0xd1, 0xa0, 0x15, 0x8d, 0xac, 0xe2, 0x03, 0xd8, 0x34, 0x7f, 0xe5, 0x3f, + 0x4c, 0x4b, 0xf2, 0xe7, 0x25, 0x18, 0x58, 0xb8, 0xbc, 0xae, 0xea, 0x36, 0x5a, 0x82, 0x31, 0xdf, + 0x73, 0xc2, 0x93, 0xfc, 0xe4, 0xcd, 0x1b, 0x53, 0x85, 0xa8, 0x73, 0x79, 0xb3, 0xdc, 0x77, 0x60, + 0x31, 0xcd, 0x97, 0xba, 0x6d, 0x5c, 0x43, 0xac, 0xda, 0x50, 0xe4, 0xf6, 0x6d, 0x6d, 0x44, 0xcd, + 0x0a, 0x0c, 0x32, 0x69, 0x1d, 0x54, 0x82, 0xb4, 0x45, 0x7e, 0xf0, 0x17, 0x03, 0x93, 0x5d, 0x9d, + 0x97, 0xe2, 0x7b, 0x85, 0x4c, 0x42, 0x22, 0x7f, 0x38, 0x01, 0xb0, 0x70, 0xf9, 0xf2, 0xa6, 0xad, + 0x5b, 0x0d, 0xec, 0xde, 0x4a, 0xcd, 0x37, 0xe1, 0x68, 0x60, 0x97, 0x64, 0x6b, 0x11, 0xed, 0xa7, + 0x6f, 0xde, 0x98, 0x3a, 0x19, 0xd5, 0x3e, 0x80, 0x26, 0x2b, 0xe3, 0xfe, 0x7e, 0xc9, 0xd6, 0x3a, + 0x72, 0xad, 0x39, 0xae, 0xc7, 0x35, 0xd9, 0x9d, 0x6b, 0x00, 0x2d, 0xc8, 0x75, 0xc1, 0x71, 0x3b, + 0x9b, 0x76, 0x03, 0x86, 0x7c, 0x93, 0x38, 0x68, 0x01, 0x32, 0x2e, 0xff, 0xcd, 0x2d, 0x2c, 0x77, + 0xb7, 0xb0, 0x20, 0xe3, 0x56, 0xf6, 0x28, 0xe5, 0x3f, 0x97, 0x00, 0x7c, 0x9f, 0xfd, 0xf1, 0x74, + 0x31, 0x12, 0xca, 0x79, 0xe0, 0x4d, 0x1e, 0x2a, 0x55, 0xe3, 0xd4, 0x11, 0x7b, 0xfe, 0x74, 0x02, + 0xc6, 0xb7, 0x44, 0xe4, 0xf9, 0xb1, 0xb7, 0xc1, 0x3a, 0x0c, 0x62, 0xc3, 0xb5, 0x75, 0x6a, 0x04, + 0x32, 0xda, 0x8f, 0x74, 0x1b, 0xed, 0x0e, 0x3a, 0xd1, 0x8f, 0xdd, 0x88, 0xa2, 0x3b, 0x67, 0x13, + 0xb1, 0xc6, 0x07, 0x93, 0x50, 0xe8, 0x46, 0x89, 0xe6, 0x61, 0x54, 0xb3, 0x31, 0x05, 0x54, 0x83, + 0x95, 0xbf, 0x72, 0xd1, 0xcf, 0x2c, 0x23, 0x08, 0xb2, 0x32, 0x22, 0x20, 0x7c, 0xf5, 0xa8, 0x03, + 0x49, 0xfb, 0x88, 0xdb, 0x11, 0xac, 0x3e, 0xf3, 0x3c, 0x99, 0x2f, 0x1f, 0xa2, 0x93, 0x30, 0x03, + 0xb6, 0x7e, 0x8c, 0xf8, 0x50, 0xba, 0x80, 0xbc, 0x04, 0xa3, 0xba, 0xa1, 0xbb, 0xba, 0xda, 0xa8, + 0x6e, 0xab, 0x0d, 0xd5, 0xd0, 0x0e, 0x93, 0x35, 0xb3, 0x90, 0xcf, 0xbb, 0x8d, 0xb0, 0x93, 0x95, + 0x11, 0x0e, 0x29, 0x33, 0x00, 0xba, 0x08, 0x83, 0xa2, 0xab, 0xd4, 0xa1, 0xb2, 0x0d, 0x41, 0x1e, + 0x48, 0xf0, 0x7e, 0x26, 0x09, 0x63, 0x0a, 0xae, 0xfd, 0xff, 0xa1, 0x38, 0xd8, 0x50, 0xac, 0x00, + 0xb0, 0xe9, 0x4e, 0x02, 0xec, 0x21, 0x46, 0x83, 0x04, 0x8c, 0x2c, 0xe3, 0xb0, 0xe0, 0xb8, 0x81, + 0xf1, 0xb8, 0x91, 0x80, 0x5c, 0x70, 0x3c, 0xfe, 0x92, 0xae, 0x4a, 0x68, 0xc9, 0x8f, 0x44, 0x29, + 0xfe, 0x8d, 0xd0, 0x2e, 0x91, 0xa8, 0xcd, 0x7b, 0x7b, 0x87, 0xa0, 0xff, 0x91, 0x80, 0x81, 0x75, + 0xd5, 0x56, 0x9b, 0x0e, 0xd2, 0xda, 0x32, 0x4d, 0x51, 0x7e, 0x6c, 0xfb, 0xc0, 0x33, 0xaf, 0x76, + 0xc4, 0x24, 0x9a, 0x1f, 0xed, 0x90, 0x68, 0xfe, 0x04, 0x8c, 0x90, 0xed, 0x70, 0xe0, 0x08, 0x03, + 0xb1, 0xf6, 0x70, 0xf9, 0x84, 0xcf, 0x25, 0xfc, 0x9c, 0xed, 0x96, 0x2f, 0x07, 0xcf, 0x30, 0x0c, + 0x11, 0x0c, 0x3f, 0x30, 0x13, 0xf2, 0x63, 0xfe, 0xb6, 0x34, 0xf0, 0x50, 0x56, 0xa0, 0xa9, 0x5e, + 0xab, 0xb0, 0x06, 0x5a, 0x06, 0xb4, 0xeb, 0x55, 0x46, 0xaa, 0xbe, 0x39, 0x09, 0xfd, 0x9d, 0x37, + 0x6f, 0x4c, 0x9d, 0x60, 0xf4, 0xed, 0x38, 0xb2, 0x32, 0xe6, 0x03, 0x05, 0xb7, 0xc7, 0x01, 0x88, + 0x5e, 0x55, 0x76, 0x9a, 0x90, 0x6d, 0x77, 0x8e, 0xde, 0xbc, 0x31, 0x35, 0xc6, 0xb8, 0xf8, 0xcf, + 0x64, 0x25, 0x4b, 0x1a, 0x0b, 0xe4, 0x77, 0xc0, 0xb3, 0x3f, 0x23, 0x01, 0xf2, 0x43, 0xbe, 0x82, + 0x1d, 0x8b, 0xec, 0xcf, 0x48, 0x22, 0x1e, 0xc8, 0x9a, 0xa5, 0xde, 0x89, 0xb8, 0x4f, 0x2f, 0x12, + 0xf1, 0xc0, 0x4c, 0x79, 0xca, 0x0f, 0x8f, 0x09, 0x3e, 0x8e, 0x1d, 0x8e, 0x5e, 0xce, 0xcc, 0x9b, + 0xba, 0xa0, 0x6e, 0x8b, 0x87, 0x47, 0xe4, 0x7f, 0x25, 0xc1, 0x89, 0x36, 0x8f, 0xf2, 0x84, 0xfd, + 0x2b, 0x80, 0xec, 0xc0, 0x43, 0xfe, 0xbd, 0x37, 0x26, 0xf4, 0x81, 0x1d, 0x74, 0xcc, 0x6e, 0x8b, + 0xbb, 0xb7, 0x2e, 0xc2, 0xb3, 0xb3, 0x9b, 0xff, 0x4c, 0x82, 0x89, 0x60, 0xf7, 0x9e, 0x22, 0xab, + 0x90, 0x0b, 0xf6, 0xce, 0x55, 0xb8, 0xa7, 0x1f, 0x15, 0xb8, 0xf4, 0x21, 0x7a, 0xf4, 0x9c, 0x3f, + 0x5d, 0x59, 0xed, 0xec, 0xd1, 0xbe, 0xad, 0x21, 0x64, 0x8a, 0x4e, 0xdb, 0x14, 0x1d, 0x8f, 0xff, + 0x23, 0x41, 0x6a, 0xdd, 0x34, 0x1b, 0xc8, 0x84, 0x31, 0xc3, 0x74, 0xab, 0xc4, 0xb3, 0x70, 0xad, + 0xca, 0x37, 0xdd, 0x2c, 0x0e, 0xce, 0x1f, 0xcc, 0x48, 0xdf, 0xbe, 0x31, 0xd5, 0xce, 0x4a, 0x19, + 0x35, 0x4c, 0xb7, 0x4c, 0x21, 0x9b, 0x6c, 0x4b, 0xfe, 0x4e, 0x18, 0x0e, 0x77, 0xc6, 0xa2, 0xe4, + 0xf3, 0x07, 0xee, 0x2c, 0xcc, 0xe6, 0xe6, 0x8d, 0xa9, 0x09, 0x7f, 0xc6, 0x78, 0x60, 0x59, 0xc9, + 0x6d, 0x07, 0x7a, 0x67, 0xc7, 0xbb, 0xbe, 0xfb, 0xa9, 0x29, 0xe9, 0xf4, 0x97, 0x24, 0x00, 0xbf, + 0xf2, 0x80, 0x1e, 0x82, 0xe3, 0xe5, 0xb5, 0xd5, 0x85, 0xea, 0xc6, 0xe6, 0xdc, 0xe6, 0xd6, 0x46, + 0x75, 0x6b, 0x75, 0x63, 0xbd, 0x32, 0xbf, 0x74, 0x61, 0xa9, 0xb2, 0xe0, 0x97, 0xc7, 0x1d, 0x0b, + 0x6b, 0xfa, 0x8e, 0x8e, 0x6b, 0xe8, 0x3e, 0x98, 0x08, 0x63, 0x93, 0x56, 0x65, 0x21, 0x2f, 0x15, + 0x73, 0xaf, 0x5e, 0x9f, 0xce, 0xb0, 0x5c, 0x0c, 0xd7, 0xd0, 0x29, 0x38, 0xda, 0x8e, 0xb7, 0xb4, + 0xba, 0x98, 0x4f, 0x14, 0x87, 0x5f, 0xbd, 0x3e, 0x9d, 0xf5, 0x92, 0x36, 0x24, 0x03, 0x0a, 0x62, + 0x72, 0x7e, 0xc9, 0x22, 0xbc, 0x7a, 0x7d, 0x7a, 0x80, 0x19, 0xb0, 0x98, 0x7a, 0xff, 0x67, 0x26, + 0x8f, 0x94, 0x2f, 0x74, 0x2d, 0x80, 0x3f, 0xd4, 0xd3, 0x76, 0xd7, 0xbc, 0xa2, 0x76, 0xb8, 0xea, + 0xfd, 0xea, 0x71, 0x98, 0xea, 0x52, 0xf5, 0x76, 0xaf, 0xc5, 0x14, 0xbc, 0x7b, 0x94, 0xb6, 0x63, + 0x4b, 0xd7, 0x5d, 0x8a, 0xe5, 0x87, 0x2f, 0x68, 0xf7, 0x55, 0xbb, 0x97, 0xff, 0x75, 0x0a, 0xd0, + 0x8a, 0x53, 0x9f, 0x27, 0x49, 0x55, 0xe0, 0x88, 0x56, 0xa4, 0x66, 0x23, 0xfd, 0x40, 0x35, 0x9b, + 0x95, 0x50, 0x15, 0x24, 0x71, 0xb0, 0x4a, 0x6b, 0xdf, 0xa5, 0x90, 0xe4, 0x0f, 0xa5, 0x14, 0xd2, + 0x39, 0x53, 0x4a, 0xdd, 0xba, 0x2d, 0x55, 0xfa, 0xb0, 0xdb, 0x4a, 0x5e, 0xe1, 0x1c, 0xe8, 0x51, + 0xe1, 0x2c, 0x74, 0x2d, 0x63, 0x72, 0x6a, 0x74, 0x56, 0x5c, 0xc9, 0x19, 0xec, 0x6f, 0x6d, 0xe3, + 0x77, 0x76, 0x32, 0xef, 0x17, 0x2b, 0xdb, 0x49, 0x28, 0xb6, 0xbb, 0x93, 0x08, 0xbe, 0xf2, 0x47, + 0x92, 0x90, 0x5f, 0x71, 0xea, 0x95, 0x9a, 0xee, 0xde, 0x26, 0x5f, 0x7b, 0xa6, 0xfb, 0x36, 0x15, + 0xdd, 0xbc, 0x31, 0x35, 0xc2, 0x6c, 0xda, 0xc3, 0x92, 0x4d, 0x18, 0x8d, 0xbc, 0x1c, 0xe0, 0x9e, + 0xb5, 0x70, 0x98, 0x77, 0x14, 0x11, 0x56, 0x32, 0xdd, 0x55, 0x04, 0xfc, 0x1b, 0x5d, 0xeb, 0xec, + 0xcc, 0xcc, 0xa1, 0x2e, 0xde, 0xce, 0x9a, 0x9e, 0x3f, 0x66, 0x45, 0x28, 0x44, 0x07, 0xc5, 0x1b, + 0xb1, 0x3f, 0x92, 0x60, 0x68, 0xc5, 0x11, 0xbb, 0x68, 0xfc, 0x63, 0x5a, 0x51, 0x78, 0xc2, 0xbb, + 0x68, 0x92, 0xec, 0xcf, 0x6f, 0xc5, 0xe5, 0x13, 0xdf, 0x08, 0x47, 0x61, 0x3c, 0xa0, 0xa7, 0xa7, + 0xff, 0xef, 0x24, 0x68, 0x7c, 0x2c, 0xe3, 0xba, 0x6e, 0x78, 0x49, 0x05, 0xfe, 0xcb, 0xba, 0x5f, + 0xf2, 0xed, 0x9c, 0x3a, 0xac, 0x9d, 0xf7, 0x68, 0x80, 0x88, 0xd8, 0xd3, 0xcb, 0x18, 0x57, 0xda, + 0x77, 0xf3, 0xd2, 0x01, 0x0e, 0xca, 0x44, 0xf6, 0xec, 0xf2, 0x1b, 0x12, 0x0c, 0xaf, 0x38, 0xf5, + 0x2d, 0xa3, 0xf6, 0xff, 0xbc, 0xff, 0xee, 0xc0, 0xd1, 0x90, 0xa6, 0xb7, 0xc9, 0xa4, 0x67, 0x5e, + 0x4b, 0x41, 0x72, 0xc5, 0xa9, 0xa3, 0x97, 0x60, 0x34, 0x9a, 0x34, 0x9c, 0xee, 0x16, 0xb3, 0xdb, + 0x57, 0x84, 0xe2, 0x99, 0xfe, 0x71, 0x3d, 0x4d, 0xf6, 0x60, 0x38, 0xbc, 0x72, 0x9c, 0xea, 0xc1, + 0x24, 0x84, 0x59, 0x7c, 0xa4, 0x5f, 0x4c, 0xaf, 0xb3, 0xb7, 0x43, 0xc6, 0x0b, 0x7a, 0x77, 0xf7, + 0xa0, 0x16, 0x48, 0xc5, 0x07, 0xfb, 0x40, 0xf2, 0xb8, 0xbf, 0x04, 0xa3, 0xd1, 0x90, 0xd2, 0xcb, + 0x7a, 0x11, 0xdc, 0x9e, 0xd6, 0xeb, 0x36, 0xb5, 0xb6, 0x01, 0x02, 0xf3, 0xe0, 0xde, 0x1e, 0x1c, + 0x7c, 0xb4, 0xe2, 0xc3, 0x7d, 0xa1, 0x79, 0x9b, 0xab, 0x5b, 0x9d, 0x8c, 0xff, 0x8b, 0x04, 0x9c, + 0x0e, 0xa6, 0xb9, 0x2f, 0xb5, 0xb0, 0xbd, 0xef, 0x65, 0xb2, 0x96, 0x5a, 0xd7, 0x8d, 0xe0, 0xed, + 0xbb, 0x13, 0xc1, 0x59, 0x43, 0x71, 0x85, 0xbc, 0xb2, 0x01, 0x43, 0xeb, 0x6a, 0x1d, 0x2b, 0xf8, + 0xa5, 0x16, 0x76, 0xdc, 0x0e, 0xb7, 0xbf, 0x8e, 0xc1, 0x80, 0xb9, 0xb3, 0x23, 0xce, 0x9a, 0xa5, + 0x14, 0xde, 0x42, 0x13, 0x90, 0x6e, 0xe8, 0x4d, 0x9d, 0xcd, 0xcc, 0x94, 0xc2, 0x1a, 0x68, 0x0a, + 0x86, 0x34, 0x32, 0x01, 0xab, 0xec, 0xdc, 0x7c, 0x4a, 0x7c, 0x99, 0xa9, 0x65, 0xb8, 0x9b, 0x04, + 0x22, 0x3f, 0x03, 0x39, 0xd6, 0x1f, 0xb7, 0xfe, 0x09, 0xc8, 0xd0, 0x73, 0xce, 0x7e, 0xaf, 0x83, + 0xa4, 0x7d, 0x89, 0xdd, 0x14, 0x63, 0x5c, 0x58, 0xc7, 0xac, 0x51, 0x2e, 0x77, 0x35, 0xe5, 0xa9, + 0xf8, 0x8c, 0x80, 0x19, 0xca, 0x33, 0xe3, 0x6f, 0xa5, 0xe1, 0x28, 0xdf, 0x7f, 0xa8, 0x96, 0x3e, + 0xbb, 0xeb, 0xba, 0xe2, 0x36, 0x33, 0xf0, 0x10, 0xa0, 0x5a, 0xba, 0xbc, 0x0f, 0xa9, 0x8b, 0xae, + 0x6b, 0xa1, 0xd3, 0x90, 0xb6, 0x5b, 0x0d, 0x2c, 0x5e, 0xc5, 0x78, 0xa9, 0xa4, 0x6a, 0xe9, 0x33, + 0x04, 0x41, 0x69, 0x35, 0xb0, 0xc2, 0x50, 0x50, 0x05, 0xa6, 0x76, 0x5a, 0x8d, 0xc6, 0x7e, 0xb5, + 0x86, 0xe9, 0x3f, 0xcb, 0xf3, 0xfe, 0x2f, 0x0d, 0xbe, 0x66, 0xa9, 0x86, 0x97, 0xef, 0x67, 0x94, + 0x93, 0x14, 0x6d, 0x81, 0x62, 0x89, 0xff, 0x49, 0x53, 0x11, 0x38, 0xf2, 0xef, 0x27, 0x20, 0x23, + 0x58, 0xd3, 0xab, 0x5b, 0xb8, 0x81, 0x35, 0xd7, 0x14, 0x47, 0x19, 0xbc, 0x36, 0x42, 0x90, 0xac, + 0xf3, 0x21, 0xca, 0x5e, 0x3c, 0xa2, 0x90, 0x06, 0x81, 0x79, 0x17, 0xea, 0x08, 0xcc, 0x6a, 0x91, + 0x51, 0x4b, 0x59, 0xa6, 0xa8, 0x99, 0x5e, 0x3c, 0xa2, 0xd0, 0x16, 0x2a, 0xc0, 0x00, 0x71, 0x59, + 0x97, 0x7d, 0x31, 0x98, 0xc0, 0x79, 0x1b, 0x1d, 0x83, 0xb4, 0xa5, 0xba, 0x1a, 0x3b, 0xeb, 0x4e, + 0x1e, 0xb0, 0x26, 0x09, 0xcc, 0xec, 0x4b, 0x0d, 0xd1, 0xff, 0x44, 0x45, 0x8c, 0xc1, 0x3e, 0x89, + 0x49, 0xe4, 0x5e, 0x57, 0x5d, 0x17, 0xdb, 0x06, 0x61, 0xc8, 0xd0, 0x11, 0x82, 0xd4, 0xb6, 0x59, + 0xdb, 0xe7, 0xff, 0x1d, 0x8b, 0xfe, 0xe6, 0xff, 0xb7, 0x87, 0xfa, 0x43, 0x95, 0x3e, 0x64, 0xff, + 0x14, 0x30, 0x27, 0x80, 0x65, 0x82, 0x54, 0x81, 0x71, 0xb5, 0x56, 0xd3, 0x89, 0x57, 0xab, 0x8d, + 0xea, 0xb6, 0x4e, 0xf7, 0xc3, 0x0e, 0xfd, 0x97, 0x8f, 0xdd, 0xc6, 0x02, 0xf9, 0x04, 0x65, 0x8e, + 0x5f, 0xce, 0xc2, 0xa0, 0xc5, 0x84, 0x92, 0xcf, 0xc3, 0x58, 0x9b, 0xa4, 0x44, 0xbe, 0x3d, 0xdd, + 0xa8, 0x89, 0x5b, 0x86, 0xe4, 0x37, 0x81, 0xd1, 0xcf, 0xda, 0xb2, 0x43, 0x22, 0xf4, 0x77, 0xf9, + 0xdd, 0xdd, 0xef, 0xa0, 0x8e, 0x04, 0xee, 0xa0, 0xaa, 0x96, 0x5e, 0xce, 0x52, 0xfe, 0xfc, 0xea, + 0xe9, 0x1c, 0x7f, 0xc0, 0xae, 0x9d, 0xce, 0x98, 0x76, 0x7d, 0xb6, 0x8e, 0x0d, 0xb1, 0xbf, 0x25, + 0x8f, 0x54, 0x4b, 0x77, 0xa8, 0x3b, 0xfa, 0x9f, 0xd9, 0x75, 0xce, 0x07, 0x7e, 0xd3, 0x1b, 0xa9, + 0xa9, 0xc5, 0xb9, 0xf5, 0x25, 0xcf, 0x8f, 0x7f, 0x33, 0x01, 0x27, 0x03, 0x7e, 0x1c, 0x40, 0x6e, + 0x77, 0xe7, 0x62, 0x67, 0x8f, 0xef, 0xe3, 0x92, 0xfa, 0x25, 0x48, 0x11, 0x7c, 0x14, 0xf3, 0x5f, + 0x75, 0x0a, 0xbf, 0xfa, 0xb5, 0x7f, 0x2a, 0x87, 0x37, 0x5b, 0xa1, 0x51, 0xa1, 0x4c, 0xca, 0xef, + 0xeb, 0xdf, 0x7e, 0x79, 0xff, 0x0b, 0xc3, 0xce, 0xad, 0x33, 0x63, 0xd4, 0x86, 0xdf, 0x3a, 0x0b, + 0x72, 0x97, 0xca, 0x00, 0x8b, 0x98, 0xbd, 0x4b, 0x1c, 0x07, 0x08, 0xc7, 0xdd, 0x2e, 0xe6, 0xf5, + 0x1a, 0xc1, 0x3e, 0xab, 0x16, 0xd7, 0xe0, 0xd8, 0x73, 0xa4, 0x6f, 0xbf, 0x7e, 0x2d, 0x02, 0xfb, + 0x31, 0xef, 0x98, 0x8d, 0xc4, 0xff, 0xe3, 0xa6, 0x38, 0x42, 0x03, 0xbe, 0x7c, 0xbc, 0x06, 0x71, + 0xdf, 0x4c, 0xd7, 0xf5, 0x62, 0x26, 0xb0, 0x58, 0x28, 0x01, 0x4a, 0xf9, 0x97, 0x25, 0x38, 0xde, + 0xd6, 0x35, 0x8f, 0xf1, 0x8b, 0x1d, 0xee, 0x10, 0xf6, 0x7d, 0xba, 0x2f, 0x78, 0x9f, 0x70, 0xb1, + 0x83, 0xb0, 0xf7, 0xc7, 0x0a, 0xcb, 0xa4, 0x08, 0x49, 0xfb, 0x34, 0x1c, 0x0d, 0x0b, 0x2b, 0xcc, + 0x74, 0x2f, 0x8c, 0x84, 0x13, 0x53, 0x6e, 0xae, 0xe1, 0x50, 0x6a, 0x2a, 0x57, 0xa3, 0x76, 0xf6, + 0x74, 0xad, 0x40, 0xd6, 0x43, 0xe5, 0xf9, 0x64, 0xdf, 0xaa, 0xfa, 0x94, 0xf2, 0x87, 0x25, 0x98, + 0x0e, 0xf7, 0xe0, 0xef, 0x50, 0x9d, 0x83, 0x09, 0x7b, 0xcb, 0x86, 0xf8, 0x0d, 0x09, 0xee, 0xea, + 0x21, 0x13, 0x37, 0xc0, 0xcb, 0x30, 0x11, 0x28, 0xd1, 0x8b, 0x10, 0x2e, 0x86, 0xfd, 0x74, 0xfc, + 0xbb, 0x05, 0x2f, 0x69, 0xba, 0x83, 0x18, 0xe5, 0x73, 0x7f, 0x30, 0x35, 0xde, 0xfe, 0xcc, 0x51, + 0xc6, 0xdb, 0xcb, 0xea, 0xb7, 0xd0, 0x3f, 0x5e, 0x93, 0xe0, 0x81, 0xb0, 0xaa, 0x1d, 0xde, 0x9b, + 0xff, 0xa8, 0xc6, 0xe1, 0xdf, 0x4b, 0x70, 0xba, 0x1f, 0xe1, 0xbc, 0xfc, 0x76, 0xdc, 0x7f, 0x51, + 0x16, 0x1d, 0x8f, 0x07, 0x0f, 0x70, 0xc2, 0x80, 0x7b, 0x29, 0xf2, 0xb8, 0xdd, 0x06, 0xc3, 0x5b, + 0x7c, 0x62, 0x05, 0x87, 0xdc, 0x33, 0x72, 0x78, 0xf7, 0x29, 0x8c, 0x1c, 0xda, 0x7f, 0x76, 0x18, + 0x8b, 0x44, 0x87, 0xb1, 0x08, 0xec, 0x0f, 0xaf, 0xf0, 0xb8, 0xd5, 0xe1, 0xe5, 0xd8, 0xdb, 0x60, + 0xbc, 0x83, 0x2b, 0xf3, 0x59, 0x7d, 0x00, 0x4f, 0x56, 0x50, 0xbb, 0xb3, 0xca, 0xfb, 0x30, 0x45, + 0xfb, 0xed, 0x60, 0xe8, 0xdb, 0xad, 0x72, 0x93, 0xc7, 0x96, 0x8e, 0x5d, 0x73, 0xdd, 0x97, 0x60, + 0x80, 0x8d, 0x33, 0x57, 0xf7, 0x10, 0x8e, 0xc2, 0x19, 0xc8, 0x1f, 0x17, 0xb1, 0x6c, 0x41, 0x88, + 0xdd, 0x79, 0x0e, 0xf5, 0xa3, 0xeb, 0x2d, 0x9a, 0x43, 0x01, 0x63, 0x7c, 0x43, 0x44, 0xb5, 0xce, + 0xd2, 0x71, 0x73, 0x68, 0xb7, 0x2c, 0xaa, 0x31, 0xdb, 0xdc, 0xde, 0xf0, 0xf5, 0x8b, 0x22, 0x7c, + 0x79, 0x3a, 0xc5, 0x84, 0xaf, 0x1f, 0x8d, 0xe9, 0xbd, 0x40, 0x16, 0x23, 0xe6, 0x5f, 0xc4, 0x40, + 0xf6, 0x5d, 0x09, 0x4e, 0x50, 0xdd, 0x82, 0x6f, 0x5c, 0x0f, 0x6a, 0xf2, 0x87, 0x00, 0x39, 0xb6, + 0x56, 0xed, 0x38, 0xbb, 0xf3, 0x8e, 0xad, 0x5d, 0x0e, 0xad, 0x2f, 0x0f, 0x01, 0xaa, 0x39, 0x6e, + 0x14, 0x9b, 0x1d, 0x5f, 0xcf, 0xd7, 0x1c, 0xf7, 0x72, 0x8f, 0xd5, 0x28, 0x75, 0x0b, 0x86, 0xf3, + 0xeb, 0x12, 0x14, 0x3b, 0xa9, 0xcc, 0x87, 0x4f, 0x87, 0x63, 0xa1, 0xb7, 0xf7, 0xd1, 0x11, 0x7c, + 0xa8, 0x9f, 0x77, 0xd6, 0x91, 0x69, 0x74, 0xd4, 0xc6, 0xb7, 0x3b, 0x0f, 0x98, 0x0a, 0x7b, 0x68, + 0x7b, 0x66, 0xfd, 0x23, 0x9b, 0x3e, 0x5f, 0x6c, 0x8b, 0xab, 0x7f, 0x21, 0x72, 0xef, 0x6b, 0x30, + 0xd9, 0x45, 0xea, 0xdb, 0xbd, 0xee, 0xed, 0x76, 0x1d, 0xcc, 0x5b, 0x9d, 0xbe, 0x3f, 0xce, 0x67, + 0x42, 0xf8, 0x6a, 0x54, 0x60, 0x2f, 0xd6, 0xe9, 0x6e, 0xb5, 0xfc, 0x16, 0xb8, 0xa3, 0x23, 0x15, + 0x97, 0xad, 0x04, 0xa9, 0x5d, 0xdd, 0x71, 0xb9, 0x58, 0xf7, 0x75, 0x13, 0x2b, 0x42, 0x4d, 0x69, + 0x64, 0x04, 0x79, 0xca, 0x7a, 0xdd, 0x34, 0x1b, 0x5c, 0x0c, 0xf9, 0x12, 0x8c, 0x05, 0x60, 0xbc, + 0x93, 0x73, 0x90, 0xb2, 0x4c, 0xfe, 0xdd, 0xa0, 0xa1, 0x33, 0x27, 0xbb, 0x75, 0x42, 0x68, 0xb8, + 0xda, 0x14, 0x5f, 0x9e, 0x00, 0xc4, 0x98, 0xd1, 0xc3, 0x5d, 0xa2, 0x8b, 0x0d, 0x18, 0x0f, 0x41, + 0x79, 0x27, 0x6f, 0x82, 0x01, 0x8b, 0x42, 0xbc, 0x4b, 0xb0, 0xdd, 0xba, 0xa1, 0x58, 0xde, 0x97, + 0x58, 0x68, 0xeb, 0xcc, 0xb7, 0x8f, 0x42, 0x9a, 0x72, 0x45, 0x1f, 0x93, 0x00, 0x02, 0x47, 0xb5, + 0x66, 0xba, 0xb1, 0xe9, 0xbc, 0x27, 0x2e, 0xce, 0xf6, 0x8d, 0xcf, 0x73, 0xb6, 0xd3, 0xef, 0xfe, + 0x37, 0xdf, 0xfa, 0x48, 0xe2, 0x1e, 0x24, 0xcf, 0x76, 0xd9, 0x8d, 0x07, 0xe6, 0xcb, 0x67, 0x43, + 0x1f, 0xa5, 0x79, 0xb8, 0xbf, 0xae, 0x84, 0x64, 0x33, 0xfd, 0xa2, 0x73, 0xc1, 0xce, 0x53, 0xc1, + 0xce, 0xa2, 0xc7, 0xe2, 0x05, 0x9b, 0x7d, 0x47, 0x78, 0xd2, 0xbc, 0x0b, 0xfd, 0xae, 0x04, 0x13, + 0x9d, 0xb6, 0x74, 0xe8, 0xc9, 0xfe, 0xa4, 0x68, 0x4f, 0x29, 0x8a, 0x4f, 0x1d, 0x82, 0x92, 0xab, + 0xb2, 0x48, 0x55, 0x99, 0x43, 0xcf, 0x1c, 0x42, 0x95, 0xd9, 0xc0, 0xba, 0x83, 0xfe, 0x97, 0x04, + 0x77, 0xf6, 0xdc, 0x21, 0xa1, 0xb9, 0xfe, 0xa4, 0xec, 0x91, 0x3b, 0x15, 0xcb, 0x3f, 0x08, 0x0b, + 0xae, 0xf1, 0x73, 0x54, 0xe3, 0x4b, 0x68, 0xe9, 0x30, 0x1a, 0xfb, 0x19, 0x51, 0x50, 0xf7, 0xdf, + 0x0e, 0x1f, 0xf9, 0xef, 0xed, 0x4e, 0x6d, 0x1b, 0x8f, 0x98, 0x89, 0xd1, 0x9e, 0xd4, 0xca, 0x2f, + 0x50, 0x15, 0x14, 0xb4, 0xfe, 0x03, 0x0e, 0xda, 0xec, 0x3b, 0xc2, 0x81, 0xff, 0x5d, 0xe8, 0x7f, + 0x4a, 0x9d, 0x4f, 0xf0, 0x3f, 0xd1, 0x53, 0xc4, 0xee, 0x9b, 0xaa, 0xe2, 0x93, 0x07, 0x27, 0xe4, + 0x4a, 0x36, 0xa9, 0x92, 0x75, 0x84, 0x6f, 0xb5, 0x92, 0x1d, 0x07, 0x11, 0x7d, 0x55, 0x82, 0x89, + 0x4e, 0x7b, 0x92, 0x98, 0x69, 0xd9, 0x63, 0x93, 0x15, 0x33, 0x2d, 0x7b, 0x6d, 0x80, 0xe4, 0x37, + 0x51, 0xe5, 0xcf, 0xa1, 0xc7, 0xbb, 0x29, 0xdf, 0x73, 0x14, 0xc9, 0x5c, 0xec, 0x99, 0xe4, 0xc7, + 0xcc, 0xc5, 0x7e, 0xf6, 0x31, 0x31, 0x73, 0xb1, 0xaf, 0x3d, 0x46, 0xfc, 0x5c, 0xf4, 0x34, 0xeb, + 0x73, 0x18, 0x1d, 0xf4, 0x9b, 0x12, 0x0c, 0x87, 0x32, 0x62, 0xf4, 0x68, 0x4f, 0x41, 0x3b, 0x6d, + 0x18, 0xba, 0xbf, 0xd8, 0xec, 0x9e, 0x70, 0xcb, 0x4b, 0x54, 0x97, 0x79, 0x34, 0x77, 0x18, 0x5d, + 0xec, 0x90, 0xc4, 0x5f, 0x97, 0x60, 0xbc, 0x43, 0x96, 0x19, 0x33, 0x0b, 0xbb, 0x27, 0xcd, 0xc5, + 0x27, 0x0f, 0x4e, 0xc8, 0xb5, 0xba, 0x40, 0xb5, 0xfa, 0x09, 0xf4, 0xf4, 0x61, 0xb4, 0x0a, 0xac, + 0xcf, 0x37, 0xfc, 0x03, 0xd1, 0x81, 0x7e, 0xd0, 0xb9, 0x03, 0x0a, 0x26, 0x14, 0x7a, 0xe2, 0xc0, + 0x74, 0x5c, 0x9f, 0xe7, 0xa9, 0x3e, 0xcf, 0xa1, 0xb5, 0x1f, 0x4c, 0x9f, 0xf6, 0x65, 0xfd, 0x0b, + 0xed, 0x57, 0xf3, 0x7b, 0x7b, 0x51, 0xc7, 0x64, 0xb5, 0xf8, 0xd8, 0x81, 0x68, 0xb8, 0x52, 0x4f, + 0x52, 0xa5, 0xce, 0xa0, 0x47, 0xba, 0x29, 0x15, 0x38, 0xf5, 0xae, 0x1b, 0x3b, 0xe6, 0xec, 0x3b, + 0x58, 0x0a, 0xfc, 0x2e, 0xf4, 0x53, 0xe2, 0xc4, 0xf1, 0xa9, 0x9e, 0xfd, 0x06, 0xf2, 0xd8, 0xe2, + 0x03, 0x7d, 0x60, 0x72, 0xb9, 0xee, 0xa1, 0x72, 0x4d, 0xa2, 0x93, 0xdd, 0xe4, 0x22, 0xb9, 0x2c, + 0xfa, 0x80, 0xe4, 0x5d, 0x52, 0x38, 0xdd, 0x9b, 0x77, 0x30, 0xd9, 0xed, 0x7e, 0xd0, 0xa1, 0x43, + 0x0a, 0x2c, 0xdf, 0x47, 0x25, 0x99, 0x46, 0x93, 0x5d, 0x25, 0x61, 0xa9, 0xef, 0xad, 0x3e, 0x39, + 0xf0, 0x27, 0x83, 0x5d, 0x3f, 0x5e, 0x51, 0xc7, 0x06, 0x76, 0x74, 0xe7, 0x50, 0x1f, 0xaf, 0xe8, + 0xef, 0xf5, 0xd4, 0xef, 0xa6, 0x21, 0xb7, 0xc8, 0x7a, 0xd9, 0x70, 0x55, 0xf7, 0x07, 0xdc, 0x08, + 0x20, 0x87, 0x7f, 0x93, 0x8d, 0x7d, 0x2a, 0xd2, 0xff, 0xf8, 0x61, 0xee, 0x40, 0xd7, 0xb6, 0xd9, + 0x21, 0x41, 0x7e, 0x43, 0x3a, 0xca, 0x4f, 0x66, 0x9f, 0x77, 0xa3, 0x67, 0x17, 0xd8, 0x47, 0x1e, + 0xdf, 0x2b, 0xc1, 0x51, 0x8a, 0xe5, 0xcf, 0x37, 0x8a, 0x29, 0xee, 0xec, 0x75, 0xf5, 0x98, 0x65, + 0x35, 0x50, 0x82, 0x61, 0x9f, 0x65, 0xbc, 0x87, 0xdf, 0x67, 0x39, 0x19, 0xe8, 0x3c, 0xca, 0x56, + 0x56, 0xc6, 0x1b, 0x6d, 0x94, 0x4e, 0x64, 0x5f, 0x9f, 0x3a, 0xfc, 0xbe, 0xfe, 0x59, 0x18, 0x0a, + 0x44, 0xfa, 0x42, 0x3a, 0xe6, 0x9a, 0x69, 0xb4, 0x88, 0x16, 0x24, 0x46, 0xef, 0x93, 0xe0, 0x68, + 0xc7, 0x45, 0x90, 0xfe, 0xaf, 0xda, 0x03, 0x16, 0xe9, 0x22, 0xc6, 0xe9, 0xc8, 0x57, 0x56, 0x26, + 0x5a, 0x9d, 0xb2, 0x89, 0x75, 0x18, 0x0e, 0x2d, 0x60, 0x05, 0xf1, 0x1f, 0xa7, 0xfb, 0xbf, 0x61, + 0x11, 0x66, 0x80, 0x8a, 0x90, 0xc1, 0xd7, 0x2c, 0xd3, 0x76, 0x71, 0x8d, 0x1e, 0x79, 0xc8, 0x28, + 0x5e, 0x5b, 0x5e, 0x05, 0xd4, 0x3e, 0xb8, 0xd1, 0xef, 0x90, 0x66, 0xfd, 0xef, 0x90, 0x4e, 0x40, + 0x3a, 0xf8, 0xa5, 0x4e, 0xd6, 0xf0, 0xeb, 0x14, 0xb7, 0x7a, 0xce, 0xff, 0xdf, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x01, 0xf6, 0xec, 0xd9, 0x42, 0x94, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r)