diff --git a/CHANGELOG.md b/CHANGELOG.md index 8dcf673cba..8c60d7ed2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,11 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### API Breaking * (AppModule) [\#7518](https://github.com/cosmos/cosmos-sdk/pull/7518) [\#7584](https://github.com/cosmos/cosmos-sdk/pull/7584) Rename `AppModule.RegisterQueryServices` to `AppModule.RegisterServices`, as this method now registers multiple services (the gRPC query service and the protobuf Msg service). A `Configurator` struct is used to hold the different services. +* (x/staking/types) [\#7447](https://github.com/cosmos/cosmos-sdk/issues/7447) Remove bech32 PubKey support: + * `ValidatorI` interface update. `GetConsPubKey` renamed to `TmConsPubKey` (consensus public key must be a tendermint key). `TmConsPubKey`, `GetConsAddr` methods return error. + * `Validator` update. Methods changed in `ValidatorI` (as described above) and `ToTmValidator` return error. + * `Validator.ConsensusPubkey` type changed from `string` to `codectypes.Any`. + * `MsgCreateValidator.Pubkey` type changed from `string` to `codectypes.Any`. ### Features @@ -165,7 +170,7 @@ of the Cosmos SDK since launch. Please read through this changelog and [release * `NewAnteHandler` and `NewSigVerificationDecorator` both now take a `SignModeHandler` parameter. * `SignatureVerificationGasConsumer` now has the signature: `func(meter sdk.GasMeter, sig signing.SignatureV2, params types.Params) error`. * The `SigVerifiableTx` interface now has a `GetSignaturesV2() ([]signing.SignatureV2, error)` method and no longer has the `GetSignBytes` method. - + ### State Machine Breaking * __General__ @@ -358,7 +363,7 @@ falling below their minimum self-delegation and never having been bonded. The va * (x/auth) [\#6861](https://github.com/cosmos/cosmos-sdk/pull/6861) Remove public key Bech32 encoding for all account types for JSON serialization, instead relying on direct Amino encoding. In addition, JSON serialization utilizes Amino instead of the Go stdlib, so integers are treated as strings. -### Improvements +### Improvements * (client) [\#6853](https://github.com/cosmos/cosmos-sdk/pull/6853) Add --unsafe-cors flag. diff --git a/client/query.go b/client/query.go index ac08da855c..18a5c3c2f4 100644 --- a/client/query.go +++ b/client/query.go @@ -52,19 +52,6 @@ func (ctx Context) QueryABCI(req abci.RequestQuery) (abci.ResponseQuery, error) return ctx.queryABCI(req) } -// QuerySubspace performs a query to a Tendermint node with the provided -// store name and subspace. It returns key value pair and height of the query -// upon success or an error if the query fails. -func (ctx Context) QuerySubspace(subspace []byte, storeName string) (res []sdk.KVPair, height int64, err error) { - resRaw, height, err := ctx.queryStore(subspace, storeName, "subspace") - if err != nil { - return res, height, err - } - - ctx.LegacyAmino.MustUnmarshalBinaryBare(resRaw, &res) - return -} - // GetFromAddress returns the from address from the context's name. func (ctx Context) GetFromAddress() sdk.AccAddress { return ctx.FromAddress diff --git a/codec/amino.go b/codec/amino.go index f34713a9b0..78fd650ca4 100644 --- a/codec/amino.go +++ b/codec/amino.go @@ -139,6 +139,7 @@ func (cdc *LegacyAmino) MustUnmarshalBinaryLengthPrefixed(bz []byte, ptr interfa } } +// MarshalJSON implements codec.Marshaler interface func (cdc *LegacyAmino) MarshalJSON(o interface{}) ([]byte, error) { err := cdc.jsonMarshalAnys(o) if err != nil { @@ -155,6 +156,7 @@ func (cdc *LegacyAmino) MustMarshalJSON(o interface{}) []byte { return bz } +// UnmarshalJSON implements codec.Marshaler interface func (cdc *LegacyAmino) UnmarshalJSON(bz []byte, ptr interface{}) error { err := cdc.Amino.UnmarshalJSON(bz, ptr) if err != nil { diff --git a/crypto/codec/proto.go b/crypto/codec/proto.go index 0afdc6c706..845e60bf82 100644 --- a/crypto/codec/proto.go +++ b/crypto/codec/proto.go @@ -15,12 +15,12 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { // TODO We now register both Tendermint's PubKey and our own PubKey. In the // long-term, we should move away from Tendermint's PubKey, and delete // these lines. - registry.RegisterInterface("tendermint.crypto.Pubkey", (*tmcrypto.PubKey)(nil)) + registry.RegisterInterface("tendermint.crypto.PubKey", (*tmcrypto.PubKey)(nil)) registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &ed25519.PubKey{}) registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &secp256k1.PubKey{}) registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &multisig.LegacyAminoPubKey{}) - registry.RegisterInterface("cosmos.crypto.Pubkey", (*cryptotypes.PubKey)(nil)) + registry.RegisterInterface("cosmos.crypto.PubKey", (*cryptotypes.PubKey)(nil)) registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &ed25519.PubKey{}) registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &secp256k1.PubKey{}) registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &multisig.LegacyAminoPubKey{}) diff --git a/proto/cosmos/staking/v1beta1/staking.proto b/proto/cosmos/staking/v1beta1/staking.proto index 7201b7fa01..ac68af05f4 100644 --- a/proto/cosmos/staking/v1beta1/staking.proto +++ b/proto/cosmos/staking/v1beta1/staking.proto @@ -2,10 +2,13 @@ syntax = "proto3"; package cosmos.staking.v1beta1; import "gogoproto/gogo.proto"; -import "tendermint/types/types.proto"; -import "google/protobuf/timestamp.proto"; +import "google/protobuf/any.proto"; import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; + +import "cosmos_proto/cosmos.proto"; import "cosmos/base/v1beta1/coin.proto"; +import "tendermint/types/types.proto"; option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types"; @@ -73,10 +76,12 @@ message Validator { option (gogoproto.goproto_getters) = false; string operator_address = 1 [(gogoproto.moretags) = "yaml:\"operator_address\""]; - string consensus_pubkey = 2 [(gogoproto.moretags) = "yaml:\"consensus_pubkey\""]; - bool jailed = 3; - BondStatus status = 4; - string tokens = 5 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; + google.protobuf.Any consensus_pubkey = 2 [ + (cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey", + (gogoproto.moretags) = "yaml:\"consensus_pubkey\""]; + bool jailed = 3; + BondStatus status = 4; + string tokens = 5 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; string delegator_shares = 6 [ (gogoproto.moretags) = "yaml:\"delegator_shares\"", (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", diff --git a/proto/cosmos/staking/v1beta1/tx.proto b/proto/cosmos/staking/v1beta1/tx.proto index 60aecd9513..389957091d 100644 --- a/proto/cosmos/staking/v1beta1/tx.proto +++ b/proto/cosmos/staking/v1beta1/tx.proto @@ -1,11 +1,13 @@ syntax = "proto3"; package cosmos.staking.v1beta1; -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "google/protobuf/timestamp.proto"; -import "cosmos/staking/v1beta1/staking.proto"; import "google/protobuf/any.proto"; +import "google/protobuf/timestamp.proto"; +import "gogoproto/gogo.proto"; + +import "cosmos_proto/cosmos.proto"; +import "cosmos/base/v1beta1/coin.proto"; +import "cosmos/staking/v1beta1/staking.proto"; option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types"; @@ -44,7 +46,7 @@ message MsgCreateValidator { ]; string delegator_address = 4 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; string validator_address = 5 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - google.protobuf.Any pubkey = 6; + google.protobuf.Any pubkey = 6 [(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey"]; cosmos.base.v1beta1.Coin value = 7 [(gogoproto.nullable) = false]; } @@ -104,7 +106,7 @@ message MsgBeginRedelegate { } // MsgBeginRedelegateResponse defines the Msg/BeginRedelegate response type. -message MsgBeginRedelegateResponse { +message MsgBeginRedelegateResponse { google.protobuf.Timestamp completion_time = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; } @@ -120,6 +122,6 @@ message MsgUndelegate { } // MsgUndelegateResponse defines the Msg/Undelegate response type. -message MsgUndelegateResponse { +message MsgUndelegateResponse { google.protobuf.Timestamp completion_time = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; } diff --git a/simapp/encoding.go b/simapp/encoding.go index 0ceb122743..2621d3e86d 100644 --- a/simapp/encoding.go +++ b/simapp/encoding.go @@ -1,13 +1,13 @@ package simapp import ( - "github.com/cosmos/cosmos-sdk/simapp/params" + simappparams "github.com/cosmos/cosmos-sdk/simapp/params" "github.com/cosmos/cosmos-sdk/std" ) // MakeEncodingConfig creates an EncodingConfig for testing -func MakeEncodingConfig() params.EncodingConfig { - encodingConfig := params.MakeEncodingConfig() +func MakeEncodingConfig() simappparams.EncodingConfig { + encodingConfig := simappparams.MakeEncodingConfig() std.RegisterLegacyAminoCodec(encodingConfig.Amino) std.RegisterInterfaces(encodingConfig.InterfaceRegistry) ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) diff --git a/simapp/export.go b/simapp/export.go index 7105eca7fc..887308d30a 100644 --- a/simapp/export.go +++ b/simapp/export.go @@ -35,13 +35,13 @@ func (app *SimApp) ExportAppStateAndValidators( return servertypes.ExportedApp{}, err } - validators := staking.WriteValidators(ctx, app.StakingKeeper) + validators, err := staking.WriteValidators(ctx, app.StakingKeeper) return servertypes.ExportedApp{ AppState: appState, Validators: validators, Height: height, ConsensusParams: app.BaseApp.GetConsensusParams(ctx), - }, nil + }, err } // prepare for fresh start at zero height @@ -174,7 +174,10 @@ func (app *SimApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [] iter.Close() - _ = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + _, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + if err != nil { + log.Fatal(err) + } /* Handle slashing state. */ diff --git a/simapp/params/proto.go b/simapp/params/proto.go index 7bcdffe405..63ae791a4f 100644 --- a/simapp/params/proto.go +++ b/simapp/params/proto.go @@ -8,17 +8,16 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/tx" ) -// MakeEncodingConfig creates an EncodingConfig for an amino based test configuration. +// MakeEncodingConfig creates an EncodingConfig for a non-amino based test configuration. func MakeEncodingConfig() EncodingConfig { - amino := codec.NewLegacyAmino() + cdc := codec.NewLegacyAmino() interfaceRegistry := types.NewInterfaceRegistry() marshaler := codec.NewProtoCodec(interfaceRegistry) - txCfg := tx.NewTxConfig(marshaler, tx.DefaultSignModes) return EncodingConfig{ InterfaceRegistry: interfaceRegistry, Marshaler: marshaler, - TxConfig: txCfg, - Amino: amino, + TxConfig: tx.NewTxConfig(marshaler, tx.DefaultSignModes), + Amino: cdc, } } diff --git a/simapp/sim_bench_test.go b/simapp/sim_bench_test.go index 97ab481358..660e0fb8f0 100644 --- a/simapp/sim_bench_test.go +++ b/simapp/sim_bench_test.go @@ -39,6 +39,7 @@ func BenchmarkFullAppSimulation(b *testing.B) { SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, + app.AppCodec(), ) // export state and simParams before the simulation error is checked @@ -83,6 +84,7 @@ func BenchmarkInvariants(b *testing.B) { SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, + app.AppCodec(), ) // export state and simParams before the simulation error is checked diff --git a/simapp/sim_test.go b/simapp/sim_test.go index b1b28a9c51..ad3633132d 100644 --- a/simapp/sim_test.go +++ b/simapp/sim_test.go @@ -81,6 +81,7 @@ func TestFullAppSimulation(t *testing.T) { SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, + app.AppCodec(), ) // export state and simParams before the simulation error is checked @@ -118,6 +119,7 @@ func TestAppImportExport(t *testing.T) { SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, + app.AppCodec(), ) // export state and simParams before the simulation error is checked @@ -214,6 +216,7 @@ func TestAppSimulationAfterImport(t *testing.T) { SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, + app.AppCodec(), ) // export state and simParams before the simulation error is checked @@ -261,6 +264,7 @@ func TestAppSimulationAfterImport(t *testing.T) { SimulationOperations(newApp, newApp.AppCodec(), config), app.ModuleAccountAddrs(), config, + app.AppCodec(), ) require.NoError(t, err) } @@ -311,6 +315,7 @@ func TestAppStateDeterminism(t *testing.T) { SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, + app.AppCodec(), ) require.NoError(t, err) diff --git a/simapp/state.go b/simapp/state.go index 62a19e7f64..3eb9afd375 100644 --- a/simapp/state.go +++ b/simapp/state.go @@ -13,7 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - simapparams "github.com/cosmos/cosmos-sdk/simapp/params" + simappparams "github.com/cosmos/cosmos-sdk/simapp/params" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -85,11 +85,11 @@ func AppStateRandomizedFn( // number of bonded accounts var initialStake, numInitiallyBonded int64 appParams.GetOrGenerate( - cdc, simapparams.StakePerAccount, &initialStake, r, + cdc, simappparams.StakePerAccount, &initialStake, r, func(r *rand.Rand) { initialStake = r.Int63n(1e12) }, ) appParams.GetOrGenerate( - cdc, simapparams.InitiallyBondedValidators, &numInitiallyBonded, r, + cdc, simappparams.InitiallyBondedValidators, &numInitiallyBonded, r, func(r *rand.Rand) { numInitiallyBonded = int64(r.Intn(300)) }, ) diff --git a/simapp/test_helpers.go b/simapp/test_helpers.go index e795394000..8da319b216 100644 --- a/simapp/test_helpers.go +++ b/simapp/test_helpers.go @@ -19,6 +19,7 @@ import ( bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp/helpers" sdk "github.com/cosmos/cosmos-sdk/types" @@ -92,9 +93,16 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs bondAmt := sdk.NewInt(1000000) for _, val := range valSet.Validators { + // Currently validator requires tmcrypto.ed25519 keys, which don't support + // our Marshaling interfaces, so we need to pack them into our version of ed25519. + // There is ongoing work to add secp256k1 keys (https://github.com/cosmos/cosmos-sdk/pull/7604). + pk, err := ed25519.FromTmEd25519(val.PubKey) + require.NoError(t, err) + pkAny, err := codectypes.PackAny(pk) + require.NoError(t, err) validator := stakingtypes.Validator{ OperatorAddress: sdk.ValAddress(val.Address).String(), - ConsensusPubkey: sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, val.PubKey), + ConsensusPubkey: pkAny, Jailed: false, Status: stakingtypes.Bonded, Tokens: bondAmt, diff --git a/x/auth/module.go b/x/auth/module.go index 21e43bef26..55b5dc7fbb 100644 --- a/x/auth/module.go +++ b/x/auth/module.go @@ -92,11 +92,11 @@ type AppModule struct { AppModuleBasic accountKeeper keeper.AccountKeeper - randGenAccountsFn simulation.RandomGenesisAccountsFn + randGenAccountsFn types.RandomGenesisAccountsFn } // NewAppModule creates a new AppModule object -func NewAppModule(cdc codec.Marshaler, accountKeeper keeper.AccountKeeper, randGenAccountsFn simulation.RandomGenesisAccountsFn) AppModule { +func NewAppModule(cdc codec.Marshaler, accountKeeper keeper.AccountKeeper, randGenAccountsFn types.RandomGenesisAccountsFn) AppModule { return AppModule{ AppModuleBasic: AppModuleBasic{}, accountKeeper: accountKeeper, diff --git a/x/auth/simulation/genesis.go b/x/auth/simulation/genesis.go index f04ca34baf..2da36b54fa 100644 --- a/x/auth/simulation/genesis.go +++ b/x/auth/simulation/genesis.go @@ -21,10 +21,6 @@ const ( SigVerifyCostSECP256K1 = "sig_verify_cost_secp256k1" ) -// RandomGenesisAccountsFn defines the function required to generate custom account types -// on the auth module simulation. -type RandomGenesisAccountsFn func(simState *module.SimulationState) types.GenesisAccounts - // RandomGenesisAccounts defines the default RandomGenesisAccountsFn used on the SDK. // It creates a slice of BaseAccount, ContinuousVestingAccount and DelayedVestingAccount. func RandomGenesisAccounts(simState *module.SimulationState) types.GenesisAccounts { @@ -92,7 +88,7 @@ func GenSigVerifyCostSECP256K1(r *rand.Rand) uint64 { } // RandomizedGenState generates a random GenesisState for auth -func RandomizedGenState(simState *module.SimulationState, randGenAccountsFn RandomGenesisAccountsFn) { +func RandomizedGenState(simState *module.SimulationState, randGenAccountsFn types.RandomGenesisAccountsFn) { var maxMemoChars uint64 simState.AppParams.GetOrGenerate( simState.Cdc, MaxMemoChars, &maxMemoChars, simState.Rand, diff --git a/x/auth/simulation/params.go b/x/auth/simulation/params.go index a9240276ac..5ce9ac95fc 100644 --- a/x/auth/simulation/params.go +++ b/x/auth/simulation/params.go @@ -6,10 +6,9 @@ import ( "fmt" "math/rand" - "github.com/cosmos/cosmos-sdk/x/simulation" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/simulation" ) const ( diff --git a/x/auth/types/genesis.go b/x/auth/types/genesis.go index 9dc9e3323b..2b33aa3a5a 100644 --- a/x/auth/types/genesis.go +++ b/x/auth/types/genesis.go @@ -9,10 +9,14 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/types/module" ) var _ types.UnpackInterfacesMessage = GenesisState{} +// RandomGenesisAccountsFn defines the function required to generate custom account types +type RandomGenesisAccountsFn func(simState *module.SimulationState) GenesisAccounts + // NewGenesisState - Create a new genesis state func NewGenesisState(params Params, accounts GenesisAccounts) *GenesisState { genAccounts, err := PackAccounts(accounts) diff --git a/x/distribution/simulation/operations_test.go b/x/distribution/simulation/operations_test.go index 6c6903fbf8..4a3dff3087 100644 --- a/x/distribution/simulation/operations_test.go +++ b/x/distribution/simulation/operations_test.go @@ -243,13 +243,15 @@ func (suite *SimTestSuite) getTestingValidator0(accounts []simtypes.Account) sta } func (suite *SimTestSuite) getTestingValidator(accounts []simtypes.Account, commission stakingtypes.Commission, n int) stakingtypes.Validator { + require := suite.Require() account := accounts[n] valPubKey := account.PubKey valAddr := sdk.ValAddress(account.PubKey.Address().Bytes()) - validator := stakingtypes.NewValidator(valAddr, valPubKey, stakingtypes.Description{}) - validator, err := validator.SetInitialCommission(commission) - suite.Require().NoError(err) - + validator, err := stakingtypes.NewValidator(valAddr, valPubKey, stakingtypes. + Description{}) + require.NoError(err) + validator, err = validator.SetInitialCommission(commission) + require.NoError(err) validator.DelegatorShares = sdk.NewDec(100) validator.Tokens = sdk.NewInt(1000000) diff --git a/x/evidence/types/tx.pb.go b/x/evidence/types/tx.pb.go index 5dc9c0fb6c..d2a2f563e1 100644 --- a/x/evidence/types/tx.pb.go +++ b/x/evidence/types/tx.pb.go @@ -185,7 +185,7 @@ const _ = grpc.SupportPackageIsVersion4 // // 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 { - // Send submits an arbitrary Evidence of misbehavior such as equivocation or + // SubmitEvidence submits an arbitrary Evidence of misbehavior such as equivocation or // counterfactual signing. SubmitEvidence(ctx context.Context, in *MsgSubmitEvidence, opts ...grpc.CallOption) (*MsgSubmitEvidenceResponse, error) } @@ -209,7 +209,7 @@ func (c *msgClient) SubmitEvidence(ctx context.Context, in *MsgSubmitEvidence, o // MsgServer is the server API for Msg service. type MsgServer interface { - // Send submits an arbitrary Evidence of misbehavior such as equivocation or + // SubmitEvidence submits an arbitrary Evidence of misbehavior such as equivocation or // counterfactual signing. SubmitEvidence(context.Context, *MsgSubmitEvidence) (*MsgSubmitEvidenceResponse, error) } diff --git a/x/genutil/genesis.go b/x/genutil/genesis.go index 9a155cfa1e..c6d17edb8d 100644 --- a/x/genutil/genesis.go +++ b/x/genutil/genesis.go @@ -13,12 +13,9 @@ func InitGenesis( ctx sdk.Context, stakingKeeper types.StakingKeeper, deliverTx deliverTxfn, genesisState types.GenesisState, txEncodingConfig client.TxEncodingConfig, -) []abci.ValidatorUpdate { - - var validators []abci.ValidatorUpdate +) (validators []abci.ValidatorUpdate, err error) { if len(genesisState.GenTxs) > 0 { - validators = DeliverGenTxs(ctx, genesisState.GenTxs, stakingKeeper, deliverTx, txEncodingConfig) + validators, err = DeliverGenTxs(ctx, genesisState.GenTxs, stakingKeeper, deliverTx, txEncodingConfig) } - - return validators + return } diff --git a/x/genutil/gentx.go b/x/genutil/gentx.go index 10849bde78..b5415ffb31 100644 --- a/x/genutil/gentx.go +++ b/x/genutil/gentx.go @@ -95,7 +95,7 @@ func DeliverGenTxs( ctx sdk.Context, genTxs []json.RawMessage, stakingKeeper types.StakingKeeper, deliverTx deliverTxfn, txEncodingConfig client.TxEncodingConfig, -) []abci.ValidatorUpdate { +) ([]abci.ValidatorUpdate, error) { for _, genTx := range genTxs { tx, err := txEncodingConfig.TxJSONDecoder()(genTx) diff --git a/x/genutil/module.go b/x/genutil/module.go index 0280ffa3a3..711e5a6884 100644 --- a/x/genutil/module.go +++ b/x/genutil/module.go @@ -98,7 +98,11 @@ func NewAppModule(accountKeeper types.AccountKeeper, func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONMarshaler, data json.RawMessage) []abci.ValidatorUpdate { var genesisState types.GenesisState cdc.MustUnmarshalJSON(data, &genesisState) - return InitGenesis(ctx, am.stakingKeeper, am.deliverTx, genesisState, am.txEncodingConfig) + validators, err := InitGenesis(ctx, am.stakingKeeper, am.deliverTx, genesisState, am.txEncodingConfig) + if err != nil { + panic(err) + } + return validators } // ExportGenesis returns the exported genesis state as raw bytes for the genutil diff --git a/x/genutil/types/expected_keepers.go b/x/genutil/types/expected_keepers.go index 62d8d48f15..341d2eb2c8 100644 --- a/x/genutil/types/expected_keepers.go +++ b/x/genutil/types/expected_keepers.go @@ -13,7 +13,7 @@ import ( // StakingKeeper defines the expected staking keeper (noalias) type StakingKeeper interface { - ApplyAndReturnValidatorSetUpdates(sdk.Context) (updates []abci.ValidatorUpdate) + ApplyAndReturnValidatorSetUpdates(sdk.Context) (updates []abci.ValidatorUpdate, err error) } // AccountKeeper defines the expected account keeper (noalias) diff --git a/x/gov/client/utils/query_test.go b/x/gov/client/utils/query_test.go index 57d36c5914..c6f999e86e 100644 --- a/x/gov/client/utils/query_test.go +++ b/x/gov/client/utils/query_test.go @@ -4,9 +4,6 @@ import ( "context" "testing" - "github.com/cosmos/cosmos-sdk/simapp" - "github.com/cosmos/cosmos-sdk/x/gov/client/utils" - "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/rpc/client/mock" ctypes "github.com/tendermint/tendermint/rpc/core/types" @@ -14,8 +11,10 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/gov/client/utils" "github.com/cosmos/cosmos-sdk/x/gov/types" ) diff --git a/x/gov/keeper/common_test.go b/x/gov/keeper/common_test.go index b9b8e2ba35..60eb8be598 100644 --- a/x/gov/keeper/common_test.go +++ b/x/gov/keeper/common_test.go @@ -1,19 +1,22 @@ package keeper_test import ( + "testing" + "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/cosmos/cosmos-sdk/x/staking" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/stretchr/testify/require" ) var ( TestProposal = types.NewTextProposal("Test", "description") ) -func createValidators(ctx sdk.Context, app *simapp.SimApp, powers []int64) ([]sdk.AccAddress, []sdk.ValAddress) { +func createValidators(t *testing.T, ctx sdk.Context, app *simapp.SimApp, powers []int64) ([]sdk.AccAddress, []sdk.ValAddress) { addrs := simapp.AddTestAddrsIncremental(app, ctx, 5, sdk.NewInt(30000000)) valAddrs := simapp.ConvertAddrsToValAddrs(addrs) pks := simapp.CreateTestPubKeys(5) @@ -27,9 +30,12 @@ func createValidators(ctx sdk.Context, app *simapp.SimApp, powers []int64) ([]sd app.GetSubspace(stakingtypes.ModuleName), ) - val1 := stakingtypes.NewValidator(valAddrs[0], pks[0], stakingtypes.Description{}) - val2 := stakingtypes.NewValidator(valAddrs[1], pks[1], stakingtypes.Description{}) - val3 := stakingtypes.NewValidator(valAddrs[2], pks[2], stakingtypes.Description{}) + val1, err := stakingtypes.NewValidator(valAddrs[0], pks[0], stakingtypes.Description{}) + require.NoError(t, err) + val2, err := stakingtypes.NewValidator(valAddrs[1], pks[1], stakingtypes.Description{}) + require.NoError(t, err) + val3, err := stakingtypes.NewValidator(valAddrs[2], pks[2], stakingtypes.Description{}) + require.NoError(t, err) app.StakingKeeper.SetValidator(ctx, val1) app.StakingKeeper.SetValidator(ctx, val2) diff --git a/x/gov/keeper/grpc_query_test.go b/x/gov/keeper/grpc_query_test.go index ddea9b4f34..dc330d7348 100644 --- a/x/gov/keeper/grpc_query_test.go +++ b/x/gov/keeper/grpc_query_test.go @@ -713,7 +713,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryDeposits() { func (suite *KeeperTestSuite) TestGRPCQueryTally() { app, ctx, queryClient := suite.app, suite.ctx, suite.queryClient - addrs, _ := createValidators(ctx, app, []int64{5, 5, 5}) + addrs, _ := createValidators(suite.T(), ctx, app, []int64{5, 5, 5}) var ( req *types.QueryTallyResultRequest diff --git a/x/gov/keeper/tally_test.go b/x/gov/keeper/tally_test.go index e4f6547e90..6c23a510e9 100644 --- a/x/gov/keeper/tally_test.go +++ b/x/gov/keeper/tally_test.go @@ -17,7 +17,7 @@ func TestTallyNoOneVotes(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - createValidators(ctx, app, []int64{5, 5, 5}) + createValidators(t, ctx, app, []int64{5, 5, 5}) tp := TestProposal proposal, err := app.GovKeeper.SubmitProposal(ctx, tp) @@ -39,7 +39,7 @@ func TestTallyNoQuorum(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - createValidators(ctx, app, []int64{2, 5, 0}) + createValidators(t, ctx, app, []int64{2, 5, 0}) addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.NewInt(10000000)) @@ -64,7 +64,7 @@ func TestTallyOnlyValidatorsAllYes(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - addrs, _ := createValidators(ctx, app, []int64{5, 5, 5}) + addrs, _ := createValidators(t, ctx, app, []int64{5, 5, 5}) tp := TestProposal proposal, err := app.GovKeeper.SubmitProposal(ctx, tp) @@ -90,7 +90,7 @@ func TestTallyOnlyValidators51No(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - valAccAddrs, _ := createValidators(ctx, app, []int64{5, 6, 0}) + valAccAddrs, _ := createValidators(t, ctx, app, []int64{5, 6, 0}) tp := TestProposal proposal, err := app.GovKeeper.SubmitProposal(ctx, tp) @@ -114,7 +114,7 @@ func TestTallyOnlyValidators51Yes(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - valAccAddrs, _ := createValidators(ctx, app, []int64{5, 6, 0}) + valAccAddrs, _ := createValidators(t, ctx, app, []int64{5, 6, 0}) tp := TestProposal proposal, err := app.GovKeeper.SubmitProposal(ctx, tp) @@ -139,7 +139,7 @@ func TestTallyOnlyValidatorsVetoed(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - valAccAddrs, _ := createValidators(ctx, app, []int64{6, 6, 7}) + valAccAddrs, _ := createValidators(t, ctx, app, []int64{6, 6, 7}) tp := TestProposal proposal, err := app.GovKeeper.SubmitProposal(ctx, tp) @@ -165,7 +165,7 @@ func TestTallyOnlyValidatorsAbstainPasses(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - valAccAddrs, _ := createValidators(ctx, app, []int64{6, 6, 7}) + valAccAddrs, _ := createValidators(t, ctx, app, []int64{6, 6, 7}) tp := TestProposal proposal, err := app.GovKeeper.SubmitProposal(ctx, tp) @@ -191,7 +191,7 @@ func TestTallyOnlyValidatorsAbstainFails(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - valAccAddrs, _ := createValidators(ctx, app, []int64{6, 6, 7}) + valAccAddrs, _ := createValidators(t, ctx, app, []int64{6, 6, 7}) tp := TestProposal proposal, err := app.GovKeeper.SubmitProposal(ctx, tp) @@ -217,7 +217,7 @@ func TestTallyOnlyValidatorsNonVoter(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - valAccAddrs, _ := createValidators(ctx, app, []int64{5, 6, 7}) + valAccAddrs, _ := createValidators(t, ctx, app, []int64{5, 6, 7}) valAccAddr1, valAccAddr2 := valAccAddrs[0], valAccAddrs[1] tp := TestProposal @@ -243,7 +243,7 @@ func TestTallyDelgatorOverride(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - addrs, valAddrs := createValidators(ctx, app, []int64{5, 6, 7}) + addrs, valAddrs := createValidators(t, ctx, app, []int64{5, 6, 7}) delTokens := sdk.TokensFromConsensusPower(30) val1, found := app.StakingKeeper.GetValidator(ctx, valAddrs[0]) @@ -279,7 +279,7 @@ func TestTallyDelgatorInherit(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - addrs, vals := createValidators(ctx, app, []int64{5, 6, 7}) + addrs, vals := createValidators(t, ctx, app, []int64{5, 6, 7}) delTokens := sdk.TokensFromConsensusPower(30) val3, found := app.StakingKeeper.GetValidator(ctx, vals[2]) @@ -314,7 +314,7 @@ func TestTallyDelgatorMultipleOverride(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - addrs, vals := createValidators(ctx, app, []int64{5, 6, 7}) + addrs, vals := createValidators(t, ctx, app, []int64{5, 6, 7}) delTokens := sdk.TokensFromConsensusPower(10) val1, found := app.StakingKeeper.GetValidator(ctx, vals[0]) @@ -354,9 +354,9 @@ func TestTallyDelgatorMultipleInherit(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - createValidators(ctx, app, []int64{25, 6, 7}) + createValidators(t, ctx, app, []int64{25, 6, 7}) - addrs, vals := createValidators(ctx, app, []int64{5, 6, 7}) + addrs, vals := createValidators(t, ctx, app, []int64{5, 6, 7}) delTokens := sdk.TokensFromConsensusPower(10) val2, found := app.StakingKeeper.GetValidator(ctx, vals[1]) @@ -395,7 +395,7 @@ func TestTallyJailedValidator(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - addrs, valAddrs := createValidators(ctx, app, []int64{25, 6, 7}) + addrs, valAddrs := createValidators(t, ctx, app, []int64{25, 6, 7}) delTokens := sdk.TokensFromConsensusPower(10) val2, found := app.StakingKeeper.GetValidator(ctx, valAddrs[1]) @@ -410,7 +410,9 @@ func TestTallyJailedValidator(t *testing.T) { _ = staking.EndBlocker(ctx, app.StakingKeeper) - app.StakingKeeper.Jail(ctx, sdk.ConsAddress(val2.GetConsPubKey().Address())) + consKey, err := val2.TmConsPubKey() + require.NoError(t, err) + app.StakingKeeper.Jail(ctx, sdk.ConsAddress(consKey.Address())) tp := TestProposal proposal, err := app.GovKeeper.SubmitProposal(ctx, tp) @@ -436,7 +438,7 @@ func TestTallyValidatorMultipleDelegations(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - addrs, valAddrs := createValidators(ctx, app, []int64{10, 10, 10}) + addrs, valAddrs := createValidators(t, ctx, app, []int64{10, 10, 10}) delTokens := sdk.TokensFromConsensusPower(10) val2, found := app.StakingKeeper.GetValidator(ctx, valAddrs[1]) diff --git a/x/gov/types/tx.pb.go b/x/gov/types/tx.pb.go index c1391e12ef..c4d9a96701 100644 --- a/x/gov/types/tx.pb.go +++ b/x/gov/types/tx.pb.go @@ -7,10 +7,10 @@ import ( context "context" fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - grpc1 "github.com/gogo/protobuf/grpc" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types1 "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" _ "github.com/regen-network/cosmos-proto" grpc "google.golang.org/grpc" diff --git a/x/ibc/core/02-client/keeper/keeper_test.go b/x/ibc/core/02-client/keeper/keeper_test.go index c2f18311be..9679353422 100644 --- a/x/ibc/core/02-client/keeper/keeper_test.go +++ b/x/ibc/core/02-client/keeper/keeper_test.go @@ -102,12 +102,15 @@ func (suite *KeeperTestSuite) SetupTest() { privVal := ibctestingmock.NewPV() pk, err := privVal.GetPubKey() suite.Require().NoError(err) - val := stakingtypes.NewValidator(sdk.ValAddress(pk.Address()), pk, stakingtypes.Description{}) + val, err := stakingtypes.NewValidator(sdk.ValAddress(pk.Address()), pk, stakingtypes.Description{}) + suite.Require().NoError(err) + val.Status = stakingtypes.Bonded val.Tokens = sdk.NewInt(rand.Int63()) validators = append(validators, val) - app.StakingKeeper.SetHistoricalInfo(suite.ctx, int64(i), stakingtypes.NewHistoricalInfo(suite.ctx.BlockHeader(), validators)) + hi := stakingtypes.NewHistoricalInfo(suite.ctx.BlockHeader(), validators) + app.StakingKeeper.SetHistoricalInfo(suite.ctx, int64(i), &hi) } queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, app.InterfaceRegistry()) diff --git a/x/ibc/testing/chain.go b/x/ibc/testing/chain.go index 9331ef405c..ef1628d73c 100644 --- a/x/ibc/testing/chain.go +++ b/x/ibc/testing/chain.go @@ -344,7 +344,12 @@ func (chain *TestChain) GetValsAtHeight(height int64) (*tmtypes.ValidatorSet, bo } valSet := stakingtypes.Validators(histInfo.Valset) - return tmtypes.NewValidatorSet(valSet.ToTmValidators()), true + + tmValidators, err := valSet.ToTmValidators() + if err != nil { + panic(err) + } + return tmtypes.NewValidatorSet(tmValidators), true } // GetConnection retrieves an IBC Connection for the provided TestConnection. The diff --git a/x/simulation/params.go b/x/simulation/params.go index f7fc798e65..12e8e09726 100644 --- a/x/simulation/params.go +++ b/x/simulation/params.go @@ -9,7 +9,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/tendermint/tendermint/types" - "github.com/cosmos/cosmos-sdk/simapp/params" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/types/simulation" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -153,19 +153,15 @@ func (w WeightedProposalContent) ContentSimulatorFn() simulation.ContentSimulato //----------------------------------------------------------------------------- // Param change proposals -// RandomParams returns random simulation consensus parameters, it extracts the Evidence from the Staking genesis state. -func RandomConsensusParams(r *rand.Rand, appState json.RawMessage) *abci.ConsensusParams { - cdc := params.MakeEncodingConfig().Marshaler - +// randomConsensusParams returns random simulation consensus parameters, it extracts the Evidence from the Staking genesis state. +func randomConsensusParams(r *rand.Rand, appState json.RawMessage, cdc codec.JSONMarshaler) *abci.ConsensusParams { var genesisState map[string]json.RawMessage - err := json.Unmarshal(appState, &genesisState) if err != nil { panic(err) } stakingGenesisState := stakingtypes.GetGenesisStateFromAppState(cdc, genesisState) - consensusParams := &abci.ConsensusParams{ Block: &abci.BlockParams{ MaxBytes: int64(simulation.RandIntBetween(r, 20000000, 30000000)), diff --git a/x/simulation/simulate.go b/x/simulation/simulate.go index 2b7feb92e4..7767cbbe50 100644 --- a/x/simulation/simulate.go +++ b/x/simulation/simulate.go @@ -14,6 +14,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/simulation" ) @@ -23,11 +24,11 @@ const AverageBlockTime = 6 * time.Second // initialize the chain for the simulation func initChain( r *rand.Rand, params Params, accounts []simulation.Account, app *baseapp.BaseApp, - appStateFn simulation.AppStateFn, config simulation.Config, + appStateFn simulation.AppStateFn, config simulation.Config, cdc codec.JSONMarshaler, ) (mockValidators, time.Time, []simulation.Account, string) { appState, accounts, chainID, genesisTimestamp := appStateFn(r, accounts, config) - consensusParams := RandomConsensusParams(r, appState) + consensusParams := randomConsensusParams(r, appState, cdc) req := abci.RequestInitChain{ AppStateBytes: appState, @@ -52,6 +53,7 @@ func SimulateFromSeed( ops WeightedOperations, blockedAddrs map[string]bool, config simulation.Config, + cdc codec.JSONMarshaler, ) (stopEarly bool, exportedParams Params, err error) { // in case we have to end early, don't os.Exit so that we can run cleanup code. testingMode, _, b := getTestingMode(tb) @@ -67,7 +69,7 @@ func SimulateFromSeed( // Second variable to keep pending validator set (delayed one block since // TM 0.24) Initially this is the same as the initial validator set - validators, genesisTimestamp, accs, chainID := initChain(r, params, accs, app, appStateFn, config) + validators, genesisTimestamp, accs, chainID := initChain(r, params, accs, app, appStateFn, config, cdc) if len(accs) == 0 { return true, params, fmt.Errorf("must have greater than zero genesis accounts") } diff --git a/x/slashing/genesis.go b/x/slashing/genesis.go index 87fa12237c..ae8f315553 100644 --- a/x/slashing/genesis.go +++ b/x/slashing/genesis.go @@ -12,7 +12,11 @@ import ( func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, stakingKeeper types.StakingKeeper, data *types.GenesisState) { stakingKeeper.IterateValidators(ctx, func(index int64, validator stakingtypes.ValidatorI) bool { - keeper.AddPubkey(ctx, validator.GetConsPubKey()) + consPk, err := validator.TmConsPubKey() + if err != nil { + panic(err) + } + keeper.AddPubkey(ctx, consPk) return false }, ) diff --git a/x/slashing/keeper/hooks.go b/x/slashing/keeper/hooks.go index ac1be5fae1..daf2e051e1 100644 --- a/x/slashing/keeper/hooks.go +++ b/x/slashing/keeper/hooks.go @@ -25,13 +25,18 @@ func (k Keeper) AfterValidatorBonded(ctx sdk.Context, address sdk.ConsAddress, _ } } -// When a validator is created, add the address-pubkey relation. -func (k Keeper) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) { +// AfterValidatorCreated adds the address-pubkey relation when a validator is created. +func (k Keeper) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) error { validator := k.sk.Validator(ctx, valAddr) - k.AddPubkey(ctx, validator.GetConsPubKey()) + consPk, err := validator.TmConsPubKey() + if err != nil { + return err + } + k.AddPubkey(ctx, consPk) + return nil } -// When a validator is removed, delete the address-pubkey relation. +// AfterValidatorRemoved deletes the address-pubkey relation when a validator is removed, func (k Keeper) AfterValidatorRemoved(ctx sdk.Context, address sdk.ConsAddress) { k.deleteAddrPubkeyRelation(ctx, crypto.Address(address)) } diff --git a/x/slashing/keeper/unjail.go b/x/slashing/keeper/unjail.go index a8dab94d25..23a9121e54 100644 --- a/x/slashing/keeper/unjail.go +++ b/x/slashing/keeper/unjail.go @@ -33,8 +33,10 @@ func (k Keeper) Unjail(ctx sdk.Context, validatorAddr sdk.ValAddress) error { return types.ErrValidatorNotJailed } - consAddr := sdk.ConsAddress(validator.GetConsPubKey().Address()) - + consAddr, err := validator.GetConsAddr() + if err != nil { + return err + } // If the validator has a ValidatorSigningInfo object that signals that the // validator was bonded and so we must check that the validator is not tombstoned // and can be unjailed at the current block. diff --git a/x/slashing/simulation/operations.go b/x/slashing/simulation/operations.go index e30dd900ed..de95c0136b 100644 --- a/x/slashing/simulation/operations.go +++ b/x/slashing/simulation/operations.go @@ -65,7 +65,11 @@ func SimulateMsgUnjail(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Kee return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUnjail, "validator is not jailed"), nil, nil } - consAddr := sdk.ConsAddress(validator.GetConsPubKey().Address()) + cons, err := validator.TmConsPubKey() + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUnjail, "unable to get validator consensus key"), nil, err + } + consAddr := sdk.ConsAddress(cons.Address()) info, found := k.GetValidatorSigningInfo(ctx, consAddr) if !found { return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUnjail, "unable to find validator signing info"), nil, nil // skip diff --git a/x/slashing/simulation/operations_test.go b/x/slashing/simulation/operations_test.go index 71e5e85a4c..15764c631e 100644 --- a/x/slashing/simulation/operations_test.go +++ b/x/slashing/simulation/operations_test.go @@ -67,7 +67,8 @@ func TestSimulateMsgUnjail(t *testing.T) { // setup validator0 by consensus address app.StakingKeeper.SetValidatorByConsAddr(ctx, validator0) - val0ConsAddress := sdk.ConsAddress(validator0.GetConsPubKey().Address()) + val0ConsAddress, err := validator0.GetConsAddr() + require.NoError(t, err) info := types.NewValidatorSigningInfo(val0ConsAddress, int64(4), int64(3), time.Unix(2, 0), false, int64(10)) app.SlashingKeeper.SetValidatorSigningInfo(ctx, val0ConsAddress, info) @@ -136,10 +137,11 @@ func getTestingValidator0(t *testing.T, app *simapp.SimApp, ctx sdk.Context, acc func getTestingValidator(t *testing.T, app *simapp.SimApp, ctx sdk.Context, accounts []simtypes.Account, commission stakingtypes.Commission, n int) stakingtypes.Validator { account := accounts[n] - valPubKey := account.PubKey + valPubKey := account.ConsKey.PubKey() valAddr := sdk.ValAddress(account.PubKey.Address().Bytes()) - validator := stakingtypes.NewValidator(valAddr, valPubKey, stakingtypes.Description{}) - validator, err := validator.SetInitialCommission(commission) + validator, err := stakingtypes.NewValidator(valAddr, valPubKey, stakingtypes.Description{}) + require.NoError(t, err) + validator, err = validator.SetInitialCommission(commission) require.NoError(t, err) validator.DelegatorShares = sdk.NewDec(100) diff --git a/x/staking/client/cli/cli_test.go b/x/staking/client/cli/cli_test.go index 3ec0546665..2b66da867c 100644 --- a/x/staking/client/cli/cli_test.go +++ b/x/staking/client/cli/cli_test.go @@ -4,7 +4,6 @@ package cli_test import ( "context" - json "encoding/json" "fmt" "strings" "testing" @@ -277,9 +276,9 @@ func (s *IntegrationTestSuite) TestGetCmdQueryValidators() { out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) s.Require().NoError(err) - var result []types.Validator - s.Require().NoError(json.Unmarshal(out.Bytes(), &result)) - s.Require().Equal(len(s.network.Validators), len(result)) + var result types.QueryValidatorsResponse + s.Require().NoError(clientCtx.JSONMarshaler.UnmarshalJSON(out.Bytes(), &result)) + s.Require().Equal(len(s.network.Validators), len(result.Validators)) }) } } diff --git a/x/staking/client/cli/query.go b/x/staking/client/cli/query.go index eeb2bb95b0..ec99b6b57c 100644 --- a/x/staking/client/cli/query.go +++ b/x/staking/client/cli/query.go @@ -113,22 +113,21 @@ $ %s query staking validators return err } - resKVs, _, err := clientCtx.QuerySubspace(types.ValidatorsKey, types.StoreKey) + queryClient := types.NewQueryClient(clientCtx) + pageReq, err := client.ReadPageRequest(cmd.Flags()) if err != nil { return err } - var validators types.Validators - for _, kv := range resKVs { - validator, err := types.UnmarshalValidator(types.ModuleCdc, kv.Value) - if err != nil { - return err - } - - validators = append(validators, validator) + result, err := queryClient.Validators(context.Background(), &types.QueryValidatorsRequest{ + // Leaving status empty on purpose to query all validators. + Pagination: pageReq, + }) + if err != nil { + return err } - return clientCtx.PrintOutputLegacy(validators) + return clientCtx.PrintOutput(result) }, } diff --git a/x/staking/genesis.go b/x/staking/genesis.go index e55c32e551..1b646f2364 100644 --- a/x/staking/genesis.go +++ b/x/staking/genesis.go @@ -2,8 +2,10 @@ package staking import ( "fmt" + "log" abci "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/crypto" tmtypes "github.com/tendermint/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -146,7 +148,11 @@ func InitGenesis( res = append(res, update) } } else { - res = keeper.ApplyAndReturnValidatorSetUpdates(ctx) + var err error + res, err = keeper.ApplyAndReturnValidatorSetUpdates(ctx) + if err != nil { + log.Fatal(err) + } } return res @@ -190,11 +196,16 @@ func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) *types.GenesisState { } // WriteValidators returns a slice of bonded genesis validators. -func WriteValidators(ctx sdk.Context, keeper keeper.Keeper) (vals []tmtypes.GenesisValidator) { +func WriteValidators(ctx sdk.Context, keeper keeper.Keeper) (vals []tmtypes.GenesisValidator, err error) { keeper.IterateLastValidators(ctx, func(_ int64, validator types.ValidatorI) (stop bool) { + var consPk crypto.PubKey + consPk, err = validator.TmConsPubKey() + if err != nil { + return true + } vals = append(vals, tmtypes.GenesisValidator{ - Address: validator.GetConsAddr().Bytes(), - PubKey: validator.GetConsPubKey(), + Address: sdk.ConsAddress(consPk.Address()).Bytes(), + PubKey: consPk, Power: validator.GetConsensusPower(), Name: validator.GetMoniker(), }) @@ -215,19 +226,27 @@ func ValidateGenesis(data *types.GenesisState) error { return data.Params.Validate() } -func validateGenesisStateValidators(validators []types.Validator) (err error) { +func validateGenesisStateValidators(validators []types.Validator) error { addrMap := make(map[string]bool, len(validators)) for i := 0; i < len(validators); i++ { val := validators[i] - strKey := string(val.GetConsPubKey().Bytes()) + consPk, err := val.TmConsPubKey() + if err != nil { + return err + } + consAddr, err := val.GetConsAddr() + if err != nil { + return err + } + strKey := string(consPk.Bytes()) if _, ok := addrMap[strKey]; ok { - return fmt.Errorf("duplicate validator in genesis state: moniker %v, address %v", val.Description.Moniker, val.GetConsAddr()) + return fmt.Errorf("duplicate validator in genesis state: moniker %v, address %v", val.Description.Moniker, consAddr) } if val.Jailed && val.IsBonded() { - return fmt.Errorf("validator is bonded and jailed in genesis state: moniker %v, address %v", val.Description.Moniker, val.GetConsAddr()) + return fmt.Errorf("validator is bonded and jailed in genesis state: moniker %v, address %v", val.Description.Moniker, consAddr) } if val.DelegatorShares.IsZero() && !val.IsUnbonding() { @@ -237,5 +256,5 @@ func validateGenesisStateValidators(validators []types.Validator) (err error) { addrMap[strKey] = true } - return + return nil } diff --git a/x/staking/genesis_test.go b/x/staking/genesis_test.go index d9a08e219c..64306de276 100644 --- a/x/staking/genesis_test.go +++ b/x/staking/genesis_test.go @@ -8,11 +8,13 @@ import ( "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/staking" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -43,10 +45,10 @@ func TestInitGenesis(t *testing.T) { validators := make([]types.Validator, 2) var delegations []types.Delegation - pk0, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, PKs[0]) + pk0, err := codectypes.PackAny(PKs[0]) require.NoError(t, err) - pk1, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, PKs[1]) + pk1, err := codectypes.PackAny(PKs[1]) require.NoError(t, err) // initialize the validators @@ -72,7 +74,9 @@ func TestInitGenesis(t *testing.T) { require.EqualValues(t, app.StakingKeeper.GetAllValidators(ctx), actualGenesis.Validators) // Ensure validators have addresses. - for _, val := range staking.WriteValidators(ctx, app.StakingKeeper) { + vals2, err := staking.WriteValidators(ctx, app.StakingKeeper) + require.NoError(t, err) + for _, val := range vals2 { require.NotEmpty(t, val.Address) } @@ -102,11 +106,11 @@ func TestInitGenesisLargeValidatorSet(t *testing.T) { params := app.StakingKeeper.GetParams(ctx) delegations := []types.Delegation{} validators := make([]types.Validator, size) - + var err error for i := range validators { - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), + validators[i], err = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.NewDescription(fmt.Sprintf("#%d", i), "", "", "", "")) - + require.NoError(t, err) validators[i].Status = types.Bonded tokens := sdk.TokensFromConsensusPower(1) @@ -131,7 +135,7 @@ func TestInitGenesisLargeValidatorSet(t *testing.T) { func TestValidateGenesis(t *testing.T) { genValidators1 := make([]types.Validator, 1, 5) pk := ed25519.GenPrivKey().PubKey() - genValidators1[0] = types.NewValidator(sdk.ValAddress(pk.Address()), pk, types.NewDescription("", "", "", "", "")) + genValidators1[0] = teststaking.NewValidator(t, sdk.ValAddress(pk.Address()), pk) genValidators1[0].Tokens = sdk.OneInt() genValidators1[0].DelegatorShares = sdk.OneDec() diff --git a/x/staking/handler_test.go b/x/staking/handler_test.go index 22c7733391..34a8cd78e7 100644 --- a/x/staking/handler_test.go +++ b/x/staking/handler_test.go @@ -52,7 +52,8 @@ func TestValidatorByPowerIndex(t *testing.T) { initBond := tstaking.CreateValidatorWithValPower(validatorAddr, PKs[0], initPower, true) // must end-block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + require.NoError(t, err) require.Equal(t, 1, len(updates)) // verify the self-delegation exists @@ -71,7 +72,8 @@ func TestValidatorByPowerIndex(t *testing.T) { tstaking.CreateValidatorWithValPower(validatorAddr3, PKs[2], initPower, true) // must end-block - updates = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates, err = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + require.NoError(t, err) require.Equal(t, 1, len(updates)) // slash and jail the first validator @@ -104,7 +106,7 @@ func TestValidatorByPowerIndex(t *testing.T) { res := tstaking.Undelegate(sdk.AccAddress(validatorAddr), validatorAddr, totalBond, true) var resData types.MsgUndelegateResponse - err := proto.Unmarshal(res.Data, &resData) + err = proto.Unmarshal(res.Data, &resData) require.NoError(t, err) ctx = ctx.WithBlockTime(resData.CompletionTime) @@ -130,7 +132,9 @@ func TestDuplicatesMsgCreateValidator(t *testing.T) { validator := tstaking.CheckValidator(addr1, types.Bonded, false) assert.Equal(t, addr1.String(), validator.OperatorAddress) - assert.Equal(t, pk1.(cryptotypes.IntoTmPubKey).AsTmPubKey(), validator.GetConsPubKey()) + consKey, err := validator.TmConsPubKey() + require.NoError(t, err) + assert.Equal(t, pk1.(cryptotypes.IntoTmPubKey).AsTmPubKey(), consKey) assert.Equal(t, valTokens, validator.BondedTokens()) assert.Equal(t, valTokens.ToDec(), validator.DelegatorShares) assert.Equal(t, types.Description{}, validator.Description) @@ -145,12 +149,15 @@ func TestDuplicatesMsgCreateValidator(t *testing.T) { tstaking.CreateValidator(addr2, pk2, valTokens.Int64(), true) // must end-block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + require.NoError(t, err) require.Equal(t, 1, len(updates)) validator = tstaking.CheckValidator(addr2, types.Bonded, false) assert.Equal(t, addr2.String(), validator.OperatorAddress) - assert.Equal(t, pk2.(cryptotypes.IntoTmPubKey).AsTmPubKey(), validator.GetConsPubKey()) + consPk, err := validator.TmConsPubKey() + require.NoError(t, err) + assert.Equal(t, pk2.(cryptotypes.IntoTmPubKey).AsTmPubKey(), consPk) assert.True(sdk.IntEq(t, valTokens, validator.Tokens)) assert.True(sdk.DecEq(t, valTokens.ToDec(), validator.DelegatorShares)) assert.Equal(t, types.Description{}, validator.Description) @@ -182,7 +189,8 @@ func TestLegacyValidatorDelegations(t *testing.T) { bondAmount := tstaking.CreateValidatorWithValPower(valAddr, valConsPubKey, 10, true) // must end-block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + require.NoError(t, err) require.Equal(t, 1, len(updates)) // verify the validator exists and has the correct attributes @@ -202,7 +210,7 @@ func TestLegacyValidatorDelegations(t *testing.T) { res := tstaking.Undelegate(sdk.AccAddress(valAddr), valAddr, bondAmount, true) var resData types.MsgUndelegateResponse - err := proto.Unmarshal(res.Data, &resData) + err = proto.Unmarshal(res.Data, &resData) require.NoError(t, err) ctx = ctx.WithBlockTime(resData.CompletionTime) @@ -320,7 +328,8 @@ func TestEditValidatorDecreaseMinSelfDelegation(t *testing.T) { tstaking.Handle(msgCreateValidator, true) // must end-block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + require.NoError(t, err) require.Equal(t, 1, len(updates)) // verify the self-delegation exists @@ -350,7 +359,8 @@ func TestEditValidatorIncreaseMinSelfDelegationBeyondCurrentBond(t *testing.T) { tstaking.Handle(msgCreateValidator, true) // must end-block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + require.NoError(t, err) require.Equal(t, 1, len(updates)) // verify the self-delegation exists @@ -1022,7 +1032,8 @@ func TestBondUnbondRedelegateSlashTwice(t *testing.T) { tstaking.Delegate(del, valA, valTokens.Int64()) // apply Tendermint updates - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + require.NoError(t, err) require.Equal(t, 2, len(updates)) // a block passes @@ -1044,7 +1055,8 @@ func TestBondUnbondRedelegateSlashTwice(t *testing.T) { require.Equal(t, sdk.NewDecFromInt(redAmt.Amount), delegation.Shares) // must apply validator updates - updates = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates, err = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + require.NoError(t, err) require.Equal(t, 2, len(updates)) // slash the validator by half diff --git a/x/staking/keeper/common_test.go b/x/staking/keeper/common_test.go index 065a0f52e8..1b96b4ce7d 100644 --- a/x/staking/keeper/common_test.go +++ b/x/staking/keeper/common_test.go @@ -22,22 +22,19 @@ func createTestInput() (*codec.LegacyAmino, *simapp.SimApp, sdk.Context) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - appCodec := app.AppCodec() - app.StakingKeeper = keeper.NewKeeper( - appCodec, + app.AppCodec(), app.GetKey(types.StoreKey), app.AccountKeeper, app.BankKeeper, app.GetSubspace(types.ModuleName), ) - - return codec.NewLegacyAmino(), app, ctx + return app.LegacyAmino(), app, ctx } // intended to be used with require/assert: require.True(ValEq(...)) func ValEq(t *testing.T, exp, got types.Validator) (*testing.T, bool, string, types.Validator, types.Validator) { - return t, exp.MinEqual(got), "expected:\n%v\ngot:\n%v", exp, got + return t, exp.MinEqual(&got), "expected:\n%v\ngot:\n%v", exp, got } // generateAddresses generates numAddrs of normal AccAddrs and ValAddrs diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 03450614f1..77f4cb8e2c 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -10,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -24,7 +25,7 @@ func TestDelegation(t *testing.T) { amts := []sdk.Int{sdk.NewInt(9), sdk.NewInt(8), sdk.NewInt(7)} var validators [3]types.Validator for i, amt := range amts { - validators[i] = types.NewValidator(valAddrs[i], PKs[i], types.Description{}) + validators[i] = teststaking.NewValidator(t, valAddrs[i], PKs[i]) validators[i], _ = validators[i].AddTokensFromDel(amt) } @@ -196,7 +197,7 @@ func TestUnbondDelegation(t *testing.T) { // create a validator and a delegator to that validator // note this validator starts not-bonded - validator := types.NewValidator(valAddrs[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, valAddrs[0], PKs[0]) validator, issuedShares := validator.AddTokensFromDel(startTokens) require.Equal(t, startTokens, issuedShares.RoundInt()) @@ -237,7 +238,7 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // create a validator and a delegator to that validator - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) validator, issuedShares := validator.AddTokensFromDel(startTokens) require.Equal(t, startTokens, issuedShares.RoundInt()) @@ -313,7 +314,7 @@ func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) //create a validator with a self-delegation - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) validator.MinSelfDelegation = delTokens validator, issuedShares := validator.AddTokensFromDel(delTokens) @@ -361,8 +362,7 @@ func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { require.NoError(t, err) // end block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(updates)) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) require.True(t, found) @@ -380,7 +380,7 @@ func TestUndelegateFromUnbondingValidator(t *testing.T) { addrVals := simapp.ConvertAddrsToValAddrs(addrDels) //create a validator with a self-delegation - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) validator, issuedShares := validator.AddTokensFromDel(delTokens) @@ -438,8 +438,7 @@ func TestUndelegateFromUnbondingValidator(t *testing.T) { require.NoError(t, err) // end block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(updates)) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) require.True(t, found) @@ -481,7 +480,7 @@ func TestUndelegateFromUnbondedValidator(t *testing.T) { app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // create a validator with a self-delegation - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) valTokens := sdk.TokensFromConsensusPower(10) @@ -517,8 +516,7 @@ func TestUndelegateFromUnbondedValidator(t *testing.T) { require.NoError(t, err) // end block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(updates)) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) require.True(t, found) @@ -566,7 +564,7 @@ func TestUnbondingAllDelegationFromValidator(t *testing.T) { app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) //create a validator with a self-delegation - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) valTokens := sdk.TokensFromConsensusPower(10) @@ -605,8 +603,7 @@ func TestUnbondingAllDelegationFromValidator(t *testing.T) { require.NoError(t, err) // end block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(updates)) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) // unbond all the remaining delegation _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], delTokens.ToDec()) @@ -734,7 +731,7 @@ func TestRedelegateToSameValidator(t *testing.T) { app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // create a validator with a self-delegation - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) validator, issuedShares := validator.AddTokensFromDel(valTokens) require.Equal(t, valTokens, issuedShares.RoundInt()) validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) @@ -765,7 +762,7 @@ func TestRedelegationMaxEntries(t *testing.T) { app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // create a validator with a self-delegation - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) valTokens := sdk.TokensFromConsensusPower(10) validator, issuedShares := validator.AddTokensFromDel(valTokens) require.Equal(t, valTokens, issuedShares.RoundInt()) @@ -775,7 +772,7 @@ func TestRedelegationMaxEntries(t *testing.T) { app.StakingKeeper.SetDelegation(ctx, selfDelegation) // create a second validator - validator2 := types.NewValidator(addrVals[1], PKs[1], types.Description{}) + validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) validator2, issuedShares = validator2.AddTokensFromDel(valTokens) require.Equal(t, valTokens, issuedShares.RoundInt()) @@ -823,7 +820,7 @@ func TestRedelegateSelfDelegation(t *testing.T) { app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) //create a validator with a self-delegation - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) valTokens := sdk.TokensFromConsensusPower(10) @@ -837,7 +834,7 @@ func TestRedelegateSelfDelegation(t *testing.T) { app.StakingKeeper.SetDelegation(ctx, selfDelegation) // create a second validator - validator2 := types.NewValidator(addrVals[1], PKs[1], types.Description{}) + validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) validator2, issuedShares = validator2.AddTokensFromDel(valTokens) require.Equal(t, valTokens, issuedShares.RoundInt()) validator2 = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) @@ -856,8 +853,7 @@ func TestRedelegateSelfDelegation(t *testing.T) { require.NoError(t, err) // end block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 2, len(updates)) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) require.True(t, found) @@ -882,7 +878,7 @@ func TestRedelegateFromUnbondingValidator(t *testing.T) { app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) //create a validator with a self-delegation - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) valTokens := sdk.TokensFromConsensusPower(10) @@ -903,7 +899,7 @@ func TestRedelegateFromUnbondingValidator(t *testing.T) { app.StakingKeeper.SetDelegation(ctx, delegation) // create a second validator - validator2 := types.NewValidator(addrVals[1], PKs[1], types.Description{}) + validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) validator2, issuedShares = validator2.AddTokensFromDel(valTokens) require.Equal(t, valTokens, issuedShares.RoundInt()) validator2 = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) @@ -920,8 +916,7 @@ func TestRedelegateFromUnbondingValidator(t *testing.T) { require.NoError(t, err) // end block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(updates)) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) require.True(t, found) @@ -967,7 +962,7 @@ func TestRedelegateFromUnbondedValidator(t *testing.T) { app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) //create a validator with a self-delegation - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) valTokens := sdk.TokensFromConsensusPower(10) @@ -988,7 +983,7 @@ func TestRedelegateFromUnbondedValidator(t *testing.T) { app.StakingKeeper.SetDelegation(ctx, delegation) // create a second validator - validator2 := types.NewValidator(addrVals[1], PKs[1], types.Description{}) + validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) validator2, issuedShares = validator2.AddTokensFromDel(valTokens) require.Equal(t, valTokens, issuedShares.RoundInt()) validator2 = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) @@ -1002,8 +997,7 @@ func TestRedelegateFromUnbondedValidator(t *testing.T) { require.NoError(t, err) // end block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(updates)) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) require.True(t, found) diff --git a/x/staking/keeper/grpc_query_test.go b/x/staking/keeper/grpc_query_test.go index fefa487749..e144668940 100644 --- a/x/staking/keeper/grpc_query_test.go +++ b/x/staking/keeper/grpc_query_test.go @@ -3,11 +3,13 @@ package keeper_test import ( gocontext "context" "fmt" + "testing" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -111,7 +113,7 @@ func (suite *KeeperTestSuite) TestGRPCValidator() { res, err := queryClient.Validator(gocontext.Background(), req) if tc.expPass { suite.NoError(err) - suite.Equal(validator, res.Validator) + suite.True(validator.Equal(&res.Validator)) } else { suite.Error(err) suite.Nil(res) @@ -573,7 +575,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryHistoricalInfo() { if tc.expPass { suite.NoError(err) suite.NotNil(res) - suite.Equal(&hi, res.Hist) + suite.True(hi.Equal(res.Hist)) } else { suite.Error(err) suite.Nil(res) @@ -591,12 +593,12 @@ func (suite *KeeperTestSuite) TestGRPCQueryRedelegation() { delAmount := sdk.TokensFromConsensusPower(1) _, err := app.StakingKeeper.Delegate(ctx, addrAcc1, delAmount, types.Unbonded, val1, true) suite.NoError(err) - _ = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(suite.T(), ctx, app.StakingKeeper, -1) rdAmount := sdk.TokensFromConsensusPower(1) _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc1, val1.GetOperator(), val2.GetOperator(), rdAmount.ToDec()) suite.NoError(err) - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(suite.T(), ctx, app.StakingKeeper, -1) redel, found := app.StakingKeeper.GetRedelegation(ctx, addrAcc1, val1.GetOperator(), val2.GetOperator()) suite.True(found) @@ -683,7 +685,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryValidatorUnbondingDelegations() { undelAmount := sdk.TokensFromConsensusPower(2) _, err := app.StakingKeeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), undelAmount.ToDec()) suite.NoError(err) - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(suite.T(), ctx, app.StakingKeeper, -1) var req *types.QueryValidatorUnbondingDelegationsRequest testCases := []struct { @@ -724,7 +726,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryValidatorUnbondingDelegations() { } } -func createValidators(ctx sdk.Context, app *simapp.SimApp, powers []int64) ([]sdk.AccAddress, []sdk.ValAddress, []types.Validator) { +func createValidators(t *testing.T, ctx sdk.Context, app *simapp.SimApp, powers []int64) ([]sdk.AccAddress, []sdk.ValAddress, []types.Validator) { addrs := simapp.AddTestAddrsIncremental(app, ctx, 5, sdk.NewInt(300000000)) valAddrs := simapp.ConvertAddrsToValAddrs(addrs) pks := simapp.CreateTestPubKeys(5) @@ -738,8 +740,8 @@ func createValidators(ctx sdk.Context, app *simapp.SimApp, powers []int64) ([]sd app.GetSubspace(types.ModuleName), ) - val1 := types.NewValidator(valAddrs[0], pks[0], types.Description{}) - val2 := types.NewValidator(valAddrs[1], pks[1], types.Description{}) + val1 := teststaking.NewValidator(t, valAddrs[0], pks[0]) + val2 := teststaking.NewValidator(t, valAddrs[1], pks[1]) vals := []types.Validator{val1, val2} app.StakingKeeper.SetValidator(ctx, val1) @@ -752,7 +754,7 @@ func createValidators(ctx sdk.Context, app *simapp.SimApp, powers []int64) ([]sd _, _ = app.StakingKeeper.Delegate(ctx, addrs[0], sdk.TokensFromConsensusPower(powers[0]), types.Unbonded, val1, true) _, _ = app.StakingKeeper.Delegate(ctx, addrs[1], sdk.TokensFromConsensusPower(powers[1]), types.Unbonded, val2, true) _, _ = app.StakingKeeper.Delegate(ctx, addrs[0], sdk.TokensFromConsensusPower(powers[2]), types.Unbonded, val2, true) - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) return addrs, valAddrs, vals } diff --git a/x/staking/keeper/historical_info.go b/x/staking/keeper/historical_info.go index a4fe7754da..20c5a8ce85 100644 --- a/x/staking/keeper/historical_info.go +++ b/x/staking/keeper/historical_info.go @@ -15,17 +15,14 @@ func (k Keeper) GetHistoricalInfo(ctx sdk.Context, height int64) (types.Historic return types.HistoricalInfo{}, false } - hi := types.MustUnmarshalHistoricalInfo(k.cdc, value) - - return hi, true + return types.MustUnmarshalHistoricalInfo(k.cdc, value), true } // SetHistoricalInfo sets the historical info at a given height -func (k Keeper) SetHistoricalInfo(ctx sdk.Context, height int64, hi types.HistoricalInfo) { +func (k Keeper) SetHistoricalInfo(ctx sdk.Context, height int64, hi *types.HistoricalInfo) { store := ctx.KVStore(k.storeKey) key := types.GetHistoricalInfoKey(height) - - value := types.MustMarshalHistoricalInfo(k.cdc, hi) + value := k.cdc.MustMarshalBinaryBare(hi) store.Set(key, value) } @@ -97,5 +94,5 @@ func (k Keeper) TrackHistoricalInfo(ctx sdk.Context) { historicalEntry := types.NewHistoricalInfo(ctx.BlockHeader(), lastVals) // Set latest HistoricalInfo at current height - k.SetHistoricalInfo(ctx, ctx.BlockHeight(), historicalEntry) + k.SetHistoricalInfo(ctx, ctx.BlockHeight(), &historicalEntry) } diff --git a/x/staking/keeper/historical_info_test.go b/x/staking/keeper/historical_info_test.go index 48d250a115..0ccdee9408 100644 --- a/x/staking/keeper/historical_info_test.go +++ b/x/staking/keeper/historical_info_test.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -21,12 +22,11 @@ func TestHistoricalInfo(t *testing.T) { validators := make([]types.Validator, len(addrVals)) for i, valAddr := range addrVals { - validators[i] = types.NewValidator(valAddr, PKs[i], types.Description{}) + validators[i] = teststaking.NewValidator(t, valAddr, PKs[i]) } hi := types.NewHistoricalInfo(ctx.BlockHeader(), validators) - - app.StakingKeeper.SetHistoricalInfo(ctx, 2, hi) + app.StakingKeeper.SetHistoricalInfo(ctx, 2, &hi) recv, found := app.StakingKeeper.GetHistoricalInfo(ctx, 2) require.True(t, found, "HistoricalInfo not found after set") @@ -62,13 +62,13 @@ func TestTrackHistoricalInfo(t *testing.T) { Height: 5, } valSet := []types.Validator{ - types.NewValidator(addrVals[0], PKs[0], types.Description{}), - types.NewValidator(addrVals[1], PKs[1], types.Description{}), + teststaking.NewValidator(t, addrVals[0], PKs[0]), + teststaking.NewValidator(t, addrVals[1], PKs[1]), } hi4 := types.NewHistoricalInfo(h4, valSet) hi5 := types.NewHistoricalInfo(h5, valSet) - app.StakingKeeper.SetHistoricalInfo(ctx, 4, hi4) - app.StakingKeeper.SetHistoricalInfo(ctx, 5, hi5) + app.StakingKeeper.SetHistoricalInfo(ctx, 4, &hi4) + app.StakingKeeper.SetHistoricalInfo(ctx, 5, &hi5) recv, found := app.StakingKeeper.GetHistoricalInfo(ctx, 4) require.True(t, found) require.Equal(t, hi4, recv) @@ -77,10 +77,10 @@ func TestTrackHistoricalInfo(t *testing.T) { require.Equal(t, hi5, recv) // Set last validators in keeper - val1 := types.NewValidator(addrVals[2], PKs[2], types.Description{}) + val1 := teststaking.NewValidator(t, addrVals[2], PKs[2]) app.StakingKeeper.SetValidator(ctx, val1) app.StakingKeeper.SetLastValidatorPower(ctx, val1.GetOperator(), 10) - val2 := types.NewValidator(addrVals[3], PKs[3], types.Description{}) + val2 := teststaking.NewValidator(t, addrVals[3], PKs[3]) vals := []types.Validator{val1, val2} sort.Sort(types.Validators(vals)) app.StakingKeeper.SetValidator(ctx, val2) @@ -120,8 +120,8 @@ func TestGetAllHistoricalInfo(t *testing.T) { addrVals := simapp.ConvertAddrsToValAddrs(addrDels) valSet := []types.Validator{ - types.NewValidator(addrVals[0], PKs[0], types.Description{}), - types.NewValidator(addrVals[1], PKs[1], types.Description{}), + teststaking.NewValidator(t, addrVals[0], PKs[0]), + teststaking.NewValidator(t, addrVals[1], PKs[1]), } header1 := tmproto.Header{ChainID: "HelloChain", Height: 10} @@ -135,7 +135,7 @@ func TestGetAllHistoricalInfo(t *testing.T) { expHistInfos := []types.HistoricalInfo{hist1, hist2, hist3} for i, hi := range expHistInfos { - app.StakingKeeper.SetHistoricalInfo(ctx, int64(10+i), hi) + app.StakingKeeper.SetHistoricalInfo(ctx, int64(10+i), &hi) } infos := app.StakingKeeper.GetAllHistoricalInfo(ctx) diff --git a/x/staking/keeper/keeper_test.go b/x/staking/keeper/keeper_test.go index 43b91e9ea3..0342dfea9b 100644 --- a/x/staking/keeper/keeper_test.go +++ b/x/staking/keeper/keeper_test.go @@ -35,14 +35,14 @@ func (suite *KeeperTestSuite) SetupTest() { types.RegisterQueryServer(queryHelper, querier) queryClient := types.NewQueryClient(queryHelper) - addrs, _, validators := createValidators(ctx, app, []int64{9, 8, 7}) + addrs, _, validators := createValidators(suite.T(), ctx, app, []int64{9, 8, 7}) header := tmproto.Header{ ChainID: "HelloChain", Height: 5, } hi := types.NewHistoricalInfo(header, validators) - app.StakingKeeper.SetHistoricalInfo(ctx, 5, hi) + app.StakingKeeper.SetHistoricalInfo(ctx, 5, &hi) suite.app, suite.ctx, suite.queryClient, suite.addrs, suite.vals = app, ctx, queryClient, addrs, validators } diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index f5e859f04e..472a96c485 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -67,7 +67,10 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa } } - validator := types.NewValidator(valAddr, pk, msg.Description) + validator, err := types.NewValidator(valAddr, pk, msg.Description) + if err != nil { + return nil, err + } commission := types.NewCommissionWithTime( msg.Commission.Rate, msg.Commission.MaxRate, msg.Commission.MaxChangeRate, ctx.BlockHeader().Time, diff --git a/x/staking/keeper/querier.go b/x/staking/keeper/querier.go index 2b8f0deb94..48272e2451 100644 --- a/x/staking/keeper/querier.go +++ b/x/staking/keeper/querier.go @@ -74,7 +74,7 @@ func queryValidators(ctx sdk.Context, req abci.RequestQuery, k Keeper, legacyQue } validators := k.GetAllValidators(ctx) - filteredVals := make([]types.Validator, 0, len(validators)) + filteredVals := make(types.Validators, 0, len(validators)) for _, val := range validators { if strings.EqualFold(val.GetStatus().String(), params.Status) { diff --git a/x/staking/keeper/querier_test.go b/x/staking/keeper/querier_test.go index 4e7a94f06a..0b194bd6dc 100644 --- a/x/staking/keeper/querier_test.go +++ b/x/staking/keeper/querier_test.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -26,7 +27,7 @@ func TestNewQuerier(t *testing.T) { amts := []sdk.Int{sdk.NewInt(9), sdk.NewInt(8)} var validators [2]types.Validator for i, amt := range amts { - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{}) + validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i]) validators[i], _ = validators[i].AddTokensFromDel(amt) app.StakingKeeper.SetValidator(ctx, validators[i]) app.StakingKeeper.SetValidatorByPowerIndex(ctx, validators[i]) @@ -37,7 +38,7 @@ func TestNewQuerier(t *testing.T) { Height: 5, } hi := types.NewHistoricalInfo(header, validators[:]) - app.StakingKeeper.SetHistoricalInfo(ctx, 5, hi) + app.StakingKeeper.SetHistoricalInfo(ctx, 5, &hi) query := abci.RequestQuery{ Path: "", @@ -146,7 +147,7 @@ func TestQueryValidators(t *testing.T) { status := []types.BondStatus{types.Bonded, types.Unbonded, types.Unbonding} var validators [3]types.Validator for i, amt := range amts { - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{}) + validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i]) validators[i], _ = validators[i].AddTokensFromDel(amt) validators[i] = validators[i].UpdateStatus(status[i]) } @@ -197,7 +198,7 @@ func TestQueryValidators(t *testing.T) { err = cdc.UnmarshalJSON(res, &queriedValidator) require.NoError(t, err) - require.Equal(t, validator, queriedValidator) + require.True(t, validator.Equal(&queriedValidator)) } } @@ -215,11 +216,11 @@ func TestQueryDelegation(t *testing.T) { pk1, pk2 := pubKeys[0], pubKeys[1] // Create Validators and Delegation - val1 := types.NewValidator(addrVal1, pk1, types.Description{}) + val1 := teststaking.NewValidator(t, addrVal1, pk1) app.StakingKeeper.SetValidator(ctx, val1) app.StakingKeeper.SetValidatorByPowerIndex(ctx, val1) - val2 := types.NewValidator(addrVal2, pk2, types.Description{}) + val2 := teststaking.NewValidator(t, addrVal2, pk2) app.StakingKeeper.SetValidator(ctx, val2) app.StakingKeeper.SetValidatorByPowerIndex(ctx, val2) @@ -228,7 +229,7 @@ func TestQueryDelegation(t *testing.T) { require.NoError(t, err) // apply TM updates - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) // Query Delegator bonded validators queryParams := types.NewQueryDelegatorParams(addrAcc2) @@ -245,7 +246,7 @@ func TestQueryDelegation(t *testing.T) { res, err := querier(ctx, []string{types.QueryDelegatorValidators}, query) require.NoError(t, err) - var validatorsResp []types.Validator + var validatorsResp types.Validators errRes = cdc.UnmarshalJSON(res, &validatorsResp) require.NoError(t, errRes) @@ -274,8 +275,7 @@ func TestQueryDelegation(t *testing.T) { var validator types.Validator errRes = cdc.UnmarshalJSON(res, &validator) require.NoError(t, errRes) - - require.Equal(t, delValidators[0], validator) + require.True(t, validator.Equal(&delValidators[0])) // error unknown request query.Data = bz[:len(bz)-1] @@ -461,7 +461,7 @@ func TestQueryValidatorDelegations_Pagination(t *testing.T) { valAddress := sdk.ValAddress(addrs[0]) - val1 := types.NewValidator(valAddress, pubKeys[0], types.Description{}) + val1 := teststaking.NewValidator(t, valAddress, pubKeys[0]) app.StakingKeeper.SetValidator(ctx, val1) app.StakingKeeper.SetValidatorByPowerIndex(ctx, val1) @@ -478,7 +478,7 @@ func TestQueryValidatorDelegations_Pagination(t *testing.T) { } // apply TM updates - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) for _, c := range cases { // Query Delegator bonded validators @@ -512,7 +512,7 @@ func TestQueryValidatorDelegations_Pagination(t *testing.T) { } // apply TM updates - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) for _, c := range cases { // Query Unbonding delegations with pagination. @@ -546,20 +546,20 @@ func TestQueryRedelegations(t *testing.T) { addrVal1, addrVal2 := sdk.ValAddress(addrAcc1), sdk.ValAddress(addrAcc2) // Create Validators and Delegation - val1 := types.NewValidator(addrVal1, PKs[0], types.Description{}) - val2 := types.NewValidator(addrVal2, PKs[1], types.Description{}) + val1 := teststaking.NewValidator(t, addrVal1, PKs[0]) + val2 := teststaking.NewValidator(t, addrVal2, PKs[1]) app.StakingKeeper.SetValidator(ctx, val1) app.StakingKeeper.SetValidator(ctx, val2) delAmount := sdk.TokensFromConsensusPower(100) _, err := app.StakingKeeper.Delegate(ctx, addrAcc2, delAmount, types.Unbonded, val1, true) require.NoError(t, err) - _ = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) rdAmount := sdk.TokensFromConsensusPower(20) _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator(), rdAmount.ToDec()) require.NoError(t, err) - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) redel, found := app.StakingKeeper.GetRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator()) require.True(t, found) @@ -618,20 +618,20 @@ func TestQueryUnbondingDelegation(t *testing.T) { addrVal1 := sdk.ValAddress(addrAcc1) // Create Validators and Delegation - val1 := types.NewValidator(addrVal1, PKs[0], types.Description{}) + val1 := teststaking.NewValidator(t, addrVal1, PKs[0]) app.StakingKeeper.SetValidator(ctx, val1) // delegate delAmount := sdk.TokensFromConsensusPower(100) _, err := app.StakingKeeper.Delegate(ctx, addrAcc1, delAmount, types.Unbonded, val1, true) require.NoError(t, err) - _ = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) // undelegate undelAmount := sdk.TokensFromConsensusPower(20) _, err = app.StakingKeeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), undelAmount.ToDec()) require.NoError(t, err) - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) _, found := app.StakingKeeper.GetUnbondingDelegation(ctx, addrAcc1, val1.GetOperator()) require.True(t, found) @@ -706,7 +706,7 @@ func TestQueryUnbondingDelegation(t *testing.T) { func TestQueryHistoricalInfo(t *testing.T) { cdc, app, ctx := createTestInput() - legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino()) + legacyQuerierCdc := codec.NewAminoCodec(cdc) querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino) addrs := simapp.AddTestAddrs(app, ctx, 2, sdk.TokensFromConsensusPower(10000)) @@ -714,8 +714,8 @@ func TestQueryHistoricalInfo(t *testing.T) { addrVal1, addrVal2 := sdk.ValAddress(addrAcc1), sdk.ValAddress(addrAcc2) // Create Validators and Delegation - val1 := types.NewValidator(addrVal1, PKs[0], types.Description{}) - val2 := types.NewValidator(addrVal2, PKs[1], types.Description{}) + val1 := teststaking.NewValidator(t, addrVal1, PKs[0]) + val2 := teststaking.NewValidator(t, addrVal2, PKs[1]) vals := []types.Validator{val1, val2} app.StakingKeeper.SetValidator(ctx, val1) app.StakingKeeper.SetValidator(ctx, val2) @@ -725,7 +725,7 @@ func TestQueryHistoricalInfo(t *testing.T) { Height: 5, } hi := types.NewHistoricalInfo(header, vals) - app.StakingKeeper.SetHistoricalInfo(ctx, 5, hi) + app.StakingKeeper.SetHistoricalInfo(ctx, 5, &hi) queryHistoricalParams := types.QueryHistoricalInfoRequest{Height: 4} bz, errRes := cdc.MarshalJSON(queryHistoricalParams) diff --git a/x/staking/keeper/query_utils.go b/x/staking/keeper/query_utils.go index a530a86cbe..a6f323092a 100644 --- a/x/staking/keeper/query_utils.go +++ b/x/staking/keeper/query_utils.go @@ -8,7 +8,7 @@ import ( // Return all validators that a delegator is bonded to. If maxRetrieve is supplied, the respective amount will be returned. func (k Keeper) GetDelegatorValidators( ctx sdk.Context, delegatorAddr sdk.AccAddress, maxRetrieve uint32, -) []types.Validator { +) types.Validators { validators := make([]types.Validator, maxRetrieve) store := ctx.KVStore(k.storeKey) diff --git a/x/staking/keeper/slash_test.go b/x/staking/keeper/slash_test.go index 8aaba62a25..4bee623004 100644 --- a/x/staking/keeper/slash_test.go +++ b/x/staking/keeper/slash_test.go @@ -12,6 +12,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -41,7 +42,7 @@ func bootstrapSlashTest(t *testing.T, power int64) (*simapp.SimApp, sdk.Context, app.BankKeeper.SetSupply(ctx, banktypes.NewSupply(totalSupply)) for i := int64(0); i < numVals; i++ { - validator := types.NewValidator(addrVals[i], PKs[i], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[i], PKs[i]) validator, _ = validator.AddTokensFromDel(amt) validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) @@ -170,8 +171,7 @@ func TestSlashRedelegation(t *testing.T) { require.Len(t, rd.Entries, 1) // end block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(updates)) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) // initialbalance unchanged require.Equal(t, sdk.NewInt(10), rd.Entries[0].InitialBalance) @@ -214,8 +214,7 @@ func TestSlashAtNegativeHeight(t *testing.T) { require.True(t, found) // end block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(updates), "cons addr: %v, updates: %v", []byte(consAddr), updates) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) validator, found = app.StakingKeeper.GetValidator(ctx, validator.GetOperator()) require.True(t, found) @@ -246,8 +245,7 @@ func TestSlashValidatorAtCurrentHeight(t *testing.T) { require.True(t, found) // end block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(updates), "cons addr: %v, updates: %v", []byte(consAddr), updates) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) validator, found = app.StakingKeeper.GetValidator(ctx, validator.GetOperator()) assert.True(t, found) @@ -284,8 +282,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction) // end block - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(updates)) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) // read updating unbonding delegation ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[0], addrVals[0]) @@ -379,7 +376,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { require.Equal(t, sdk.TokensFromConsensusPower(10), diffTokens) // apply TM updates - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) // read updated validator // power decreased by 1 again, validator is out of stake @@ -511,7 +508,7 @@ func TestSlashWithRedelegation(t *testing.T) { require.True(t, found) require.Len(t, rd.Entries, 1) // apply TM updates - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) // read updated validator // validator decreased to zero power, should be in unbonding period validator, _ = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) diff --git a/x/staking/keeper/test_common.go b/x/staking/keeper/test_common.go index 8ded090ffe..42e94740d3 100644 --- a/x/staking/keeper/test_common.go +++ b/x/staking/keeper/test_common.go @@ -40,21 +40,15 @@ func TestingUpdateValidator(keeper Keeper, ctx sdk.Context, validator types.Vali keeper.SetValidatorByPowerIndex(ctx, validator) - if apply { - keeper.ApplyAndReturnValidatorSetUpdates(ctx) - - validator, found := keeper.GetValidator(ctx, validator.GetOperator()) - if !found { - panic("validator expected but not found") - } - - return validator + if !apply { + ctx, _ = ctx.CacheContext() + } + _, err := keeper.ApplyAndReturnValidatorSetUpdates(ctx) + if err != nil { + panic(err) } - cachectx, _ := ctx.CacheContext() - keeper.ApplyAndReturnValidatorSetUpdates(cachectx) - - validator, found := keeper.GetValidator(cachectx, validator.GetOperator()) + validator, found := keeper.GetValidator(ctx, validator.GetOperator()) if !found { panic("validator expected but not found") } diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index 083efb6940..f06994f44f 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -24,7 +24,10 @@ func (k Keeper) BlockValidatorUpdates(ctx sdk.Context) []abci.ValidatorUpdate { // unbonded after the Endblocker (go from Bonded -> Unbonding during // ApplyAndReturnValidatorSetUpdates and then Unbonding -> Unbonded during // UnbondAllMatureValidatorQueue). - validatorUpdates := k.ApplyAndReturnValidatorSetUpdates(ctx) + validatorUpdates, err := k.ApplyAndReturnValidatorSetUpdates(ctx) + if err != nil { + panic(err) + } // unbond all mature validators from the unbonding queue k.UnbondAllMatureValidators(ctx) @@ -106,7 +109,7 @@ func (k Keeper) BlockValidatorUpdates(ctx sdk.Context) []abci.ValidatorUpdate { // CONTRACT: Only validators with non-zero power or zero-power that were bonded // at the previous block height or were removed from the validator set entirely // are returned to Tendermint. -func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []abci.ValidatorUpdate) { +func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []abci.ValidatorUpdate, err error) { maxValidators := k.GetParams(ctx).MaxValidators totalPower := sdk.ZeroInt() amtFromBondedToNotBonded, amtFromNotBondedToBonded := sdk.ZeroInt(), sdk.ZeroInt() @@ -139,10 +142,16 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab // apply the appropriate state change if necessary switch { case validator.IsUnbonded(): - validator = k.unbondedToBonded(ctx, validator) + validator, err = k.unbondedToBonded(ctx, validator) + if err != nil { + return + } amtFromNotBondedToBonded = amtFromNotBondedToBonded.Add(validator.GetTokens()) case validator.IsUnbonding(): - validator = k.unbondingToBonded(ctx, validator) + validator, err = k.unbondingToBonded(ctx, validator) + if err != nil { + return + } amtFromNotBondedToBonded = amtFromNotBondedToBonded.Add(validator.GetTokens()) case validator.IsBonded(): // no state change @@ -174,7 +183,10 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab noLongerBonded := sortNoLongerBonded(last) for _, valAddrBytes := range noLongerBonded { validator := k.mustGetValidator(ctx, sdk.ValAddress(valAddrBytes)) - validator = k.bondedToUnbonding(ctx, validator) + validator, err = k.bondedToUnbonding(ctx, validator) + if err != nil { + return + } amtFromBondedToNotBonded = amtFromBondedToNotBonded.Add(validator.GetTokens()) k.DeleteLastValidatorPower(ctx, validator.GetOperator()) updates = append(updates, validator.ABCIValidatorUpdateZero()) @@ -200,12 +212,12 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab k.SetLastTotalPower(ctx, totalPower) } - return updates + return updates, err } // Validator state transitions -func (k Keeper) bondedToUnbonding(ctx sdk.Context, validator types.Validator) types.Validator { +func (k Keeper) bondedToUnbonding(ctx sdk.Context, validator types.Validator) (types.Validator, error) { if !validator.IsBonded() { panic(fmt.Sprintf("bad state transition bondedToUnbonding, validator: %v\n", validator)) } @@ -213,7 +225,7 @@ func (k Keeper) bondedToUnbonding(ctx sdk.Context, validator types.Validator) ty return k.beginUnbondingValidator(ctx, validator) } -func (k Keeper) unbondingToBonded(ctx sdk.Context, validator types.Validator) types.Validator { +func (k Keeper) unbondingToBonded(ctx sdk.Context, validator types.Validator) (types.Validator, error) { if !validator.IsUnbonding() { panic(fmt.Sprintf("bad state transition unbondingToBonded, validator: %v\n", validator)) } @@ -221,7 +233,7 @@ func (k Keeper) unbondingToBonded(ctx sdk.Context, validator types.Validator) ty return k.bondValidator(ctx, validator) } -func (k Keeper) unbondedToBonded(ctx sdk.Context, validator types.Validator) types.Validator { +func (k Keeper) unbondedToBonded(ctx sdk.Context, validator types.Validator) (types.Validator, error) { if !validator.IsUnbonded() { panic(fmt.Sprintf("bad state transition unbondedToBonded, validator: %v\n", validator)) } @@ -229,7 +241,7 @@ func (k Keeper) unbondedToBonded(ctx sdk.Context, validator types.Validator) typ return k.bondValidator(ctx, validator) } -// switches a validator from unbonding state to unbonded state +// UnbondingToUnbonded switches a validator from unbonding state to unbonded state func (k Keeper) UnbondingToUnbonded(ctx sdk.Context, validator types.Validator) types.Validator { if !validator.IsUnbonding() { panic(fmt.Sprintf("bad state transition unbondingToBonded, validator: %v\n", validator)) @@ -261,7 +273,7 @@ func (k Keeper) unjailValidator(ctx sdk.Context, validator types.Validator) { } // perform all the store operations for when a validator status becomes bonded -func (k Keeper) bondValidator(ctx sdk.Context, validator types.Validator) types.Validator { +func (k Keeper) bondValidator(ctx sdk.Context, validator types.Validator) (types.Validator, error) { // delete the validator by power index, as the key will change k.DeleteValidatorByPowerIndex(ctx, validator) @@ -275,13 +287,17 @@ func (k Keeper) bondValidator(ctx sdk.Context, validator types.Validator) types. k.DeleteValidatorQueue(ctx, validator) // trigger hook - k.AfterValidatorBonded(ctx, validator.GetConsAddr(), validator.GetOperator()) + consAddr, err := validator.GetConsAddr() + if err != nil { + return validator, err + } + k.AfterValidatorBonded(ctx, consAddr, validator.GetOperator()) - return validator + return validator, err } // perform all the store operations for when a validator begins unbonding -func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validator) types.Validator { +func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validator) (types.Validator, error) { params := k.GetParams(ctx) // delete the validator by power index, as the key will change @@ -306,9 +322,13 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat k.InsertUnbondingValidatorQueue(ctx, validator) // trigger hook - k.AfterValidatorBeginUnbonding(ctx, validator.GetConsAddr(), validator.GetOperator()) + consAddr, err := validator.GetConsAddr() + if err != nil { + return validator, err + } + k.AfterValidatorBeginUnbonding(ctx, consAddr, validator.GetOperator()) - return validator + return validator, nil } // perform all the store operations for when a validator status becomes unbonded diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index 21353585ed..edb00ddba5 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -95,14 +95,19 @@ func (k Keeper) mustGetValidatorByConsAddr(ctx sdk.Context, consAddr sdk.ConsAdd // set the main record holding validator details func (k Keeper) SetValidator(ctx sdk.Context, validator types.Validator) { store := ctx.KVStore(k.storeKey) - bz := types.MustMarshalValidator(k.cdc, validator) + bz := types.MustMarshalValidator(k.cdc, &validator) store.Set(types.GetValidatorKey(validator.GetOperator()), bz) } // validator index -func (k Keeper) SetValidatorByConsAddr(ctx sdk.Context, validator types.Validator) { +func (k Keeper) SetValidatorByConsAddr(ctx sdk.Context, validator types.Validator) error { + consPk, err := validator.GetConsAddr() + if err != nil { + return err + } store := ctx.KVStore(k.storeKey) - store.Set(types.GetValidatorByConsAddrKey(validator.GetConsAddr()), validator.GetOperator()) + store.Set(types.GetValidatorByConsAddrKey(consPk), validator.GetOperator()) + return nil } // validator index @@ -180,6 +185,7 @@ func (k Keeper) UpdateValidatorCommission(ctx sdk.Context, // remove the validator record and associated indexes // except for the bonded validator index which is only handled in ApplyAndReturnTendermintUpdates +// TODO, this function panics, and it's not good. func (k Keeper) RemoveValidator(ctx sdk.Context, address sdk.ValAddress) { // first retrieve the old validator record validator, found := k.GetValidator(ctx, address) @@ -195,7 +201,10 @@ func (k Keeper) RemoveValidator(ctx sdk.Context, address sdk.ValAddress) { panic("attempting to remove a validator which still contains tokens") } - valConsAddr := validator.GetConsAddr() + valConsAddr, err := validator.GetConsAddr() + if err != nil { + panic(err) + } // delete the old validator record store := ctx.KVStore(k.storeKey) diff --git a/x/staking/keeper/validator_test.go b/x/staking/keeper/validator_test.go index 26e894e27c..c28b6db358 100644 --- a/x/staking/keeper/validator_test.go +++ b/x/staking/keeper/validator_test.go @@ -7,15 +7,24 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/crypto" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" "github.com/cosmos/cosmos-sdk/x/staking/types" ) +func newMonikerValidator(t *testing.T, operator sdk.ValAddress, pubKey crypto.PubKey, moniker string) types.Validator { + v, err := types.NewValidator(operator, pubKey, types.Description{Moniker: moniker}) + require.NoError(t, err) + return v +} + func bootstrapValidatorTest(t *testing.T, power int64, numAddrs int) (*simapp.SimApp, sdk.Context, []sdk.AccAddress, []sdk.ValAddress) { _, app, ctx := createTestInput() @@ -34,6 +43,18 @@ func bootstrapValidatorTest(t *testing.T, power int64, numAddrs int) (*simapp.Si return app, ctx, addrDels, addrVals } +func initValidators(t *testing.T, power int64, numAddrs int, powers []int64) (*simapp.SimApp, sdk.Context, []sdk.AccAddress, []sdk.ValAddress, []types.Validator) { + app, ctx, addrs, valAddrs := bootstrapValidatorTest(t, 1000, 20) + + vs := make([]types.Validator, len(powers)) + for i, power := range powers { + vs[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i]) + tokens := sdk.TokensFromConsensusPower(power) + vs[i], _ = vs[i].AddTokensFromDel(tokens) + } + return app, ctx, addrs, valAddrs, vs +} + func TestSetValidator(t *testing.T) { app, ctx, _, _ := bootstrapValidatorTest(t, 10, 100) @@ -42,7 +63,7 @@ func TestSetValidator(t *testing.T) { valTokens := sdk.TokensFromConsensusPower(10) // test how the validator is set from a purely unbonbed pool - validator := types.NewValidator(valAddr, valPubKey, types.Description{}) + validator := teststaking.NewValidator(t, valAddr, valPubKey) validator, _ = validator.AddTokensFromDel(valTokens) require.Equal(t, types.Unbonded, validator.Status) assert.Equal(t, valTokens, validator.Tokens) @@ -51,10 +72,9 @@ func TestSetValidator(t *testing.T) { app.StakingKeeper.SetValidatorByPowerIndex(ctx, validator) // ensure update - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates := applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) validator, found := app.StakingKeeper.GetValidator(ctx, valAddr) require.True(t, found) - require.Equal(t, 1, len(updates)) require.Equal(t, validator.ABCIValidatorUpdate(), updates[0]) // after the save the validator should be bonded @@ -104,7 +124,7 @@ func TestUpdateValidatorByPowerIndex(t *testing.T) { app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // add a validator - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) validator, delSharesCreated := validator.AddTokensFromDel(sdk.TokensFromConsensusPower(100)) require.Equal(t, types.Unbonded, validator.Status) require.Equal(t, sdk.TokensFromConsensusPower(100), validator.Tokens) @@ -158,7 +178,7 @@ func TestUpdateBondedValidatorsDecreaseCliff(t *testing.T) { validators := make([]types.Validator, numVals) for i := 0; i < len(validators); i++ { moniker := fmt.Sprintf("val#%d", int64(i)) - val := types.NewValidator(valAddrs[i], PKs[i], types.Description{Moniker: moniker}) + val := newMonikerValidator(t, valAddrs[i], PKs[i], moniker) delTokens := sdk.TokensFromConsensusPower(int64((i + 1) * 10)) val, _ = val.AddTokensFromDel(delTokens) @@ -199,7 +219,7 @@ func TestSlashToZeroPowerRemoved(t *testing.T) { app, ctx, _, addrVals := bootstrapValidatorTest(t, 100, 20) // add a validator - validator := types.NewValidator(addrVals[0], PKs[0], types.Description{}) + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) valTokens := sdk.TokensFromConsensusPower(100) bondedPool := app.StakingKeeper.GetBondedPool(ctx) @@ -219,7 +239,7 @@ func TestSlashToZeroPowerRemoved(t *testing.T) { // slash the validator by 100% app.StakingKeeper.Slash(ctx, sdk.ConsAddress(PKs[0].Address()), 0, 100, sdk.OneDec()) // apply TM updates - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) // validator should be unbonding validator, _ = app.StakingKeeper.GetValidator(ctx, addrVals[0]) require.Equal(t, validator.GetStatus(), types.Unbonding) @@ -233,7 +253,7 @@ func TestValidatorBasics(t *testing.T) { var validators [3]types.Validator powers := []int64{9, 8, 7} for i, power := range powers { - validators[i] = types.NewValidator(addrVals[i], PKs[i], types.Description{}) + validators[i] = teststaking.NewValidator(t, addrVals[i], PKs[i]) validators[i].Status = types.Unbonded validators[i].Tokens = sdk.ZeroInt() tokens := sdk.TokensFromConsensusPower(power) @@ -338,7 +358,7 @@ func TestGetValidatorSortingUnmixed(t *testing.T) { n := len(amts) var validators [5]types.Validator for i, amt := range amts { - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{}) + validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i]) validators[i].Status = types.Bonded validators[i].Tokens = sdk.NewInt(amt) validators[i].DelegatorShares = sdk.NewDec(amt) @@ -434,7 +454,7 @@ func TestGetValidatorSortingMixed(t *testing.T) { var validators [5]types.Validator for i, amt := range amts { - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{}) + validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i]) validators[i].DelegatorShares = sdk.NewDec(amt) validators[i].Status = types.Bonded validators[i].Tokens = sdk.NewInt(amt) @@ -482,7 +502,7 @@ func TestGetValidatorsEdgeCases(t *testing.T) { var validators [4]types.Validator for i, power := range powers { moniker := fmt.Sprintf("val#%d", int64(i)) - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{Moniker: moniker}) + validators[i] = newMonikerValidator(t, sdk.ValAddress(addrs[i]), PKs[i], moniker) tokens := sdk.TokensFromConsensusPower(power) validators[i], _ = validators[i].AddTokensFromDel(tokens) @@ -596,9 +616,9 @@ func TestValidatorBondHeight(t *testing.T) { // initialize some validators into the state var validators [3]types.Validator - validators[0] = types.NewValidator(sdk.ValAddress(PKs[0].Address().Bytes()), PKs[0], types.Description{}) - validators[1] = types.NewValidator(sdk.ValAddress(addrs[1]), PKs[1], types.Description{}) - validators[2] = types.NewValidator(sdk.ValAddress(addrs[2]), PKs[2], types.Description{}) + validators[0] = teststaking.NewValidator(t, sdk.ValAddress(PKs[0].Address().Bytes()), PKs[0]) + validators[1] = teststaking.NewValidator(t, sdk.ValAddress(addrs[1]), PKs[1]) + validators[2] = teststaking.NewValidator(t, sdk.ValAddress(addrs[2]), PKs[2]) tokens0 := sdk.TokensFromConsensusPower(200) tokens1 := sdk.TokensFromConsensusPower(100) @@ -644,7 +664,7 @@ func TestFullValidatorSetPowerChange(t *testing.T) { powers := []int64{0, 100, 400, 400, 200} var validators [5]types.Validator for i, power := range powers { - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{}) + validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i]) tokens := sdk.TokensFromConsensusPower(power) validators[i], _ = validators[i].AddTokensFromDel(tokens) keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[i], true) @@ -684,21 +704,20 @@ func TestApplyAndReturnValidatorSetUpdatesAllNone(t *testing.T) { valPubKey := PKs[i+1] valAddr := sdk.ValAddress(valPubKey.Address().Bytes()) - validators[i] = types.NewValidator(valAddr, valPubKey, types.Description{}) + validators[i] = teststaking.NewValidator(t, valAddr, valPubKey) tokens := sdk.TokensFromConsensusPower(power) validators[i], _ = validators[i].AddTokensFromDel(tokens) } // test from nothing to something // tendermintUpdate set: {} -> {c1, c3} - require.Equal(t, 0, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 0) app.StakingKeeper.SetValidator(ctx, validators[0]) app.StakingKeeper.SetValidatorByPowerIndex(ctx, validators[0]) app.StakingKeeper.SetValidator(ctx, validators[1]) app.StakingKeeper.SetValidatorByPowerIndex(ctx, validators[1]) - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - assert.Equal(t, 2, len(updates)) + updates := applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) validators[0], _ = app.StakingKeeper.GetValidator(ctx, validators[0].GetOperator()) validators[1], _ = app.StakingKeeper.GetValidator(ctx, validators[1].GetOperator()) assert.Equal(t, validators[0].ABCIValidatorUpdate(), updates[1]) @@ -711,7 +730,7 @@ func TestApplyAndReturnValidatorSetUpdatesIdentical(t *testing.T) { powers := []int64{10, 20} var validators [2]types.Validator for i, power := range powers { - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{}) + validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i]) tokens := sdk.TokensFromConsensusPower(power) validators[i], _ = validators[i].AddTokensFromDel(tokens) @@ -719,13 +738,13 @@ func TestApplyAndReturnValidatorSetUpdatesIdentical(t *testing.T) { } validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], false) validators[1] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[1], false) - require.Equal(t, 2, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) // test identical, // tendermintUpdate set: {} -> {} validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], false) validators[1] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[1], false) - require.Equal(t, 0, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 0) } func TestApplyAndReturnValidatorSetUpdatesSingleValueChange(t *testing.T) { @@ -734,8 +753,7 @@ func TestApplyAndReturnValidatorSetUpdatesSingleValueChange(t *testing.T) { powers := []int64{10, 20} var validators [2]types.Validator for i, power := range powers { - - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{}) + validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i]) tokens := sdk.TokensFromConsensusPower(power) validators[i], _ = validators[i].AddTokensFromDel(tokens) @@ -743,7 +761,7 @@ func TestApplyAndReturnValidatorSetUpdatesSingleValueChange(t *testing.T) { } validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], false) validators[1] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[1], false) - require.Equal(t, 2, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) // test single value change // tendermintUpdate set: {} -> {c1'} @@ -751,28 +769,18 @@ func TestApplyAndReturnValidatorSetUpdatesSingleValueChange(t *testing.T) { validators[0].Tokens = sdk.TokensFromConsensusPower(600) validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], false) - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - - require.Equal(t, 1, len(updates)) + updates := applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) require.Equal(t, validators[0].ABCIValidatorUpdate(), updates[0]) } func TestApplyAndReturnValidatorSetUpdatesMultipleValueChange(t *testing.T) { - app, ctx, addrs, _ := bootstrapValidatorTest(t, 1000, 20) - powers := []int64{10, 20} - var validators [2]types.Validator - for i, power := range powers { + // TODO: use it in other places + app, ctx, _, _, validators := initValidators(t, 1000, 20, powers) - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{}) - - tokens := sdk.TokensFromConsensusPower(power) - validators[i], _ = validators[i].AddTokensFromDel(tokens) - - } validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], false) validators[1] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[1], false) - require.Equal(t, 2, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) // test multiple value change // tendermintUpdate set: {c1, c3} -> {c1', c3'} @@ -783,55 +791,41 @@ func TestApplyAndReturnValidatorSetUpdatesMultipleValueChange(t *testing.T) { validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], false) validators[1] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[1], false) - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 2, len(updates)) + updates := applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) require.Equal(t, validators[0].ABCIValidatorUpdate(), updates[0]) require.Equal(t, validators[1].ABCIValidatorUpdate(), updates[1]) } func TestApplyAndReturnValidatorSetUpdatesInserted(t *testing.T) { - app, ctx, addrs, _ := bootstrapValidatorTest(t, 1000, 20) - powers := []int64{10, 20, 5, 15, 25} - var validators [5]types.Validator - for i, power := range powers { - - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{}) - - tokens := sdk.TokensFromConsensusPower(power) - validators[i], _ = validators[i].AddTokensFromDel(tokens) - - } + app, ctx, _, _, validators := initValidators(t, 1000, 20, powers) validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], false) validators[1] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[1], false) - require.Equal(t, 2, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) // test validtor added at the beginning // tendermintUpdate set: {} -> {c0} app.StakingKeeper.SetValidator(ctx, validators[2]) app.StakingKeeper.SetValidatorByPowerIndex(ctx, validators[2]) - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates := applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) validators[2], _ = app.StakingKeeper.GetValidator(ctx, validators[2].GetOperator()) - require.Equal(t, 1, len(updates)) require.Equal(t, validators[2].ABCIValidatorUpdate(), updates[0]) // test validtor added at the beginning // tendermintUpdate set: {} -> {c0} app.StakingKeeper.SetValidator(ctx, validators[3]) app.StakingKeeper.SetValidatorByPowerIndex(ctx, validators[3]) - updates = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates = applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) validators[3], _ = app.StakingKeeper.GetValidator(ctx, validators[3].GetOperator()) - require.Equal(t, 1, len(updates)) require.Equal(t, validators[3].ABCIValidatorUpdate(), updates[0]) // test validtor added at the end // tendermintUpdate set: {} -> {c0} app.StakingKeeper.SetValidator(ctx, validators[4]) app.StakingKeeper.SetValidatorByPowerIndex(ctx, validators[4]) - updates = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates = applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) validators[4], _ = app.StakingKeeper.GetValidator(ctx, validators[4].GetOperator()) - require.Equal(t, 1, len(updates)) require.Equal(t, validators[4].ABCIValidatorUpdate(), updates[0]) } @@ -844,34 +838,29 @@ func TestApplyAndReturnValidatorSetUpdatesWithCliffValidator(t *testing.T) { powers := []int64{10, 20, 5} var validators [5]types.Validator for i, power := range powers { - - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{}) - + validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i]) tokens := sdk.TokensFromConsensusPower(power) validators[i], _ = validators[i].AddTokensFromDel(tokens) - } validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], false) validators[1] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[1], false) - require.Equal(t, 2, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) // test validator added at the end but not inserted in the valset // tendermintUpdate set: {} -> {} keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[2], false) - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 0, len(updates)) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 0) // test validator change its power and become a gotValidator (pushing out an existing) // tendermintUpdate set: {} -> {c0, c4} - require.Equal(t, 0, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 0) tokens := sdk.TokensFromConsensusPower(10) validators[2], _ = validators[2].AddTokensFromDel(tokens) app.StakingKeeper.SetValidator(ctx, validators[2]) app.StakingKeeper.SetValidatorByPowerIndex(ctx, validators[2]) - updates = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates := applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) validators[2], _ = app.StakingKeeper.GetValidator(ctx, validators[2].GetOperator()) - require.Equal(t, 2, len(updates), "%v", updates) require.Equal(t, validators[0].ABCIValidatorUpdateZero(), updates[1]) require.Equal(t, validators[2].ABCIValidatorUpdate(), updates[0]) } @@ -882,16 +871,13 @@ func TestApplyAndReturnValidatorSetUpdatesPowerDecrease(t *testing.T) { powers := []int64{100, 100} var validators [2]types.Validator for i, power := range powers { - - validators[i] = types.NewValidator(sdk.ValAddress(addrs[i]), PKs[i], types.Description{}) - + validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i]) tokens := sdk.TokensFromConsensusPower(power) validators[i], _ = validators[i].AddTokensFromDel(tokens) - } validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], false) validators[1] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[1], false) - require.Equal(t, 2, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) // check initial power require.Equal(t, int64(100), validators[0].GetConsensusPower()) @@ -911,8 +897,7 @@ func TestApplyAndReturnValidatorSetUpdatesPowerDecrease(t *testing.T) { require.Equal(t, int64(70), validators[1].GetConsensusPower()) // Tendermint updates should reflect power change - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 2, len(updates)) + updates := applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) require.Equal(t, validators[0].ABCIValidatorUpdate(), updates[0]) require.Equal(t, validators[1].ABCIValidatorUpdate(), updates[1]) } @@ -929,11 +914,10 @@ func TestApplyAndReturnValidatorSetUpdatesNewValidator(t *testing.T) { // initialize some validators into the state for i, power := range powers { - valPubKey := PKs[i+1] valAddr := sdk.ValAddress(valPubKey.Address().Bytes()) - validators[i] = types.NewValidator(valAddr, valPubKey, types.Description{}) + validators[i] = teststaking.NewValidator(t, valAddr, valPubKey) tokens := sdk.TokensFromConsensusPower(power) validators[i], _ = validators[i].AddTokensFromDel(tokens) @@ -942,14 +926,13 @@ func TestApplyAndReturnValidatorSetUpdatesNewValidator(t *testing.T) { } // verify initial Tendermint updates are correct - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, len(validators), len(updates)) + updates := applyValidatorSetUpdates(t, ctx, app.StakingKeeper, len(validators)) validators[0], _ = app.StakingKeeper.GetValidator(ctx, validators[0].GetOperator()) validators[1], _ = app.StakingKeeper.GetValidator(ctx, validators[1].GetOperator()) require.Equal(t, validators[0].ABCIValidatorUpdate(), updates[0]) require.Equal(t, validators[1].ABCIValidatorUpdate(), updates[1]) - require.Equal(t, 0, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 0) // update initial validator set for i, power := range powers { @@ -968,7 +951,7 @@ func TestApplyAndReturnValidatorSetUpdatesNewValidator(t *testing.T) { valAddr := sdk.ValAddress(valPubKey.Address().Bytes()) amt := sdk.NewInt(100) - validator := types.NewValidator(valAddr, valPubKey, types.Description{}) + validator := teststaking.NewValidator(t, valAddr, valPubKey) validator, _ = validator.AddTokensFromDel(amt) app.StakingKeeper.SetValidator(ctx, validator) @@ -981,18 +964,17 @@ func TestApplyAndReturnValidatorSetUpdatesNewValidator(t *testing.T) { valPubKey = PKs[len(validators)+2] valAddr = sdk.ValAddress(valPubKey.Address().Bytes()) - validator = types.NewValidator(valAddr, valPubKey, types.Description{}) + validator = teststaking.NewValidator(t, valAddr, valPubKey) tokens := sdk.TokensFromConsensusPower(500) validator, _ = validator.AddTokensFromDel(tokens) app.StakingKeeper.SetValidator(ctx, validator) app.StakingKeeper.SetValidatorByPowerIndex(ctx, validator) // verify initial Tendermint updates are correct - updates = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) + updates = applyValidatorSetUpdates(t, ctx, app.StakingKeeper, len(validators)+1) validator, _ = app.StakingKeeper.GetValidator(ctx, validator.GetOperator()) validators[0], _ = app.StakingKeeper.GetValidator(ctx, validators[0].GetOperator()) validators[1], _ = app.StakingKeeper.GetValidator(ctx, validators[1].GetOperator()) - require.Equal(t, len(validators)+1, len(updates)) require.Equal(t, validator.ABCIValidatorUpdate(), updates[0]) require.Equal(t, validators[0].ABCIValidatorUpdate(), updates[1]) require.Equal(t, validators[1].ABCIValidatorUpdate(), updates[2]) @@ -1014,7 +996,7 @@ func TestApplyAndReturnValidatorSetUpdatesBondTransition(t *testing.T) { valPubKey := PKs[i+1] valAddr := sdk.ValAddress(valPubKey.Address().Bytes()) - validators[i] = types.NewValidator(valAddr, valPubKey, types.Description{Moniker: moniker}) + validators[i] = newMonikerValidator(t, valAddr, valPubKey, moniker) tokens := sdk.TokensFromConsensusPower(power) validators[i], _ = validators[i].AddTokensFromDel(tokens) app.StakingKeeper.SetValidator(ctx, validators[i]) @@ -1022,14 +1004,13 @@ func TestApplyAndReturnValidatorSetUpdatesBondTransition(t *testing.T) { } // verify initial Tendermint updates are correct - updates := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 2, len(updates)) + updates := applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) validators[2], _ = app.StakingKeeper.GetValidator(ctx, validators[2].GetOperator()) validators[1], _ = app.StakingKeeper.GetValidator(ctx, validators[1].GetOperator()) require.Equal(t, validators[2].ABCIValidatorUpdate(), updates[0]) require.Equal(t, validators[1].ABCIValidatorUpdate(), updates[1]) - require.Equal(t, 0, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 0) // delegate to validator with lowest power but not enough to bond ctx = ctx.WithBlockHeight(1) @@ -1045,7 +1026,7 @@ func TestApplyAndReturnValidatorSetUpdatesBondTransition(t *testing.T) { app.StakingKeeper.SetValidatorByPowerIndex(ctx, validators[0]) // verify initial Tendermint updates are correct - require.Equal(t, 0, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 0) // create a series of events that will bond and unbond the validator with // lowest power in a single block context (height) @@ -1058,8 +1039,7 @@ func TestApplyAndReturnValidatorSetUpdatesBondTransition(t *testing.T) { validators[0], _ = validators[0].RemoveDelShares(validators[0].DelegatorShares) app.StakingKeeper.SetValidator(ctx, validators[0]) app.StakingKeeper.SetValidatorByPowerIndex(ctx, validators[0]) - updates = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 0, len(updates)) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 0) app.StakingKeeper.DeleteValidatorByPowerIndex(ctx, validators[1]) tokens = sdk.TokensFromConsensusPower(250) @@ -1068,11 +1048,10 @@ func TestApplyAndReturnValidatorSetUpdatesBondTransition(t *testing.T) { app.StakingKeeper.SetValidatorByPowerIndex(ctx, validators[1]) // verify initial Tendermint updates are correct - updates = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(updates)) + updates = applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) require.Equal(t, validators[1].ABCIValidatorUpdate(), updates[0]) - require.Equal(t, 0, len(app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx))) + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 0) } func TestUpdateValidatorCommission(t *testing.T) { @@ -1085,8 +1064,8 @@ func TestUpdateValidatorCommission(t *testing.T) { ) commission2 := types.NewCommission(sdk.NewDecWithPrec(1, 1), sdk.NewDecWithPrec(3, 1), sdk.NewDecWithPrec(1, 1)) - val1 := types.NewValidator(addrVals[0], PKs[0], types.Description{}) - val2 := types.NewValidator(addrVals[1], PKs[1], types.Description{}) + val1 := teststaking.NewValidator(t, addrVals[0], PKs[0]) + val2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) val1, _ = val1.SetInitialCommission(commission1) val2, _ = val2.SetInitialCommission(commission2) @@ -1131,3 +1110,12 @@ func TestUpdateValidatorCommission(t *testing.T) { } } } + +func applyValidatorSetUpdates(t *testing.T, ctx sdk.Context, k keeper.Keeper, expectedUpdatesLen int) []abci.ValidatorUpdate { + updates, err := k.ApplyAndReturnValidatorSetUpdates(ctx) + require.NoError(t, err) + if expectedUpdatesLen >= 0 { + require.Equal(t, expectedUpdatesLen, len(updates), "%v", updates) + } + return updates +} diff --git a/x/staking/legacy/v040/migrate.go b/x/staking/legacy/v040/migrate.go index 2749c99d9c..689e5a6dae 100644 --- a/x/staking/legacy/v040/migrate.go +++ b/x/staking/legacy/v040/migrate.go @@ -3,7 +3,7 @@ package v040 import ( "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" v034staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v034" v038staking "github.com/cosmos/cosmos-sdk/x/staking/legacy/v038" v040staking "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -42,9 +42,13 @@ func Migrate(stakingState v038staking.GenesisState) *v040staking.GenesisState { newValidators := make([]v040staking.Validator, len(stakingState.Validators)) for i, oldValidator := range stakingState.Validators { + pkAny, err := codectypes.PackAny(oldValidator.ConsPubKey) + if err != nil { + panic(fmt.Sprintf("Can't pack validator consensus PK as Any: %s", err)) + } newValidators[i] = v040staking.Validator{ OperatorAddress: oldValidator.OperatorAddress.String(), - ConsensusPubkey: sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, oldValidator.ConsPubKey), + ConsensusPubkey: pkAny, Jailed: oldValidator.Jailed, Status: migrateBondStatus(oldValidator.Status), Tokens: oldValidator.Tokens, diff --git a/x/staking/legacy/v040/migrate_test.go b/x/staking/legacy/v040/migrate_test.go index 626864a8ec..f54fec0e94 100644 --- a/x/staking/legacy/v040/migrate_test.go +++ b/x/staking/legacy/v040/migrate_test.go @@ -43,7 +43,7 @@ func TestMigrate(t *testing.T) { require.NoError(t, err) // Make sure about: - // - consensus_pubkey: should be bech32 pubkey + // - consensus_pubkey: should be an any // - validator's status should be 1 (new unbonded) expected := `{ "delegations": [], @@ -69,7 +69,10 @@ func TestMigrate(t *testing.T) { }, "update_time": "0001-01-01T00:00:00Z" }, - "consensus_pubkey": "cosmosvalconspub1zcjduepq9ymett3nlv6fytn7lqxzd3q3ckvd79eqlcf3wkhgamcl4rzghesq83ecpx", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "KTeVrjP7NJIufvgMJsQRxZjfFyD+Exda6O7x+oxIvmA=" + }, "delegator_shares": "0", "description": { "details": "", diff --git a/x/staking/simulation/decoder_test.go b/x/staking/simulation/decoder_test.go index dc5ddaf216..60210fa89b 100644 --- a/x/staking/simulation/decoder_test.go +++ b/x/staking/simulation/decoder_test.go @@ -37,7 +37,8 @@ func TestDecodeStore(t *testing.T) { bondTime := time.Now().UTC() - val := types.NewValidator(valAddr1, delPk1, types.NewDescription("test", "test", "test", "test", "test")) + val, err := types.NewValidator(valAddr1, delPk1, types.NewDescription("test", "test", "test", "test", "test")) + require.NoError(t, err) del := types.NewDelegation(delAddr1, valAddr1, sdk.OneDec()) ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, sdk.OneInt()) red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, sdk.OneInt(), sdk.OneDec()) diff --git a/x/staking/simulation/genesis.go b/x/staking/simulation/genesis.go index e4ed7d3483..0c33fa9ee2 100644 --- a/x/staking/simulation/genesis.go +++ b/x/staking/simulation/genesis.go @@ -84,7 +84,10 @@ func RandomizedGenState(simState *module.SimulationState) { simulation.RandomDecAmount(simState.Rand, maxCommission), ) - validator := types.NewValidator(valAddr, simState.Accounts[i].ConsKey.PubKey(), types.Description{}) + validator, err := types.NewValidator(valAddr, simState.Accounts[i].ConsKey.PubKey(), types.Description{}) + if err != nil { + panic(err) + } validator.Tokens = sdk.NewInt(simState.InitialStake) validator.DelegatorShares = sdk.NewDec(simState.InitialStake) validator.Commission = commission @@ -97,7 +100,7 @@ func RandomizedGenState(simState *module.SimulationState) { stakingGenesis := types.NewGenesisState(params, validators, delegations) - bz, err := json.MarshalIndent(&stakingGenesis, "", " ") + bz, err := json.MarshalIndent(&stakingGenesis.Params, "", " ") if err != nil { panic(err) } diff --git a/x/staking/simulation/genesis_test.go b/x/staking/simulation/genesis_test.go index ace2f0acb5..62926ba1f5 100644 --- a/x/staking/simulation/genesis_test.go +++ b/x/staking/simulation/genesis_test.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/staking/simulation" @@ -19,6 +20,7 @@ import ( // Abonormal scenarios are not tested here. func TestRandomizedGenState(t *testing.T) { interfaceRegistry := codectypes.NewInterfaceRegistry() + cryptocodec.RegisterInterfaces(interfaceRegistry) cdc := codec.NewProtoCodec(interfaceRegistry) s := rand.NewSource(1) @@ -53,7 +55,7 @@ func TestRandomizedGenState(t *testing.T) { require.Equal(t, "1000.000000000000000000", stakingGenesis.Delegations[0].Shares.String()) // check validators require.Equal(t, "cosmosvaloper1ghekyjucln7y67ntx7cf27m9dpuxxemnsvnaes", stakingGenesis.Validators[2].GetOperator().String()) - require.Equal(t, "cosmosvalconspub1zcjduepq280tm686ma80cva9z620dmknd9a858pd2zmq9ackfenfllecjxds0hg9n7", stakingGenesis.Validators[2].ConsensusPubkey) + require.Equal(t, []byte{0xa, 0x20, 0x51, 0xde, 0xbd, 0xe8, 0xfa, 0xdf, 0x4e, 0xfc, 0x33, 0xa5, 0x16, 0x94, 0xf6, 0xee, 0xd3, 0x69, 0x7a, 0x7a, 0x1c, 0x2d, 0x50, 0xb6, 0x2, 0xf7, 0x16, 0x4e, 0x66, 0x9f, 0xff, 0x38, 0x91, 0x9b}, stakingGenesis.Validators[2].ConsensusPubkey.Value) require.Equal(t, false, stakingGenesis.Validators[2].Jailed) require.Equal(t, "BOND_STATUS_UNBONDED", stakingGenesis.Validators[2].Status.String()) require.Equal(t, "1000", stakingGenesis.Validators[2].Tokens.String()) diff --git a/x/staking/simulation/operations_test.go b/x/staking/simulation/operations_test.go index ff9d104368..6e3f687393 100644 --- a/x/staking/simulation/operations_test.go +++ b/x/staking/simulation/operations_test.go @@ -16,6 +16,7 @@ import ( distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" "github.com/cosmos/cosmos-sdk/x/staking/simulation" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -302,7 +303,7 @@ func getTestingValidator(t *testing.T, app *simapp.SimApp, ctx sdk.Context, acco account := accounts[n] valPubKey := account.PubKey valAddr := sdk.ValAddress(account.PubKey.Address().Bytes()) - validator := types.NewValidator(valAddr, valPubKey, types.Description{}) + validator := teststaking.NewValidator(t, valAddr, valPubKey) validator, err := validator.SetInitialCommission(commission) require.NoError(t, err) diff --git a/x/staking/teststaking/validator.go b/x/staking/teststaking/validator.go new file mode 100644 index 0000000000..90dd485999 --- /dev/null +++ b/x/staking/teststaking/validator.go @@ -0,0 +1,18 @@ +package teststaking + +import ( + "testing" + + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/crypto" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// NewValidator is a testing helper method to create validators in tests +func NewValidator(t *testing.T, operator sdk.ValAddress, pubKey crypto.PubKey) types.Validator { + v, err := types.NewValidator(operator, pubKey, types.Description{}) + require.NoError(t, err) + return v +} diff --git a/x/staking/types/data_test.go b/x/staking/types/data_test.go index 8a87c840be..5505b9d5ce 100644 --- a/x/staking/types/data_test.go +++ b/x/staking/types/data_test.go @@ -1,14 +1,18 @@ package types import ( + "fmt" + "github.com/tendermint/tendermint/crypto" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" ) var ( pk1 = ed25519.GenPrivKey().PubKey() + pk1Any *codectypes.Any pk2 = ed25519.GenPrivKey().PubKey() pk3 = ed25519.GenPrivKey().PubKey() addr1, _ = sdk.Bech32ifyAddressBytes(sdk.Bech32PrefixAccAddr, pk1.Address().Bytes()) @@ -21,3 +25,11 @@ var ( emptyAddr sdk.ValAddress emptyPubkey crypto.PubKey ) + +func init() { + var err error + pk1Any, err = codectypes.PackAny(pk1) + if err != nil { + panic(fmt.Sprintf("Can't pack pk1 %t as Any", pk1)) + } +} diff --git a/x/staking/types/exported.go b/x/staking/types/exported.go index 02f97dccea..f8cf8be99e 100644 --- a/x/staking/types/exported.go +++ b/x/staking/types/exported.go @@ -21,8 +21,8 @@ type ValidatorI interface { IsUnbonded() bool // check if has status unbonded IsUnbonding() bool // check if has status unbonding GetOperator() sdk.ValAddress // operator address to receive/return validators coins - GetConsPubKey() crypto.PubKey // validation consensus pubkey - GetConsAddr() sdk.ConsAddress // validation consensus address + TmConsPubKey() (crypto.PubKey, error) // validation consensus pubkey + GetConsAddr() (sdk.ConsAddress, error) // validation consensus address GetTokens() sdk.Int // validation tokens GetBondedTokens() sdk.Int // validator bonded tokens GetConsensusPower() int64 // validation power in tendermint diff --git a/x/staking/types/genesis.go b/x/staking/types/genesis.go index 8b00c4d89a..a0a510f6b4 100644 --- a/x/staking/types/genesis.go +++ b/x/staking/types/genesis.go @@ -4,6 +4,7 @@ import ( "encoding/json" "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" ) // NewGenesisState creates a new GenesisState instanc e @@ -33,3 +34,13 @@ func GetGenesisStateFromAppState(cdc codec.JSONMarshaler, appState map[string]js return &genesisState } + +// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces +func (g GenesisState) UnpackInterfaces(c codectypes.AnyUnpacker) error { + for i := range g.Validators { + if err := g.Validators[i].UnpackInterfaces(c); err != nil { + return err + } + } + return nil +} diff --git a/x/staking/types/historical_info.go b/x/staking/types/historical_info.go index fc4dc2906b..10df3ced02 100644 --- a/x/staking/types/historical_info.go +++ b/x/staking/types/historical_info.go @@ -3,9 +3,11 @@ package types import ( "sort" + "github.com/gogo/protobuf/proto" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) @@ -20,11 +22,6 @@ func NewHistoricalInfo(header tmproto.Header, valSet Validators) HistoricalInfo } } -// MustMarshalHistoricalInfo wll marshal historical info and panic on error -func MustMarshalHistoricalInfo(cdc codec.BinaryMarshaler, hi HistoricalInfo) []byte { - return cdc.MustMarshalBinaryBare(&hi) -} - // MustUnmarshalHistoricalInfo wll unmarshal historical info and panic on error func MustUnmarshalHistoricalInfo(cdc codec.BinaryMarshaler, value []byte) HistoricalInfo { hi, err := UnmarshalHistoricalInfo(cdc, value) @@ -38,7 +35,6 @@ func MustUnmarshalHistoricalInfo(cdc codec.BinaryMarshaler, value []byte) Histor // UnmarshalHistoricalInfo will unmarshal historical info and return any error func UnmarshalHistoricalInfo(cdc codec.BinaryMarshaler, value []byte) (hi HistoricalInfo, err error) { err = cdc.UnmarshalBinaryBare(value, &hi) - return hi, err } @@ -54,3 +50,29 @@ func ValidateBasic(hi HistoricalInfo) error { return nil } + +// Equal checks if receiver is equal to the parameter +func (hi *HistoricalInfo) Equal(hi2 *HistoricalInfo) bool { + if !proto.Equal(&hi.Header, &hi2.Header) { + return false + } + if len(hi.Valset) != len(hi2.Valset) { + return false + } + for i := range hi.Valset { + if !hi.Valset[i].Equal(&hi2.Valset[i]) { + return false + } + } + return true +} + +// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces +func (hi HistoricalInfo) UnpackInterfaces(c codectypes.AnyUnpacker) error { + for i := range hi.Valset { + if err := hi.Valset[i].UnpackInterfaces(c); err != nil { + return err + } + } + return nil +} diff --git a/x/staking/types/historical_info_test.go b/x/staking/types/historical_info_test.go index e37ca88218..f7f6f2a869 100644 --- a/x/staking/types/historical_info_test.go +++ b/x/staking/types/historical_info_test.go @@ -9,36 +9,41 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) -var ( - validators = []Validator{ - NewValidator(valAddr1, pk1, Description{}), - NewValidator(valAddr2, pk2, Description{}), - NewValidator(valAddr3, pk3, Description{}), +var header = tmproto.Header{ + ChainID: "hello", + Height: 5, +} + +func createValidators(t *testing.T) []Validator { + return []Validator{ + newValidator(t, valAddr1, pk1), + newValidator(t, valAddr2, pk2), + newValidator(t, valAddr3, pk3), } - header = tmproto.Header{ - ChainID: "hello", - Height: 5, - } -) +} func TestHistoricalInfo(t *testing.T) { + validators := createValidators(t) hi := NewHistoricalInfo(header, validators) require.True(t, sort.IsSorted(Validators(hi.Valset)), "Validators are not sorted") var value []byte require.NotPanics(t, func() { - value = MustMarshalHistoricalInfo(ModuleCdc, hi) + value = ModuleCdc.MustMarshalBinaryBare(&hi) }) - require.NotNil(t, value, "Marshalled HistoricalInfo is nil") recv, err := UnmarshalHistoricalInfo(ModuleCdc, value) require.Nil(t, err, "Unmarshalling HistoricalInfo failed") - require.Equal(t, hi, recv, "Unmarshalled HistoricalInfo is different from original") + require.Equal(t, hi.Header, recv.Header) + for i := range hi.Valset { + require.True(t, hi.Valset[i].Equal(&recv.Valset[i])) + } require.True(t, sort.IsSorted(Validators(hi.Valset)), "Validators are not sorted") } func TestValidateBasic(t *testing.T) { + validators := createValidators(t) hi := HistoricalInfo{ Header: header, } @@ -53,7 +58,6 @@ func TestValidateBasic(t *testing.T) { validators[j] = it }) } - hi = HistoricalInfo{ Header: header, Valset: validators, diff --git a/x/staking/types/keys_test.go b/x/staking/types/keys_test.go index 725438707c..3569b126c1 100644 --- a/x/staking/types/keys_test.go +++ b/x/staking/types/keys_test.go @@ -24,8 +24,7 @@ var ( func TestGetValidatorPowerRank(t *testing.T) { valAddr1 := sdk.ValAddress(keysAddr1) - emptyDesc := Description{} - val1 := NewValidator(valAddr1, keysPK1, emptyDesc) + val1 := newValidator(t, valAddr1, keysPK1) val1.Tokens = sdk.ZeroInt() val2, val3, val4 := val1, val1, val1 val2.Tokens = sdk.TokensFromConsensusPower(1) diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 1c743ca1cd..a5e7693f5d 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -7,8 +7,9 @@ import ( bytes "bytes" compress_gzip "compress/gzip" fmt "fmt" + types1 "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types1 "github.com/cosmos/cosmos-sdk/types" + types2 "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" proto "github.com/gogo/protobuf/proto" @@ -16,6 +17,7 @@ import ( github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "github.com/golang/protobuf/ptypes/duration" _ "github.com/golang/protobuf/ptypes/timestamp" + _ "github.com/regen-network/cosmos-proto" types "github.com/tendermint/tendermint/proto/tendermint/types" io "io" io_ioutil "io/ioutil" @@ -301,7 +303,7 @@ func (m *Description) GetDetails() string { // multiplied by exchange rate. type Validator struct { OperatorAddress string `protobuf:"bytes,1,opt,name=operator_address,json=operatorAddress,proto3" json:"operator_address,omitempty" yaml:"operator_address"` - ConsensusPubkey string `protobuf:"bytes,2,opt,name=consensus_pubkey,json=consensusPubkey,proto3" json:"consensus_pubkey,omitempty" yaml:"consensus_pubkey"` + ConsensusPubkey *types1.Any `protobuf:"bytes,2,opt,name=consensus_pubkey,json=consensusPubkey,proto3" json:"consensus_pubkey,omitempty" yaml:"consensus_pubkey"` Jailed bool `protobuf:"varint,3,opt,name=jailed,proto3" json:"jailed,omitempty"` Status BondStatus `protobuf:"varint,4,opt,name=status,proto3,enum=cosmos.staking.v1beta1.BondStatus" json:"status,omitempty"` Tokens github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,5,opt,name=tokens,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"tokens"` @@ -871,7 +873,7 @@ func (m *Params) GetBondDenom() string { // balance in addition to shares which is more suitable for client responses. type DelegationResponse struct { Delegation Delegation `protobuf:"bytes,1,opt,name=delegation,proto3" json:"delegation"` - Balance types1.Coin `protobuf:"bytes,2,opt,name=balance,proto3" json:"balance"` + Balance types2.Coin `protobuf:"bytes,2,opt,name=balance,proto3" json:"balance"` } func (m *DelegationResponse) Reset() { *m = DelegationResponse{} } @@ -913,11 +915,11 @@ func (m *DelegationResponse) GetDelegation() Delegation { return Delegation{} } -func (m *DelegationResponse) GetBalance() types1.Coin { +func (m *DelegationResponse) GetBalance() types2.Coin { if m != nil { return m.Balance } - return types1.Coin{} + return types2.Coin{} } // RedelegationEntryResponse is equivalent to a RedelegationEntry except that it @@ -1092,117 +1094,119 @@ func init() { } var fileDescriptor_64c30c6cf92913c9 = []byte{ - // 1754 bytes of a gzipped FileDescriptorProto + // 1790 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x23, 0x49, - 0x15, 0x76, 0xdb, 0x5e, 0xc7, 0x7e, 0x4e, 0xe2, 0xb8, 0xe6, 0x67, 0x3d, 0x66, 0x70, 0x7b, 0x9b, - 0xd5, 0x12, 0xd0, 0xe2, 0x30, 0x01, 0x2d, 0x22, 0x17, 0x18, 0xc7, 0x19, 0x62, 0xb1, 0x0c, 0xa1, - 0x9d, 0x09, 0x12, 0xac, 0xb0, 0xca, 0xdd, 0x15, 0xa7, 0x89, 0xbb, 0xdb, 0x74, 0x95, 0x87, 0x44, - 0xda, 0x03, 0xc7, 0x65, 0x10, 0x62, 0xb9, 0xed, 0x65, 0xa4, 0x91, 0xf6, 0x8a, 0xc4, 0x8d, 0x2b, - 0xd7, 0x45, 0x5c, 0x86, 0x1b, 0x42, 0xc8, 0xa0, 0x99, 0x0b, 0xe2, 0x84, 0x7c, 0x40, 0x9c, 0x00, - 0xd5, 0x4f, 0xff, 0xa4, 0x1d, 0xcf, 0x8c, 0x47, 0x7b, 0x58, 0x09, 0x2e, 0x89, 0xeb, 0xd5, 0x7b, - 0xdf, 0xab, 0xf7, 0x5b, 0xaf, 0x1a, 0x5e, 0xb7, 0x7c, 0xea, 0xfa, 0x74, 0x8b, 0x32, 0x7c, 0xea, - 0x78, 0xc3, 0xad, 0xfb, 0xb7, 0x06, 0x84, 0xe1, 0x5b, 0xe1, 0xba, 0x35, 0x0e, 0x7c, 0xe6, 0xa3, - 0xeb, 0x92, 0xab, 0x15, 0x52, 0x15, 0x57, 0xfd, 0xea, 0xd0, 0x1f, 0xfa, 0x82, 0x65, 0x8b, 0xff, - 0x92, 0xdc, 0xf5, 0x9b, 0x8c, 0x78, 0x36, 0x09, 0x5c, 0xc7, 0x63, 0x5b, 0xec, 0x7c, 0x4c, 0xa8, - 0xfc, 0xab, 0x76, 0xf5, 0xa1, 0xef, 0x0f, 0x47, 0x64, 0x4b, 0xac, 0x06, 0x93, 0xe3, 0x2d, 0xe6, - 0xb8, 0x84, 0x32, 0xec, 0x8e, 0x15, 0x43, 0x23, 0xcd, 0x60, 0x4f, 0x02, 0xcc, 0x1c, 0xdf, 0x0b, - 0xf7, 0xd5, 0x91, 0x07, 0x98, 0x92, 0xe8, 0xbc, 0x96, 0xef, 0xa8, 0x7d, 0xe3, 0xa7, 0x1a, 0xac, - 0xef, 0x3b, 0x94, 0xf9, 0x81, 0x63, 0xe1, 0x51, 0xd7, 0x3b, 0xf6, 0xd1, 0x5b, 0x50, 0x38, 0x21, - 0xd8, 0x26, 0x41, 0x4d, 0x6b, 0x6a, 0x9b, 0xe5, 0xed, 0x5a, 0x2b, 0x3e, 0x62, 0x4b, 0x1e, 0x6e, - 0x5f, 0xec, 0xb7, 0xf3, 0x1f, 0x4d, 0xf5, 0x8c, 0xa9, 0xb8, 0xd1, 0xd7, 0xa0, 0x70, 0x1f, 0x8f, - 0x28, 0x61, 0xb5, 0x6c, 0x33, 0xb7, 0x59, 0xde, 0x7e, 0xad, 0x75, 0xb9, 0x23, 0x5a, 0x47, 0x78, - 0xe4, 0xd8, 0x98, 0xf9, 0x11, 0x80, 0x14, 0x33, 0x7e, 0x9d, 0x85, 0xca, 0xae, 0xef, 0xba, 0x0e, - 0xa5, 0x8e, 0xef, 0x99, 0x98, 0x11, 0x8a, 0xda, 0x90, 0x0f, 0x30, 0x23, 0xe2, 0x28, 0xa5, 0x76, - 0x8b, 0xf3, 0xff, 0x69, 0xaa, 0xbf, 0x31, 0x74, 0xd8, 0xc9, 0x64, 0xd0, 0xb2, 0x7c, 0x77, 0x4b, - 0x19, 0x28, 0xff, 0x7d, 0x81, 0xda, 0xa7, 0xca, 0x81, 0x1d, 0x62, 0x99, 0x42, 0x16, 0xbd, 0x03, - 0x45, 0x17, 0x9f, 0xf5, 0x05, 0x4e, 0x56, 0xe0, 0xdc, 0x5e, 0x0e, 0x67, 0x36, 0xd5, 0x2b, 0xe7, - 0xd8, 0x1d, 0xed, 0x18, 0x21, 0x8e, 0x61, 0xae, 0xb8, 0xf8, 0x8c, 0x1f, 0x11, 0x8d, 0xa1, 0xc2, - 0xa9, 0xd6, 0x09, 0xf6, 0x86, 0x44, 0x2a, 0xc9, 0x09, 0x25, 0xfb, 0x4b, 0x2b, 0xb9, 0x1e, 0x2b, - 0x49, 0xc0, 0x19, 0xe6, 0x9a, 0x8b, 0xcf, 0x76, 0x05, 0x81, 0x6b, 0xdc, 0x29, 0x7e, 0xf0, 0x48, - 0xcf, 0xfc, 0xed, 0x91, 0xae, 0x19, 0x7f, 0xd0, 0x00, 0x62, 0x8f, 0xa1, 0x77, 0x60, 0xc3, 0x8a, - 0x56, 0x42, 0x96, 0xaa, 0x18, 0x7e, 0x76, 0x51, 0x2c, 0x52, 0xfe, 0x6e, 0x17, 0xf9, 0xa1, 0x1f, - 0x4f, 0x75, 0xcd, 0xac, 0x58, 0xa9, 0x50, 0x7c, 0x1f, 0xca, 0x93, 0xb1, 0x8d, 0x19, 0xe9, 0xf3, - 0x24, 0x14, 0x9e, 0x2c, 0x6f, 0xd7, 0x5b, 0x32, 0x01, 0x5b, 0x61, 0x02, 0xb6, 0x0e, 0xc3, 0x0c, - 0x6d, 0x37, 0x38, 0xd6, 0x6c, 0xaa, 0x23, 0x69, 0x56, 0x42, 0xd8, 0x78, 0xff, 0x2f, 0xba, 0x66, - 0x82, 0xa4, 0x70, 0x81, 0x84, 0x4d, 0xbf, 0xd3, 0xa0, 0xdc, 0x21, 0xd4, 0x0a, 0x9c, 0x31, 0xcf, - 0x63, 0x54, 0x83, 0x15, 0xd7, 0xf7, 0x9c, 0x53, 0x95, 0x8f, 0x25, 0x33, 0x5c, 0xa2, 0x3a, 0x14, - 0x1d, 0x9b, 0x78, 0xcc, 0x61, 0xe7, 0x32, 0xae, 0x66, 0xb4, 0xe6, 0x52, 0x3f, 0x26, 0x03, 0xea, - 0x84, 0xd1, 0x30, 0xc3, 0x25, 0xba, 0x03, 0x1b, 0x94, 0x58, 0x93, 0xc0, 0x61, 0xe7, 0x7d, 0xcb, - 0xf7, 0x18, 0xb6, 0x58, 0x2d, 0x2f, 0x02, 0xf6, 0xa9, 0xd9, 0x54, 0x7f, 0x55, 0x9e, 0x35, 0xcd, - 0x61, 0x98, 0x95, 0x90, 0xb4, 0x2b, 0x29, 0x5c, 0x83, 0x4d, 0x18, 0x76, 0x46, 0xb4, 0xf6, 0x8a, - 0xd4, 0xa0, 0x96, 0x09, 0x5b, 0xfe, 0x5d, 0x80, 0x52, 0x94, 0xed, 0x5c, 0xb3, 0x3f, 0x26, 0x01, - 0xff, 0xdd, 0xc7, 0xb6, 0x1d, 0x10, 0x4a, 0x55, 0x5e, 0x27, 0x34, 0xa7, 0x39, 0x0c, 0xb3, 0x12, - 0x92, 0x6e, 0x4b, 0x0a, 0xc7, 0xb1, 0x7c, 0x8f, 0x12, 0x8f, 0x4e, 0x68, 0x7f, 0x3c, 0x19, 0x9c, - 0x12, 0x65, 0x7f, 0x12, 0x27, 0xcd, 0x61, 0xf0, 0x80, 0x2a, 0xd2, 0x81, 0xa0, 0xa0, 0xeb, 0x50, - 0xf8, 0x21, 0x76, 0x46, 0xc4, 0x16, 0x2e, 0x2a, 0x9a, 0x6a, 0x85, 0x76, 0xa0, 0x40, 0x19, 0x66, - 0x13, 0x2a, 0xfc, 0xb2, 0xbe, 0x6d, 0x2c, 0x4a, 0x9e, 0xb6, 0xef, 0xd9, 0x3d, 0xc1, 0x69, 0x2a, - 0x09, 0x74, 0x07, 0x0a, 0xcc, 0x3f, 0x25, 0x9e, 0x72, 0xca, 0x52, 0x15, 0xdb, 0xf5, 0x98, 0xa9, - 0xa4, 0x11, 0x83, 0x0d, 0x9b, 0x8c, 0xc8, 0x50, 0xb8, 0x82, 0x9e, 0xe0, 0x80, 0xd0, 0x5a, 0x41, - 0x20, 0x76, 0x97, 0x2e, 0x2b, 0xe5, 0x91, 0x34, 0x9e, 0x61, 0x56, 0x22, 0x52, 0x4f, 0x50, 0xd0, - 0x37, 0xa1, 0x6c, 0xc7, 0xa9, 0x57, 0x5b, 0x11, 0x29, 0xfe, 0x99, 0x45, 0xe6, 0x27, 0xb2, 0x54, - 0x75, 0xb2, 0xa4, 0x34, 0x0f, 0xd3, 0xc4, 0x1b, 0xf8, 0x9e, 0xed, 0x78, 0xc3, 0xfe, 0x09, 0x71, - 0x86, 0x27, 0xac, 0x56, 0x6c, 0x6a, 0x9b, 0xb9, 0x64, 0x98, 0xd2, 0x1c, 0x86, 0x59, 0x89, 0x48, - 0xfb, 0x82, 0x82, 0x6c, 0x58, 0x8f, 0xb9, 0x44, 0xe9, 0x95, 0x9e, 0x5b, 0x7a, 0xaf, 0xa9, 0xd2, - 0xbb, 0x96, 0xd6, 0x12, 0x57, 0xdf, 0x5a, 0x44, 0xe4, 0x62, 0x68, 0x1f, 0x20, 0x2e, 0xf8, 0x1a, - 0x08, 0x0d, 0xc6, 0xf3, 0xbb, 0x86, 0x32, 0x3c, 0x21, 0x8b, 0xde, 0x85, 0x2b, 0xae, 0xe3, 0xf5, - 0x29, 0x19, 0x1d, 0xf7, 0x95, 0x83, 0x39, 0x64, 0x59, 0x44, 0xef, 0xed, 0xe5, 0xf2, 0x61, 0x36, - 0xd5, 0xeb, 0xaa, 0x29, 0xce, 0x43, 0x1a, 0x66, 0xd5, 0x75, 0xbc, 0x1e, 0x19, 0x1d, 0x77, 0x22, - 0xda, 0xce, 0xea, 0x7b, 0x8f, 0xf4, 0x8c, 0x2a, 0xc0, 0x8c, 0xf1, 0x16, 0xac, 0x1e, 0xe1, 0x91, - 0x2a, 0x1c, 0x42, 0xd1, 0x4d, 0x28, 0xe1, 0x70, 0x51, 0xd3, 0x9a, 0xb9, 0xcd, 0x92, 0x19, 0x13, - 0x64, 0xe1, 0xfe, 0xe4, 0xcf, 0x4d, 0xcd, 0xf8, 0x95, 0x06, 0x85, 0xce, 0xd1, 0x01, 0x76, 0x02, - 0xd4, 0x85, 0x6a, 0x9c, 0x39, 0x17, 0xcb, 0xf6, 0xe6, 0x6c, 0xaa, 0xd7, 0xd2, 0xc9, 0x15, 0xd5, - 0x6d, 0x9c, 0xc0, 0x61, 0xe1, 0x76, 0xa1, 0x7a, 0x3f, 0xec, 0x06, 0x11, 0x54, 0x36, 0x0d, 0x35, - 0xc7, 0x62, 0x98, 0x1b, 0x11, 0x4d, 0x41, 0xa5, 0xcc, 0xdc, 0x83, 0x15, 0x79, 0x5a, 0x8a, 0x76, - 0xe0, 0x95, 0x31, 0xff, 0x21, 0xac, 0x2b, 0x6f, 0x37, 0x16, 0x26, 0xaf, 0xe0, 0x57, 0xe1, 0x93, - 0x22, 0xc6, 0x2f, 0xb3, 0x00, 0x9d, 0xa3, 0xa3, 0xc3, 0xc0, 0x19, 0x8f, 0x08, 0xfb, 0x38, 0x2d, - 0x3f, 0x84, 0x6b, 0xb1, 0x59, 0x34, 0xb0, 0x52, 0xd6, 0x37, 0x67, 0x53, 0xfd, 0x66, 0xda, 0xfa, - 0x04, 0x9b, 0x61, 0x5e, 0x89, 0xe8, 0xbd, 0xc0, 0xba, 0x14, 0xd5, 0xa6, 0x2c, 0x42, 0xcd, 0x2d, - 0x46, 0x4d, 0xb0, 0x25, 0x51, 0x3b, 0x94, 0x5d, 0xee, 0xda, 0x1e, 0x94, 0x63, 0x97, 0x50, 0xd4, - 0x81, 0x22, 0x53, 0xbf, 0x95, 0x87, 0x8d, 0xc5, 0x1e, 0x0e, 0xc5, 0x94, 0x97, 0x23, 0x49, 0xe3, - 0x5f, 0x1a, 0x40, 0x9c, 0xb3, 0x9f, 0xcc, 0x14, 0xe3, 0xad, 0x5c, 0x35, 0xde, 0xdc, 0x4b, 0x0d, - 0x5f, 0x4a, 0x3a, 0xe5, 0xcf, 0x9f, 0x65, 0xe1, 0xca, 0xbd, 0xb0, 0xf3, 0x7c, 0xe2, 0x7d, 0x70, - 0x00, 0x2b, 0xc4, 0x63, 0x81, 0x23, 0x9c, 0xc0, 0xa3, 0xfd, 0xc5, 0x45, 0xd1, 0xbe, 0xc4, 0xa6, - 0x3d, 0x8f, 0x05, 0xe7, 0x2a, 0xf6, 0x21, 0x4c, 0xca, 0x1b, 0xbf, 0xc8, 0x41, 0x6d, 0x91, 0x24, - 0xda, 0x85, 0x8a, 0x15, 0x10, 0x41, 0x08, 0xef, 0x0f, 0x4d, 0xdc, 0x1f, 0xf5, 0x78, 0x56, 0x4c, - 0x31, 0x18, 0xe6, 0x7a, 0x48, 0x51, 0xb7, 0xc7, 0x10, 0xf8, 0x20, 0xc7, 0xd3, 0x8e, 0x73, 0xbd, - 0xe0, 0xe4, 0x66, 0xa8, 0xeb, 0x23, 0x54, 0x72, 0x11, 0x40, 0xde, 0x1f, 0xeb, 0x31, 0x55, 0x5c, - 0x20, 0x3f, 0x82, 0x8a, 0xe3, 0x39, 0xcc, 0xc1, 0xa3, 0xfe, 0x00, 0x8f, 0xb0, 0x67, 0xbd, 0xcc, - 0x1c, 0x2c, 0x5b, 0xbe, 0x52, 0x9b, 0x82, 0x33, 0xcc, 0x75, 0x45, 0x69, 0x4b, 0x02, 0xda, 0x87, - 0x95, 0x50, 0x55, 0xfe, 0xa5, 0xa6, 0x8d, 0x50, 0x3c, 0x31, 0xb2, 0xfd, 0x3c, 0x07, 0x55, 0x93, - 0xd8, 0xff, 0x0f, 0xc5, 0x72, 0xa1, 0xf8, 0x16, 0x80, 0x2c, 0x77, 0xde, 0x60, 0x5f, 0x22, 0x1a, - 0xbc, 0x61, 0x94, 0x24, 0x42, 0x87, 0xb2, 0x44, 0x3c, 0xa6, 0x59, 0x58, 0x4d, 0xc6, 0xe3, 0x7f, - 0xf4, 0x56, 0x42, 0xdd, 0xb8, 0x13, 0xe5, 0x45, 0x27, 0xfa, 0xdc, 0xa2, 0x4e, 0x34, 0x97, 0xbd, - 0xcf, 0x6e, 0x41, 0xff, 0xcc, 0x42, 0xe1, 0x00, 0x07, 0xd8, 0xa5, 0xc8, 0x9a, 0x9b, 0x34, 0xe5, - 0xeb, 0xf1, 0xc6, 0x5c, 0x7e, 0x76, 0xd4, 0x57, 0x86, 0xe7, 0x0c, 0x9a, 0x1f, 0x5c, 0x32, 0x68, - 0x7e, 0x1d, 0xd6, 0xf9, 0x03, 0x37, 0xb2, 0x51, 0x7a, 0x7b, 0xad, 0x7d, 0x23, 0x46, 0xb9, 0xb8, - 0x2f, 0xdf, 0xbf, 0xd1, 0x33, 0x8a, 0xa2, 0xaf, 0x40, 0x99, 0x73, 0xc4, 0x8d, 0x99, 0x8b, 0x5f, - 0x8f, 0x1f, 0x9a, 0x89, 0x4d, 0xc3, 0x04, 0x17, 0x9f, 0xed, 0xc9, 0x05, 0x7a, 0x1b, 0xd0, 0x49, - 0xf4, 0xad, 0xa3, 0x1f, 0xbb, 0x93, 0xcb, 0x7f, 0x7a, 0x36, 0xd5, 0x6f, 0x48, 0xf9, 0x79, 0x1e, - 0xc3, 0xac, 0xc6, 0xc4, 0x10, 0xed, 0xcb, 0x00, 0xdc, 0xae, 0xbe, 0x4d, 0x3c, 0xdf, 0x55, 0xcf, - 0x9d, 0x6b, 0xb3, 0xa9, 0x5e, 0x95, 0x28, 0xf1, 0x9e, 0x61, 0x96, 0xf8, 0xa2, 0xc3, 0x7f, 0x27, - 0x32, 0xfb, 0x43, 0x0d, 0x50, 0xdc, 0xf2, 0x4d, 0x42, 0xc7, 0xfc, 0x7d, 0xc6, 0x07, 0xf1, 0xc4, - 0xd4, 0xac, 0x3d, 0x7b, 0x10, 0x8f, 0xe5, 0xc3, 0x41, 0x3c, 0x51, 0x29, 0x5f, 0x8d, 0xdb, 0x63, - 0x56, 0xc5, 0x51, 0xc1, 0x0c, 0x30, 0x25, 0x89, 0x61, 0xde, 0x09, 0xa5, 0xe7, 0xfa, 0x61, 0xc6, - 0xf8, 0xbd, 0x06, 0x37, 0xe6, 0x32, 0x2a, 0x3a, 0xec, 0x0f, 0x00, 0x05, 0x89, 0x4d, 0xe1, 0xaf, - 0x73, 0x75, 0xe8, 0xa5, 0x13, 0xb4, 0x1a, 0xcc, 0xf5, 0xdd, 0x8f, 0xaf, 0xc3, 0xe7, 0x85, 0xcf, - 0x7f, 0xab, 0xc1, 0xd5, 0xa4, 0xfa, 0xc8, 0x90, 0xbb, 0xb0, 0x9a, 0xd4, 0xae, 0x4c, 0x78, 0xfd, - 0x45, 0x4c, 0x50, 0xa7, 0xbf, 0x20, 0x8f, 0xbe, 0x13, 0x97, 0xab, 0xfc, 0x1a, 0x76, 0xeb, 0x85, - 0xbd, 0x11, 0x9e, 0x29, 0x5d, 0xb6, 0x79, 0x11, 0x8f, 0xff, 0x68, 0x90, 0x3f, 0xf0, 0xfd, 0x11, - 0xf2, 0xa1, 0xea, 0xf9, 0xac, 0xcf, 0x33, 0x8b, 0xd8, 0x7d, 0xf5, 0xe8, 0x96, 0x7d, 0x70, 0x77, - 0x39, 0x27, 0xfd, 0x7d, 0xaa, 0xcf, 0x43, 0x99, 0x15, 0xcf, 0x67, 0x6d, 0x41, 0x39, 0x94, 0x4f, - 0xf2, 0x77, 0x61, 0xed, 0xa2, 0x32, 0xd9, 0x25, 0xbf, 0xbb, 0xb4, 0xb2, 0x8b, 0x30, 0xb3, 0xa9, - 0x7e, 0x35, 0xae, 0x98, 0x88, 0x6c, 0x98, 0xab, 0x83, 0x84, 0xf6, 0x9d, 0x22, 0x8f, 0xdf, 0x3f, - 0x1e, 0xe9, 0xda, 0xe7, 0x7f, 0xa3, 0x01, 0xc4, 0x5f, 0x1e, 0xd0, 0x9b, 0xf0, 0x6a, 0xfb, 0xdb, - 0x77, 0x3b, 0xfd, 0xde, 0xe1, 0xed, 0xc3, 0x7b, 0xbd, 0xfe, 0xbd, 0xbb, 0xbd, 0x83, 0xbd, 0xdd, - 0xee, 0x9d, 0xee, 0x5e, 0x67, 0x23, 0x53, 0xaf, 0x3c, 0x78, 0xd8, 0x2c, 0xdf, 0xf3, 0xe8, 0x98, - 0x58, 0xce, 0xb1, 0x43, 0x6c, 0xf4, 0x06, 0x5c, 0xbd, 0xc8, 0xcd, 0x57, 0x7b, 0x9d, 0x0d, 0xad, - 0xbe, 0xfa, 0xe0, 0x61, 0xb3, 0x28, 0x67, 0x31, 0x62, 0xa3, 0x4d, 0xb8, 0x36, 0xcf, 0xd7, 0xbd, - 0xfb, 0x8d, 0x8d, 0x6c, 0x7d, 0xed, 0xc1, 0xc3, 0x66, 0x29, 0x1a, 0xda, 0x90, 0x01, 0x28, 0xc9, - 0xa9, 0xf0, 0x72, 0x75, 0x78, 0xf0, 0xb0, 0x59, 0x90, 0x0e, 0xac, 0xe7, 0xdf, 0xfb, 0xb0, 0x91, - 0x69, 0xdf, 0xf9, 0xe8, 0x49, 0x43, 0x7b, 0xfc, 0xa4, 0xa1, 0xfd, 0xf5, 0x49, 0x43, 0x7b, 0xff, - 0x69, 0x23, 0xf3, 0xf8, 0x69, 0x23, 0xf3, 0xc7, 0xa7, 0x8d, 0xcc, 0xf7, 0xde, 0x7c, 0xa6, 0xef, - 0xce, 0xa2, 0x0f, 0xce, 0xc2, 0x8b, 0x83, 0x82, 0x68, 0xc3, 0x5f, 0xfa, 0x6f, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x27, 0x47, 0x69, 0xe7, 0x8f, 0x16, 0x00, 0x00, + 0x15, 0x76, 0x3b, 0x5e, 0xc7, 0x7e, 0x4e, 0xe2, 0xa4, 0x26, 0x33, 0xeb, 0x98, 0xc1, 0xed, 0x6d, + 0x96, 0x25, 0xa0, 0x5d, 0x87, 0x09, 0x68, 0x11, 0xb9, 0xc0, 0x38, 0xce, 0x10, 0x6b, 0x97, 0x21, + 0x74, 0x32, 0x41, 0x82, 0x15, 0x56, 0xb9, 0xbb, 0xe2, 0x34, 0x71, 0x77, 0x9b, 0xae, 0xf2, 0x10, + 0x4b, 0x7b, 0xe0, 0xb8, 0x0c, 0x42, 0x2c, 0xb7, 0xbd, 0x0c, 0x1a, 0x69, 0xaf, 0x48, 0x5c, 0x10, + 0x57, 0xae, 0x0b, 0x5c, 0x86, 0x1b, 0x42, 0xc8, 0xa0, 0x99, 0x0b, 0xe2, 0x84, 0x7c, 0x40, 0xdc, + 0x40, 0xf5, 0xd3, 0x3f, 0x69, 0xc7, 0x33, 0xe3, 0xd1, 0x1e, 0x46, 0x62, 0x2f, 0x89, 0xeb, 0xd5, + 0xfb, 0xa9, 0xf7, 0xbd, 0x9f, 0x7a, 0xd5, 0xf0, 0xaa, 0xe5, 0x53, 0xd7, 0xa7, 0x5b, 0x94, 0xe1, + 0x33, 0xc7, 0xeb, 0x6d, 0xdd, 0xbd, 0xd1, 0x25, 0x0c, 0xdf, 0x08, 0xd7, 0x8d, 0x41, 0xe0, 0x33, + 0x1f, 0x5d, 0x93, 0x5c, 0x8d, 0x90, 0xaa, 0xb8, 0xaa, 0xeb, 0x3d, 0xbf, 0xe7, 0x0b, 0x96, 0x2d, + 0xfe, 0x4b, 0x72, 0x57, 0x37, 0x24, 0x77, 0x47, 0x6e, 0x28, 0x51, 0xb9, 0x75, 0x9d, 0x11, 0xcf, + 0x26, 0x81, 0xeb, 0x78, 0x6c, 0x8b, 0x8d, 0x06, 0x84, 0xca, 0xbf, 0x6a, 0x57, 0xef, 0xf9, 0x7e, + 0xaf, 0x4f, 0xb6, 0xc4, 0xaa, 0x3b, 0x3c, 0xd9, 0x62, 0x8e, 0x4b, 0x28, 0xc3, 0xee, 0x40, 0x31, + 0xd4, 0xd2, 0x0c, 0xf6, 0x30, 0xc0, 0xcc, 0xf1, 0xbd, 0x70, 0x5f, 0x79, 0xd3, 0xc5, 0x94, 0x44, + 0xae, 0x58, 0xbe, 0x13, 0xee, 0x6f, 0xa4, 0xe5, 0xb1, 0x37, 0x92, 0x5b, 0xc6, 0x4f, 0x34, 0x58, + 0xd9, 0x77, 0x28, 0xf3, 0x03, 0xc7, 0xc2, 0xfd, 0xb6, 0x77, 0xe2, 0xa3, 0x37, 0x21, 0x7f, 0x4a, + 0xb0, 0x4d, 0x82, 0x8a, 0x56, 0xd7, 0x36, 0x4b, 0xdb, 0x95, 0x46, 0x7c, 0xfa, 0x86, 0x3c, 0xf7, + 0xbe, 0xd8, 0x6f, 0xe6, 0x3e, 0x1a, 0xeb, 0x19, 0x53, 0x71, 0xa3, 0xaf, 0x41, 0xfe, 0x2e, 0xee, + 0x53, 0xc2, 0x2a, 0xd9, 0xfa, 0xc2, 0x66, 0x69, 0xfb, 0x95, 0xc6, 0xe5, 0xf0, 0x35, 0x8e, 0x71, + 0xdf, 0xb1, 0x31, 0xf3, 0x23, 0x05, 0x52, 0xcc, 0xf8, 0x75, 0x16, 0xca, 0xbb, 0xbe, 0xeb, 0x3a, + 0x94, 0x3a, 0xbe, 0x67, 0x62, 0x46, 0x28, 0x6a, 0x42, 0x2e, 0xc0, 0x8c, 0x88, 0xa3, 0x14, 0x9b, + 0x0d, 0xce, 0xff, 0x97, 0xb1, 0xfe, 0x5a, 0xcf, 0x61, 0xa7, 0xc3, 0x6e, 0xc3, 0xf2, 0x5d, 0x05, + 0xb4, 0xfa, 0xf7, 0x06, 0xb5, 0xcf, 0x14, 0xb6, 0x2d, 0x62, 0x99, 0x42, 0x16, 0xbd, 0x03, 0x05, + 0x17, 0x9f, 0x77, 0x84, 0x9e, 0xac, 0xd0, 0x73, 0x73, 0x3e, 0x3d, 0x93, 0xb1, 0x5e, 0x1e, 0x61, + 0xb7, 0xbf, 0x63, 0x84, 0x7a, 0x0c, 0x73, 0xd1, 0xc5, 0xe7, 0xfc, 0x88, 0x68, 0x00, 0x65, 0x4e, + 0xb5, 0x4e, 0xb1, 0xd7, 0x23, 0xd2, 0xc8, 0x82, 0x30, 0xb2, 0x3f, 0xb7, 0x91, 0x6b, 0xb1, 0x91, + 0x84, 0x3a, 0xc3, 0x5c, 0x76, 0xf1, 0xf9, 0xae, 0x20, 0x70, 0x8b, 0x3b, 0x85, 0x0f, 0x1e, 0xe8, + 0x99, 0x7f, 0x3c, 0xd0, 0x35, 0xe3, 0x4f, 0x1a, 0x40, 0x8c, 0x18, 0x7a, 0x07, 0x56, 0xad, 0x68, + 0x25, 0x64, 0xa9, 0x8a, 0xe1, 0xe7, 0x66, 0xc5, 0x22, 0x85, 0x77, 0xb3, 0xc0, 0x0f, 0xfd, 0x70, + 0xac, 0x6b, 0x66, 0xd9, 0x4a, 0x85, 0xe2, 0x7b, 0x50, 0x1a, 0x0e, 0x6c, 0xcc, 0x48, 0x87, 0xe7, + 0xa7, 0x40, 0xb2, 0xb4, 0x5d, 0x6d, 0xc8, 0xdc, 0x6a, 0x84, 0xb9, 0xd5, 0x38, 0x0a, 0x93, 0xb7, + 0x59, 0xe3, 0xba, 0x26, 0x63, 0x1d, 0x49, 0xb7, 0x12, 0xc2, 0xc6, 0xfb, 0x7f, 0xd3, 0x35, 0x13, + 0x24, 0x85, 0x0b, 0x24, 0x7c, 0xfa, 0xbd, 0x06, 0xa5, 0x16, 0xa1, 0x56, 0xe0, 0x0c, 0x78, 0x8a, + 0xa3, 0x0a, 0x2c, 0xba, 0xbe, 0xe7, 0x9c, 0xa9, 0x7c, 0x2c, 0x9a, 0xe1, 0x12, 0x55, 0xa1, 0xe0, + 0xd8, 0xc4, 0x63, 0x0e, 0x1b, 0xc9, 0xb8, 0x9a, 0xd1, 0x9a, 0x4b, 0xfd, 0x88, 0x74, 0xa9, 0x13, + 0x46, 0xc3, 0x0c, 0x97, 0xe8, 0x16, 0xac, 0x52, 0x62, 0x0d, 0x03, 0x87, 0x8d, 0x3a, 0x96, 0xef, + 0x31, 0x6c, 0xb1, 0x4a, 0x4e, 0x04, 0xec, 0x53, 0x93, 0xb1, 0xfe, 0xb2, 0x3c, 0x6b, 0x9a, 0xc3, + 0x30, 0xcb, 0x21, 0x69, 0x57, 0x52, 0xb8, 0x05, 0x9b, 0x30, 0xec, 0xf4, 0x69, 0xe5, 0x25, 0x69, + 0x41, 0x2d, 0x13, 0xbe, 0xfc, 0x72, 0x11, 0x8a, 0x51, 0xb6, 0x73, 0xcb, 0xfe, 0x80, 0x04, 0xfc, + 0x77, 0x07, 0xdb, 0x76, 0x40, 0x28, 0x55, 0x79, 0x9d, 0xb0, 0x9c, 0xe6, 0x30, 0xcc, 0x72, 0x48, + 0xba, 0x29, 0x29, 0xe8, 0x84, 0x87, 0xd9, 0xa3, 0xc4, 0xa3, 0x43, 0xda, 0x19, 0x0c, 0xbb, 0x67, + 0x64, 0xa4, 0xa2, 0xb1, 0x3e, 0x15, 0x8d, 0x9b, 0xde, 0xa8, 0xf9, 0xd9, 0x58, 0x7b, 0x5a, 0xce, + 0xf8, 0xc3, 0x6f, 0xde, 0xc8, 0x1f, 0x0c, 0xbb, 0x6f, 0x91, 0x11, 0x0f, 0xb8, 0xda, 0x3c, 0x10, + 0x7b, 0xe8, 0x1a, 0xe4, 0x7f, 0x80, 0x9d, 0x3e, 0xb1, 0x05, 0x84, 0x05, 0x53, 0xad, 0xd0, 0x0e, + 0xe4, 0x29, 0xc3, 0x6c, 0x48, 0x05, 0x6e, 0x2b, 0xdb, 0xc6, 0xac, 0xe4, 0x6a, 0xfa, 0x9e, 0x7d, + 0x28, 0x38, 0x4d, 0x25, 0x81, 0x6e, 0x41, 0x9e, 0xf9, 0x67, 0xc4, 0x53, 0xa0, 0xcd, 0x55, 0xd1, + 0x6d, 0x8f, 0x99, 0x4a, 0x1a, 0x31, 0x58, 0xb5, 0x49, 0x9f, 0xf4, 0x04, 0x54, 0xf4, 0x14, 0x07, + 0x84, 0x56, 0xf2, 0x42, 0x63, 0x7b, 0xee, 0xb2, 0x53, 0xd8, 0xa4, 0xf5, 0x19, 0x66, 0x39, 0x22, + 0x1d, 0x0a, 0x0a, 0x7a, 0x0b, 0x4a, 0x76, 0x9c, 0x9a, 0x95, 0x45, 0x01, 0xfa, 0x67, 0x66, 0xb9, + 0x9f, 0xc8, 0x62, 0xd5, 0xe9, 0x92, 0xd2, 0x3c, 0x1d, 0x86, 0x5e, 0xd7, 0xf7, 0x6c, 0xc7, 0xeb, + 0x75, 0x4e, 0x89, 0xd3, 0x3b, 0x65, 0x95, 0x42, 0x5d, 0xdb, 0x5c, 0x48, 0xa6, 0x43, 0x9a, 0xc3, + 0x30, 0xcb, 0x11, 0x69, 0x5f, 0x50, 0x90, 0x0d, 0x2b, 0x31, 0x97, 0x28, 0xcd, 0xe2, 0x53, 0x4b, + 0xf3, 0x15, 0x55, 0x9a, 0x57, 0xd3, 0x56, 0xe2, 0xea, 0x5c, 0x8e, 0x88, 0x5c, 0x0c, 0xed, 0x03, + 0xc4, 0x0d, 0xa1, 0x02, 0xc2, 0x82, 0xf1, 0xf4, 0xae, 0xa2, 0x1c, 0x4f, 0xc8, 0xa2, 0x77, 0xe1, + 0x8a, 0xeb, 0x78, 0x1d, 0x4a, 0xfa, 0x27, 0x1d, 0x05, 0x30, 0x57, 0x59, 0x12, 0xd1, 0x7b, 0x7b, + 0xbe, 0x7c, 0x98, 0x8c, 0xf5, 0xaa, 0x6a, 0x9a, 0xd3, 0x2a, 0x0d, 0x73, 0xcd, 0x75, 0xbc, 0x43, + 0xd2, 0x3f, 0x69, 0x45, 0xb4, 0x9d, 0xa5, 0xf7, 0x1e, 0xe8, 0x19, 0x55, 0xa0, 0x19, 0xe3, 0x4d, + 0x58, 0x3a, 0xc6, 0x7d, 0x55, 0x58, 0x84, 0xa2, 0xeb, 0x50, 0xc4, 0xe1, 0xa2, 0xa2, 0xd5, 0x17, + 0x36, 0x8b, 0x66, 0x4c, 0x90, 0x85, 0xfd, 0xe3, 0xbf, 0xd6, 0x35, 0xe3, 0x57, 0x1a, 0xe4, 0x5b, + 0xc7, 0x07, 0xd8, 0x09, 0x50, 0x1b, 0xd6, 0xe2, 0xcc, 0xb9, 0x58, 0xd6, 0xd7, 0x27, 0x63, 0xbd, + 0x92, 0x4e, 0xae, 0xa8, 0xae, 0xe3, 0x04, 0x0e, 0x0b, 0xbb, 0x0d, 0x6b, 0x77, 0xc3, 0x6e, 0x11, + 0xa9, 0xca, 0xa6, 0x55, 0x4d, 0xb1, 0x18, 0xe6, 0x6a, 0x44, 0x53, 0xaa, 0x52, 0x6e, 0xee, 0xc1, + 0xa2, 0x3c, 0x2d, 0x45, 0x3b, 0xf0, 0xd2, 0x80, 0xff, 0x10, 0xde, 0x95, 0xb6, 0x6b, 0x33, 0x93, + 0x57, 0xf0, 0xab, 0xf0, 0x49, 0x11, 0xe3, 0x17, 0x59, 0x80, 0xd6, 0xf1, 0xf1, 0x51, 0xe0, 0x0c, + 0xfa, 0x84, 0x7d, 0x9c, 0x9e, 0x1f, 0xc1, 0xd5, 0xd8, 0x2d, 0x1a, 0x58, 0x29, 0xef, 0xeb, 0x93, + 0xb1, 0x7e, 0x3d, 0xed, 0x7d, 0x82, 0xcd, 0x30, 0xaf, 0x44, 0xf4, 0xc3, 0xc0, 0xba, 0x54, 0xab, + 0x4d, 0x59, 0xa4, 0x75, 0x61, 0xb6, 0xd6, 0x04, 0x5b, 0x52, 0x6b, 0x8b, 0xb2, 0xcb, 0xa1, 0x3d, + 0x84, 0x52, 0x0c, 0x09, 0x45, 0x2d, 0x28, 0x30, 0xf5, 0x5b, 0x21, 0x6c, 0xcc, 0x46, 0x38, 0x14, + 0x53, 0x28, 0x47, 0x92, 0xc6, 0x7f, 0x34, 0x80, 0x38, 0x67, 0x5f, 0xcc, 0x14, 0xe3, 0xad, 0x5c, + 0x35, 0xde, 0x85, 0xe7, 0x1a, 0xce, 0x94, 0x74, 0x0a, 0xcf, 0x9f, 0x66, 0xe1, 0xca, 0x9d, 0xb0, + 0xf3, 0xbc, 0xf0, 0x18, 0x1c, 0xc0, 0x22, 0xf1, 0x58, 0xe0, 0x08, 0x10, 0x78, 0xb4, 0xbf, 0x38, + 0x2b, 0xda, 0x97, 0xf8, 0xb4, 0xe7, 0xb1, 0x60, 0xa4, 0x62, 0x1f, 0xaa, 0x49, 0xa1, 0xf1, 0xf3, + 0x05, 0xa8, 0xcc, 0x92, 0x44, 0xbb, 0x50, 0xb6, 0x02, 0x22, 0x08, 0xe1, 0xfd, 0xa1, 0x89, 0xfb, + 0xa3, 0x1a, 0xcf, 0x92, 0x29, 0x06, 0xc3, 0x5c, 0x09, 0x29, 0xea, 0xf6, 0xe8, 0x01, 0x1f, 0xf4, + 0x78, 0xda, 0x71, 0xae, 0x67, 0x9c, 0xec, 0x0c, 0x75, 0x7d, 0x84, 0x46, 0x2e, 0x2a, 0x90, 0xf7, + 0xc7, 0x4a, 0x4c, 0x15, 0x17, 0xc8, 0x0f, 0xa1, 0xec, 0x78, 0x0e, 0x73, 0x70, 0xbf, 0xd3, 0xc5, + 0x7d, 0xec, 0x59, 0xcf, 0x33, 0x27, 0xcb, 0x96, 0xaf, 0xcc, 0xa6, 0xd4, 0x19, 0xe6, 0x8a, 0xa2, + 0x34, 0x25, 0x01, 0xed, 0xc3, 0x62, 0x68, 0x2a, 0xf7, 0x5c, 0xd3, 0x46, 0x28, 0x9e, 0x18, 0xe9, + 0x7e, 0xb6, 0x00, 0x6b, 0x26, 0xb1, 0x3f, 0x09, 0xc5, 0x7c, 0xa1, 0xf8, 0x26, 0x80, 0x2c, 0x77, + 0xde, 0x60, 0x9f, 0x23, 0x1a, 0xbc, 0x61, 0x14, 0xa5, 0x86, 0x16, 0x65, 0x89, 0x78, 0x8c, 0xb3, + 0xb0, 0x94, 0x8c, 0xc7, 0xff, 0xe9, 0xad, 0x84, 0xda, 0x71, 0x27, 0xca, 0x89, 0x4e, 0xf4, 0xf9, + 0x59, 0x9d, 0x68, 0x2a, 0x7b, 0x9f, 0xdc, 0x82, 0xfe, 0x9d, 0x85, 0xfc, 0x01, 0x0e, 0xb0, 0x4b, + 0x91, 0x35, 0x35, 0x69, 0xca, 0xd7, 0xe5, 0xc6, 0x54, 0x7e, 0xb6, 0xd4, 0x07, 0x8a, 0xa7, 0x0c, + 0x9a, 0x1f, 0x5c, 0x32, 0x68, 0x7e, 0x1d, 0x56, 0xf8, 0x03, 0x38, 0xf2, 0x51, 0xa2, 0xbd, 0xdc, + 0xdc, 0x88, 0xb5, 0x5c, 0xdc, 0x97, 0xef, 0xe3, 0xe8, 0x99, 0x45, 0xd1, 0x57, 0xa0, 0xc4, 0x39, + 0xe2, 0xc6, 0xcc, 0xc5, 0xaf, 0xc5, 0x0f, 0xd1, 0xc4, 0xa6, 0x61, 0x82, 0x8b, 0xcf, 0xf7, 0xe4, + 0x02, 0xbd, 0x0d, 0xe8, 0x34, 0xfa, 0x16, 0xd2, 0x89, 0xe1, 0xe4, 0xf2, 0x9f, 0x9e, 0x8c, 0xf5, + 0x0d, 0x29, 0x3f, 0xcd, 0x63, 0x98, 0x6b, 0x31, 0x31, 0xd4, 0xf6, 0x65, 0x00, 0xee, 0x57, 0xc7, + 0x26, 0x9e, 0xef, 0xaa, 0xe7, 0xce, 0xd5, 0xc9, 0x58, 0x5f, 0x93, 0x5a, 0xe2, 0x3d, 0xc3, 0x2c, + 0xf2, 0x45, 0x8b, 0xff, 0x4e, 0x64, 0xf6, 0x87, 0x1a, 0xa0, 0xb8, 0xe5, 0x9b, 0x84, 0x0e, 0xf8, + 0xfb, 0x8c, 0x0f, 0xe2, 0x89, 0xa9, 0x59, 0x7b, 0xf2, 0x20, 0x1e, 0xcb, 0x87, 0x83, 0x78, 0xa2, + 0x52, 0xbe, 0x1a, 0xb7, 0xc7, 0xac, 0x8a, 0xa3, 0x52, 0xd3, 0xc5, 0x94, 0x24, 0x86, 0x79, 0x27, + 0x94, 0x9e, 0xea, 0x87, 0x19, 0xe3, 0x8f, 0x1a, 0x6c, 0x4c, 0x65, 0x54, 0x74, 0xd8, 0xef, 0x03, + 0x0a, 0x12, 0x9b, 0x02, 0xaf, 0x91, 0x3a, 0xf4, 0xdc, 0x09, 0xba, 0x16, 0x4c, 0xf5, 0xdd, 0x8f, + 0xaf, 0xc3, 0xe7, 0x04, 0xe6, 0xbf, 0xd3, 0x60, 0x3d, 0x69, 0x3e, 0x72, 0xe4, 0x36, 0x2c, 0x25, + 0xad, 0x2b, 0x17, 0x5e, 0x7d, 0x16, 0x17, 0xd4, 0xe9, 0x2f, 0xc8, 0xa3, 0x6f, 0xc7, 0xe5, 0x2a, + 0xbf, 0x96, 0xdd, 0x78, 0x66, 0x34, 0xc2, 0x33, 0xa5, 0xcb, 0x36, 0x27, 0xe2, 0xf1, 0x5f, 0x0d, + 0x72, 0x07, 0xbe, 0xdf, 0x47, 0x3e, 0xac, 0x79, 0x3e, 0xeb, 0xf0, 0xcc, 0x22, 0x76, 0x47, 0x3d, + 0xba, 0x65, 0x1f, 0xdc, 0x9d, 0x0f, 0xa4, 0x7f, 0x8e, 0xf5, 0x69, 0x55, 0x66, 0xd9, 0xf3, 0x59, + 0x53, 0x50, 0x8e, 0xe4, 0x93, 0xfc, 0x5d, 0x58, 0xbe, 0x68, 0x4c, 0x76, 0xc9, 0xef, 0xcc, 0x6d, + 0xec, 0xa2, 0x9a, 0xc9, 0x58, 0x5f, 0x8f, 0x2b, 0x26, 0x22, 0x1b, 0xe6, 0x52, 0x37, 0x61, 0x7d, + 0xa7, 0xc0, 0xe3, 0xf7, 0xaf, 0x07, 0xba, 0xf6, 0x85, 0xdf, 0x6a, 0x00, 0xf1, 0x97, 0x07, 0xf4, + 0x3a, 0xbc, 0xdc, 0xfc, 0xd6, 0xed, 0x56, 0xe7, 0xf0, 0xe8, 0xe6, 0xd1, 0x9d, 0xc3, 0xce, 0x9d, + 0xdb, 0x87, 0x07, 0x7b, 0xbb, 0xed, 0x5b, 0xed, 0xbd, 0xd6, 0x6a, 0xa6, 0x5a, 0xbe, 0x77, 0xbf, + 0x5e, 0xba, 0xe3, 0xd1, 0x01, 0xb1, 0x9c, 0x13, 0x87, 0xd8, 0xe8, 0x35, 0x58, 0xbf, 0xc8, 0xcd, + 0x57, 0x7b, 0xad, 0x55, 0xad, 0xba, 0x74, 0xef, 0x7e, 0xbd, 0x20, 0x67, 0x31, 0x62, 0xa3, 0x4d, + 0xb8, 0x3a, 0xcd, 0xd7, 0xbe, 0xfd, 0x8d, 0xd5, 0x6c, 0x75, 0xf9, 0xde, 0xfd, 0x7a, 0x31, 0x1a, + 0xda, 0x90, 0x01, 0x28, 0xc9, 0xa9, 0xf4, 0x2d, 0x54, 0xe1, 0xde, 0xfd, 0x7a, 0x5e, 0x02, 0x58, + 0xcd, 0xbd, 0xf7, 0x61, 0x2d, 0xd3, 0xbc, 0xf5, 0xd1, 0xa3, 0x9a, 0xf6, 0xf0, 0x51, 0x4d, 0xfb, + 0xfb, 0xa3, 0x9a, 0xf6, 0xfe, 0xe3, 0x5a, 0xe6, 0xe1, 0xe3, 0x5a, 0xe6, 0xcf, 0x8f, 0x6b, 0x99, + 0xef, 0xbe, 0xfe, 0x44, 0xec, 0xce, 0xa3, 0xcf, 0xd8, 0x02, 0xc5, 0x6e, 0x5e, 0xb4, 0xe1, 0x2f, + 0xfd, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x42, 0xbc, 0xa2, 0xf2, 0xe5, 0x16, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1211,582 +1215,605 @@ 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{ - // 9194 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x5c, 0xd7, - 0x75, 0x18, 0xdf, 0x7e, 0x00, 0xbb, 0x07, 0x0b, 0x60, 0x71, 0x01, 0x82, 0xcb, 0x25, 0x09, 0x40, - 0x4f, 0xb2, 0x44, 0x51, 0x12, 0x20, 0x51, 0x22, 0x45, 0x2e, 0x63, 0xc9, 0x58, 0xec, 0x12, 0x04, - 0x89, 0x2f, 0x3d, 0x00, 0x94, 0x3f, 0x92, 0xee, 0x3c, 0xbc, 0xbd, 0x58, 0x3c, 0x71, 0xf7, 0xbd, - 0xa7, 0xf7, 0xde, 0x92, 0x80, 0x6c, 0xcf, 0x28, 0xb1, 0xeb, 0xda, 0x4a, 0x53, 0xdb, 0x71, 0x26, - 0xb5, 0x65, 0xd3, 0x95, 0xe3, 0xb4, 0x4e, 0x9d, 0xb4, 0xf9, 0x70, 0xea, 0x36, 0x6d, 0x67, 0xea, - 0x74, 0x9a, 0xc6, 0x69, 0x67, 0x32, 0xd2, 0x34, 0x33, 0x4d, 0x33, 0x0d, 0x93, 0xca, 0x9a, 0x54, - 0x75, 0xdd, 0xc6, 0x61, 0xd5, 0x36, 0x1d, 0xcf, 0xb4, 0x9d, 0xfb, 0xf5, 0xbe, 0x76, 0x17, 0xbb, - 0x80, 0x48, 0xc9, 0x69, 0xfa, 0x0b, 0x7b, 0xcf, 0x3d, 0xe7, 0xdc, 0x73, 0xce, 0x3d, 0xf7, 0xdc, - 0x73, 0xcf, 0xbb, 0xef, 0x01, 0xbe, 0x78, 0x01, 0xa6, 0x6a, 0xa6, 0x59, 0xab, 0xe3, 0x19, 0xcb, - 0x36, 0x5d, 0x73, 0xb3, 0xb9, 0x35, 0x53, 0xc5, 0x8e, 0x66, 0xeb, 0x96, 0x6b, 0xda, 0xd3, 0x14, - 0x86, 0x86, 0x19, 0xc6, 0xb4, 0xc0, 0x90, 0x97, 0x60, 0xe4, 0xa2, 0x5e, 0xc7, 0x25, 0x0f, 0x71, - 0x0d, 0xbb, 0xe8, 0x1c, 0x24, 0xb6, 0xf4, 0x3a, 0xce, 0x49, 0x53, 0xf1, 0x93, 0x03, 0xa7, 0xef, - 0x9b, 0x8e, 0x10, 0x4d, 0x87, 0x29, 0x56, 0x09, 0x58, 0xa1, 0x14, 0xf2, 0x1b, 0x09, 0x18, 0x6d, - 0xd3, 0x8b, 0x10, 0x24, 0x0c, 0xb5, 0x41, 0x38, 0x4a, 0x27, 0xd3, 0x0a, 0xfd, 0x8d, 0x72, 0xd0, - 0x6f, 0xa9, 0xda, 0x35, 0xb5, 0x86, 0x73, 0x31, 0x0a, 0x16, 0x4d, 0x34, 0x01, 0x50, 0xc5, 0x16, - 0x36, 0xaa, 0xd8, 0xd0, 0x76, 0x73, 0xf1, 0xa9, 0xf8, 0xc9, 0xb4, 0x12, 0x80, 0xa0, 0x87, 0x60, - 0xc4, 0x6a, 0x6e, 0xd6, 0x75, 0xad, 0x12, 0x40, 0x83, 0xa9, 0xf8, 0xc9, 0xa4, 0x92, 0x65, 0x1d, - 0x25, 0x1f, 0xf9, 0x01, 0x18, 0xbe, 0x81, 0xd5, 0x6b, 0x41, 0xd4, 0x01, 0x8a, 0x3a, 0x44, 0xc0, - 0x01, 0xc4, 0x39, 0xc8, 0x34, 0xb0, 0xe3, 0xa8, 0x35, 0x5c, 0x71, 0x77, 0x2d, 0x9c, 0x4b, 0x50, - 0xed, 0xa7, 0x5a, 0xb4, 0x8f, 0x6a, 0x3e, 0xc0, 0xa9, 0xd6, 0x77, 0x2d, 0x8c, 0x66, 0x21, 0x8d, - 0x8d, 0x66, 0x83, 0x71, 0x48, 0x76, 0xb0, 0x5f, 0xd9, 0x68, 0x36, 0xa2, 0x5c, 0x52, 0x84, 0x8c, - 0xb3, 0xe8, 0x77, 0xb0, 0x7d, 0x5d, 0xd7, 0x70, 0xae, 0x8f, 0x32, 0x78, 0xa0, 0x85, 0xc1, 0x1a, - 0xeb, 0x8f, 0xf2, 0x10, 0x74, 0x68, 0x0e, 0xd2, 0x78, 0xc7, 0xc5, 0x86, 0xa3, 0x9b, 0x46, 0xae, - 0x9f, 0x32, 0x79, 0x4f, 0x9b, 0x59, 0xc4, 0xf5, 0x6a, 0x94, 0x85, 0x4f, 0x87, 0xce, 0x42, 0xbf, - 0x69, 0xb9, 0xba, 0x69, 0x38, 0xb9, 0xd4, 0x94, 0x74, 0x72, 0xe0, 0xf4, 0xf1, 0xb6, 0x8e, 0xb0, - 0xc2, 0x70, 0x14, 0x81, 0x8c, 0x16, 0x20, 0xeb, 0x98, 0x4d, 0x5b, 0xc3, 0x15, 0xcd, 0xac, 0xe2, - 0x8a, 0x6e, 0x6c, 0x99, 0xb9, 0x34, 0x65, 0x30, 0xd9, 0xaa, 0x08, 0x45, 0x9c, 0x33, 0xab, 0x78, - 0xc1, 0xd8, 0x32, 0x95, 0x21, 0x27, 0xd4, 0x46, 0xe3, 0xd0, 0xe7, 0xec, 0x1a, 0xae, 0xba, 0x93, - 0xcb, 0x50, 0x0f, 0xe1, 0x2d, 0xf9, 0x37, 0xfa, 0x60, 0xb8, 0x17, 0x17, 0xbb, 0x00, 0xc9, 0x2d, - 0xa2, 0x65, 0x2e, 0xb6, 0x1f, 0x1b, 0x30, 0x9a, 0xb0, 0x11, 0xfb, 0x0e, 0x68, 0xc4, 0x59, 0x18, - 0x30, 0xb0, 0xe3, 0xe2, 0x2a, 0xf3, 0x88, 0x78, 0x8f, 0x3e, 0x05, 0x8c, 0xa8, 0xd5, 0xa5, 0x12, - 0x07, 0x72, 0xa9, 0xf7, 0xc3, 0xb0, 0x27, 0x52, 0xc5, 0x56, 0x8d, 0x9a, 0xf0, 0xcd, 0x99, 0x6e, - 0x92, 0x4c, 0x97, 0x05, 0x9d, 0x42, 0xc8, 0x94, 0x21, 0x1c, 0x6a, 0xa3, 0x12, 0x80, 0x69, 0x60, - 0x73, 0xab, 0x52, 0xc5, 0x5a, 0x3d, 0x97, 0xea, 0x60, 0xa5, 0x15, 0x82, 0xd2, 0x62, 0x25, 0x93, - 0x41, 0xb5, 0x3a, 0x3a, 0xef, 0xbb, 0x5a, 0x7f, 0x07, 0x4f, 0x59, 0x62, 0x8b, 0xac, 0xc5, 0xdb, - 0x36, 0x60, 0xc8, 0xc6, 0xc4, 0xef, 0x71, 0x95, 0x6b, 0x96, 0xa6, 0x42, 0x4c, 0x77, 0xd5, 0x4c, - 0xe1, 0x64, 0x4c, 0xb1, 0x41, 0x3b, 0xd8, 0x44, 0xf7, 0x82, 0x07, 0xa8, 0x50, 0xb7, 0x02, 0x1a, - 0x85, 0x32, 0x02, 0xb8, 0xac, 0x36, 0x70, 0xfe, 0x05, 0x18, 0x0a, 0x9b, 0x07, 0x8d, 0x41, 0xd2, - 0x71, 0x55, 0xdb, 0xa5, 0x5e, 0x98, 0x54, 0x58, 0x03, 0x65, 0x21, 0x8e, 0x8d, 0x2a, 0x8d, 0x72, - 0x49, 0x85, 0xfc, 0x44, 0xef, 0xf3, 0x15, 0x8e, 0x53, 0x85, 0xef, 0x6f, 0x9d, 0xd1, 0x10, 0xe7, - 0xa8, 0xde, 0xf9, 0x27, 0x61, 0x30, 0xa4, 0x40, 0xaf, 0x43, 0xcb, 0x1f, 0x81, 0xc3, 0x6d, 0x59, - 0xa3, 0xf7, 0xc3, 0x58, 0xd3, 0xd0, 0x0d, 0x17, 0xdb, 0x96, 0x8d, 0x89, 0xc7, 0xb2, 0xa1, 0x72, - 0xff, 0xb1, 0xbf, 0x83, 0xcf, 0x6d, 0x04, 0xb1, 0x19, 0x17, 0x65, 0xb4, 0xd9, 0x0a, 0x3c, 0x95, - 0x4e, 0xbd, 0xd9, 0x9f, 0x7d, 0xf1, 0xc5, 0x17, 0x5f, 0x8c, 0xc9, 0x9f, 0xef, 0x83, 0xb1, 0x76, - 0x6b, 0xa6, 0xed, 0xf2, 0x1d, 0x87, 0x3e, 0xa3, 0xd9, 0xd8, 0xc4, 0x36, 0x35, 0x52, 0x52, 0xe1, - 0x2d, 0x34, 0x0b, 0xc9, 0xba, 0xba, 0x89, 0xeb, 0xb9, 0xc4, 0x94, 0x74, 0x72, 0xe8, 0xf4, 0x43, - 0x3d, 0xad, 0xca, 0xe9, 0x45, 0x42, 0xa2, 0x30, 0x4a, 0xf4, 0x14, 0x24, 0x78, 0x88, 0x26, 0x1c, - 0x4e, 0xf5, 0xc6, 0x81, 0xac, 0x25, 0x85, 0xd2, 0xa1, 0x63, 0x90, 0x26, 0x7f, 0x99, 0x6f, 0xf4, - 0x51, 0x99, 0x53, 0x04, 0x40, 0xfc, 0x02, 0xe5, 0x21, 0x45, 0x97, 0x49, 0x15, 0x8b, 0xad, 0xcd, - 0x6b, 0x13, 0xc7, 0xaa, 0xe2, 0x2d, 0xb5, 0x59, 0x77, 0x2b, 0xd7, 0xd5, 0x7a, 0x13, 0x53, 0x87, - 0x4f, 0x2b, 0x19, 0x0e, 0xbc, 0x4a, 0x60, 0x68, 0x12, 0x06, 0xd8, 0xaa, 0xd2, 0x8d, 0x2a, 0xde, - 0xa1, 0xd1, 0x33, 0xa9, 0xb0, 0x85, 0xb6, 0x40, 0x20, 0x64, 0xf8, 0xe7, 0x1c, 0xd3, 0x10, 0xae, - 0x49, 0x87, 0x20, 0x00, 0x3a, 0xfc, 0x93, 0xd1, 0xc0, 0x7d, 0xa2, 0xbd, 0x7a, 0x51, 0x9f, 0x92, - 0xbf, 0x19, 0x83, 0x04, 0x8d, 0x17, 0xc3, 0x30, 0xb0, 0xfe, 0x81, 0xd5, 0x72, 0xa5, 0xb4, 0xb2, - 0x51, 0x5c, 0x2c, 0x67, 0x25, 0x34, 0x04, 0x40, 0x01, 0x17, 0x17, 0x57, 0x66, 0xd7, 0xb3, 0x31, - 0xaf, 0xbd, 0xb0, 0xbc, 0x7e, 0xf6, 0x89, 0x6c, 0xdc, 0x23, 0xd8, 0x60, 0x80, 0x44, 0x10, 0xe1, - 0xf1, 0xd3, 0xd9, 0x24, 0xca, 0x42, 0x86, 0x31, 0x58, 0x78, 0x7f, 0xb9, 0x74, 0xf6, 0x89, 0x6c, - 0x5f, 0x18, 0xf2, 0xf8, 0xe9, 0x6c, 0x3f, 0x1a, 0x84, 0x34, 0x85, 0x14, 0x57, 0x56, 0x16, 0xb3, - 0x29, 0x8f, 0xe7, 0xda, 0xba, 0xb2, 0xb0, 0x3c, 0x9f, 0x4d, 0x7b, 0x3c, 0xe7, 0x95, 0x95, 0x8d, - 0xd5, 0x2c, 0x78, 0x1c, 0x96, 0xca, 0x6b, 0x6b, 0xb3, 0xf3, 0xe5, 0xec, 0x80, 0x87, 0x51, 0xfc, - 0xc0, 0x7a, 0x79, 0x2d, 0x9b, 0x09, 0x89, 0xf5, 0xf8, 0xe9, 0xec, 0xa0, 0x37, 0x44, 0x79, 0x79, - 0x63, 0x29, 0x3b, 0x84, 0x46, 0x60, 0x90, 0x0d, 0x21, 0x84, 0x18, 0x8e, 0x80, 0xce, 0x3e, 0x91, - 0xcd, 0xfa, 0x82, 0x30, 0x2e, 0x23, 0x21, 0xc0, 0xd9, 0x27, 0xb2, 0x48, 0x9e, 0x83, 0x24, 0xf5, - 0x2e, 0x84, 0x60, 0x68, 0x71, 0xb6, 0x58, 0x5e, 0xac, 0xac, 0xac, 0xae, 0x2f, 0xac, 0x2c, 0xcf, - 0x2e, 0x66, 0x25, 0x1f, 0xa6, 0x94, 0x9f, 0xd9, 0x58, 0x50, 0xca, 0xa5, 0x6c, 0x2c, 0x08, 0x5b, - 0x2d, 0xcf, 0xae, 0x97, 0x4b, 0xd9, 0xb8, 0xac, 0xc1, 0x58, 0xbb, 0x38, 0xd9, 0x76, 0x65, 0x04, - 0xa6, 0x38, 0xd6, 0x61, 0x8a, 0x29, 0xaf, 0x96, 0x29, 0xfe, 0x4e, 0x0c, 0x46, 0xdb, 0xec, 0x15, - 0x6d, 0x07, 0x79, 0x1a, 0x92, 0xcc, 0x45, 0xd9, 0xee, 0xf9, 0x60, 0xdb, 0x4d, 0x87, 0x3a, 0x6c, - 0xcb, 0x0e, 0x4a, 0xe9, 0x82, 0x19, 0x44, 0xbc, 0x43, 0x06, 0x41, 0x58, 0xb4, 0xc4, 0xf4, 0x1f, - 0x6b, 0x89, 0xe9, 0x6c, 0xdb, 0x3b, 0xdb, 0xcb, 0xb6, 0x47, 0x61, 0xfb, 0x8b, 0xed, 0xc9, 0x36, - 0xb1, 0xfd, 0x02, 0x8c, 0xb4, 0x30, 0xea, 0x39, 0xc6, 0x7e, 0x4c, 0x82, 0x5c, 0x27, 0xe3, 0x74, - 0x89, 0x74, 0xb1, 0x50, 0xa4, 0xbb, 0x10, 0xb5, 0xe0, 0x3d, 0x9d, 0x27, 0xa1, 0x65, 0xae, 0xbf, - 0x26, 0xc1, 0x78, 0xfb, 0x4c, 0xb1, 0xad, 0x0c, 0x4f, 0x41, 0x5f, 0x03, 0xbb, 0xdb, 0xa6, 0xc8, - 0x96, 0xee, 0x6f, 0xb3, 0x07, 0x93, 0xee, 0xe8, 0x64, 0x73, 0xaa, 0xe0, 0x26, 0x1e, 0xef, 0x94, - 0xee, 0x31, 0x69, 0x5a, 0x24, 0xfd, 0x54, 0x0c, 0x0e, 0xb7, 0x65, 0xde, 0x56, 0xd0, 0x13, 0x00, - 0xba, 0x61, 0x35, 0x5d, 0x96, 0x11, 0xb1, 0x00, 0x9b, 0xa6, 0x10, 0x1a, 0xbc, 0x48, 0xf0, 0x6c, - 0xba, 0x5e, 0x7f, 0x9c, 0xf6, 0x03, 0x03, 0x51, 0x84, 0x73, 0xbe, 0xa0, 0x09, 0x2a, 0xe8, 0x44, - 0x07, 0x4d, 0x5b, 0x1c, 0xf3, 0x51, 0xc8, 0x6a, 0x75, 0x1d, 0x1b, 0x6e, 0xc5, 0x71, 0x6d, 0xac, - 0x36, 0x74, 0xa3, 0x46, 0x77, 0x90, 0x54, 0x21, 0xb9, 0xa5, 0xd6, 0x1d, 0xac, 0x0c, 0xb3, 0xee, - 0x35, 0xd1, 0x4b, 0x28, 0xa8, 0x03, 0xd9, 0x01, 0x8a, 0xbe, 0x10, 0x05, 0xeb, 0xf6, 0x28, 0xe4, - 0x9f, 0x4e, 0xc3, 0x40, 0x20, 0xaf, 0x46, 0xf7, 0x40, 0xe6, 0x39, 0xf5, 0xba, 0x5a, 0x11, 0x67, - 0x25, 0x66, 0x89, 0x01, 0x02, 0x5b, 0xe5, 0xe7, 0xa5, 0x47, 0x61, 0x8c, 0xa2, 0x98, 0x4d, 0x17, - 0xdb, 0x15, 0xad, 0xae, 0x3a, 0x0e, 0x35, 0x5a, 0x8a, 0xa2, 0x22, 0xd2, 0xb7, 0x42, 0xba, 0xe6, - 0x44, 0x0f, 0x3a, 0x03, 0xa3, 0x94, 0xa2, 0xd1, 0xac, 0xbb, 0xba, 0x55, 0xc7, 0x15, 0x72, 0x7a, - 0x73, 0xe8, 0x4e, 0xe2, 0x49, 0x36, 0x42, 0x30, 0x96, 0x38, 0x02, 0x91, 0xc8, 0x41, 0x25, 0x38, - 0x41, 0xc9, 0x6a, 0xd8, 0xc0, 0xb6, 0xea, 0xe2, 0x0a, 0x7e, 0xbe, 0xa9, 0xd6, 0x9d, 0x8a, 0x6a, - 0x54, 0x2b, 0xdb, 0xaa, 0xb3, 0x9d, 0x1b, 0x23, 0x0c, 0x8a, 0xb1, 0x9c, 0xa4, 0x1c, 0x25, 0x88, - 0xf3, 0x1c, 0xaf, 0x4c, 0xd1, 0x66, 0x8d, 0xea, 0x25, 0xd5, 0xd9, 0x46, 0x05, 0x18, 0xa7, 0x5c, - 0x1c, 0xd7, 0xd6, 0x8d, 0x5a, 0x45, 0xdb, 0xc6, 0xda, 0xb5, 0x4a, 0xd3, 0xdd, 0x3a, 0x97, 0x3b, - 0x16, 0x1c, 0x9f, 0x4a, 0xb8, 0x46, 0x71, 0xe6, 0x08, 0xca, 0x86, 0xbb, 0x75, 0x0e, 0xad, 0x41, - 0x86, 0x4c, 0x46, 0x43, 0x7f, 0x01, 0x57, 0xb6, 0x4c, 0x9b, 0x6e, 0x8d, 0x43, 0x6d, 0x42, 0x53, - 0xc0, 0x82, 0xd3, 0x2b, 0x9c, 0x60, 0xc9, 0xac, 0xe2, 0x42, 0x72, 0x6d, 0xb5, 0x5c, 0x2e, 0x29, - 0x03, 0x82, 0xcb, 0x45, 0xd3, 0x26, 0x0e, 0x55, 0x33, 0x3d, 0x03, 0x0f, 0x30, 0x87, 0xaa, 0x99, - 0xc2, 0xbc, 0x67, 0x60, 0x54, 0xd3, 0x98, 0xce, 0xba, 0x56, 0xe1, 0x67, 0x2c, 0x27, 0x97, 0x0d, - 0x19, 0x4b, 0xd3, 0xe6, 0x19, 0x02, 0xf7, 0x71, 0x07, 0x9d, 0x87, 0xc3, 0xbe, 0xb1, 0x82, 0x84, - 0x23, 0x2d, 0x5a, 0x46, 0x49, 0xcf, 0xc0, 0xa8, 0xb5, 0xdb, 0x4a, 0x88, 0x42, 0x23, 0x5a, 0xbb, - 0x51, 0xb2, 0x27, 0x61, 0xcc, 0xda, 0xb6, 0x5a, 0xe9, 0x4e, 0x05, 0xe9, 0x90, 0xb5, 0x6d, 0x45, - 0x09, 0xdf, 0x43, 0x0f, 0xdc, 0x36, 0xd6, 0x54, 0x17, 0x57, 0x73, 0x47, 0x82, 0xe8, 0x81, 0x0e, - 0x34, 0x03, 0x59, 0x4d, 0xab, 0x60, 0x43, 0xdd, 0xac, 0xe3, 0x8a, 0x6a, 0x63, 0x43, 0x75, 0x72, - 0x93, 0x41, 0xe4, 0x21, 0x4d, 0x2b, 0xd3, 0xde, 0x59, 0xda, 0x89, 0x4e, 0xc1, 0x88, 0xb9, 0xf9, - 0x9c, 0xc6, 0x5c, 0xb2, 0x62, 0xd9, 0x78, 0x4b, 0xdf, 0xc9, 0xdd, 0x47, 0xed, 0x3b, 0x4c, 0x3a, - 0xa8, 0x43, 0xae, 0x52, 0x30, 0x7a, 0x10, 0xb2, 0x9a, 0xb3, 0xad, 0xda, 0x16, 0x8d, 0xc9, 0x8e, - 0xa5, 0x6a, 0x38, 0xf7, 0x1e, 0x86, 0xca, 0xe0, 0xcb, 0x02, 0x4c, 0x96, 0x84, 0x73, 0x43, 0xdf, - 0x72, 0x05, 0xc7, 0x07, 0xd8, 0x92, 0xa0, 0x30, 0xce, 0xed, 0x24, 0x64, 0x89, 0x29, 0x42, 0x03, - 0x9f, 0xa4, 0x68, 0x43, 0xd6, 0xb6, 0x15, 0x1c, 0xf7, 0x5e, 0x18, 0x24, 0x98, 0xfe, 0xa0, 0x0f, - 0xb2, 0x84, 0xcc, 0xda, 0x0e, 0x8c, 0xf8, 0x04, 0x8c, 0x13, 0xa4, 0x06, 0x76, 0xd5, 0xaa, 0xea, - 0xaa, 0x01, 0xec, 0x87, 0x29, 0x36, 0xb1, 0xfb, 0x12, 0xef, 0x0c, 0xc9, 0x69, 0x37, 0x37, 0x77, - 0x3d, 0xcf, 0x7a, 0x84, 0xc9, 0x49, 0x60, 0xc2, 0xb7, 0xee, 0x5a, 0xd2, 0x2d, 0x17, 0x20, 0x13, - 0x74, 0x7c, 0x94, 0x06, 0xe6, 0xfa, 0x59, 0x89, 0x64, 0x41, 0x73, 0x2b, 0x25, 0x92, 0xbf, 0x7c, - 0xb0, 0x9c, 0x8d, 0x91, 0x3c, 0x6a, 0x71, 0x61, 0xbd, 0x5c, 0x51, 0x36, 0x96, 0xd7, 0x17, 0x96, - 0xca, 0xd9, 0x78, 0x20, 0x61, 0xbf, 0x9c, 0x48, 0xdd, 0x9f, 0x7d, 0x40, 0x7e, 0x2d, 0x06, 0x43, - 0xe1, 0x13, 0x18, 0xfa, 0x11, 0x38, 0x22, 0xca, 0x25, 0x0e, 0x76, 0x2b, 0x37, 0x74, 0x9b, 0xae, - 0xc8, 0x86, 0xca, 0x76, 0x47, 0xcf, 0x27, 0xc6, 0x38, 0xd6, 0x1a, 0x76, 0x9f, 0xd5, 0x6d, 0xb2, - 0xde, 0x1a, 0xaa, 0x8b, 0x16, 0x61, 0xd2, 0x30, 0x2b, 0x8e, 0xab, 0x1a, 0x55, 0xd5, 0xae, 0x56, - 0xfc, 0x42, 0x55, 0x45, 0xd5, 0x34, 0xec, 0x38, 0x26, 0xdb, 0x09, 0x3d, 0x2e, 0xc7, 0x0d, 0x73, - 0x8d, 0x23, 0xfb, 0x5b, 0xc4, 0x2c, 0x47, 0x8d, 0xf8, 0x6f, 0xbc, 0x93, 0xff, 0x1e, 0x83, 0x74, - 0x43, 0xb5, 0x2a, 0xd8, 0x70, 0xed, 0x5d, 0x9a, 0x77, 0xa7, 0x94, 0x54, 0x43, 0xb5, 0xca, 0xa4, - 0xfd, 0x8e, 0x1c, 0x7f, 0x2e, 0x27, 0x52, 0xa9, 0x6c, 0xfa, 0x72, 0x22, 0x95, 0xce, 0x82, 0xfc, - 0x7a, 0x1c, 0x32, 0xc1, 0x3c, 0x9c, 0x1c, 0x6b, 0x34, 0xba, 0x65, 0x49, 0x34, 0xa8, 0xdd, 0xbb, - 0x67, 0xd6, 0x3e, 0x3d, 0x47, 0xf6, 0xb2, 0x42, 0x1f, 0xcb, 0x8e, 0x15, 0x46, 0x49, 0xf2, 0x08, - 0xe2, 0x6c, 0x98, 0x65, 0x23, 0x29, 0x85, 0xb7, 0xd0, 0x3c, 0xf4, 0x3d, 0xe7, 0x50, 0xde, 0x7d, - 0x94, 0xf7, 0x7d, 0x7b, 0xf3, 0xbe, 0xbc, 0x46, 0x99, 0xa7, 0x2f, 0xaf, 0x55, 0x96, 0x57, 0x94, - 0xa5, 0xd9, 0x45, 0x85, 0x93, 0xa3, 0xa3, 0x90, 0xa8, 0xab, 0x2f, 0xec, 0x86, 0x77, 0x3d, 0x0a, - 0xea, 0x75, 0x12, 0x8e, 0x42, 0xe2, 0x06, 0x56, 0xaf, 0x85, 0xf7, 0x1a, 0x0a, 0xba, 0x8b, 0x8b, - 0x61, 0x06, 0x92, 0xd4, 0x5e, 0x08, 0x80, 0x5b, 0x2c, 0x7b, 0x08, 0xa5, 0x20, 0x31, 0xb7, 0xa2, - 0x90, 0x05, 0x91, 0x85, 0x0c, 0x83, 0x56, 0x56, 0x17, 0xca, 0x73, 0xe5, 0x6c, 0x4c, 0x3e, 0x03, - 0x7d, 0xcc, 0x08, 0x64, 0xb1, 0x78, 0x66, 0xc8, 0x1e, 0xe2, 0x4d, 0xce, 0x43, 0x12, 0xbd, 0x1b, - 0x4b, 0xc5, 0xb2, 0x92, 0x8d, 0x85, 0xa7, 0x3a, 0x91, 0x4d, 0xca, 0x0e, 0x64, 0x82, 0x89, 0xf8, - 0x3b, 0x73, 0xc8, 0xfe, 0x96, 0x04, 0x03, 0x81, 0xc4, 0x9a, 0x64, 0x44, 0x6a, 0xbd, 0x6e, 0xde, - 0xa8, 0xa8, 0x75, 0x5d, 0x75, 0xb8, 0x6b, 0x00, 0x05, 0xcd, 0x12, 0x48, 0xaf, 0x53, 0xf7, 0x0e, - 0x2d, 0x91, 0x64, 0xb6, 0x4f, 0xfe, 0xb2, 0x04, 0xd9, 0x68, 0x66, 0x1b, 0x11, 0x53, 0x7a, 0x37, - 0xc5, 0x94, 0xbf, 0x24, 0xc1, 0x50, 0x38, 0x9d, 0x8d, 0x88, 0x77, 0xcf, 0xbb, 0x2a, 0xde, 0x1f, - 0xc7, 0x60, 0x30, 0x94, 0xc4, 0xf6, 0x2a, 0xdd, 0xf3, 0x30, 0xa2, 0x57, 0x71, 0xc3, 0x32, 0x5d, - 0x6c, 0x68, 0xbb, 0x95, 0x3a, 0xbe, 0x8e, 0xeb, 0x39, 0x99, 0x06, 0x8d, 0x99, 0xbd, 0xd3, 0xe4, - 0xe9, 0x05, 0x9f, 0x6e, 0x91, 0x90, 0x15, 0x46, 0x17, 0x4a, 0xe5, 0xa5, 0xd5, 0x95, 0xf5, 0xf2, - 0xf2, 0xdc, 0x07, 0x2a, 0x1b, 0xcb, 0x57, 0x96, 0x57, 0x9e, 0x5d, 0x56, 0xb2, 0x7a, 0x04, 0xed, - 0x2e, 0x2e, 0xfb, 0x55, 0xc8, 0x46, 0x85, 0x42, 0x47, 0xa0, 0x9d, 0x58, 0xd9, 0x43, 0x68, 0x14, - 0x86, 0x97, 0x57, 0x2a, 0x6b, 0x0b, 0xa5, 0x72, 0xa5, 0x7c, 0xf1, 0x62, 0x79, 0x6e, 0x7d, 0x8d, - 0x15, 0x3e, 0x3c, 0xec, 0xf5, 0xd0, 0x02, 0x97, 0x5f, 0x8e, 0xc3, 0x68, 0x1b, 0x49, 0xd0, 0x2c, - 0x3f, 0xb2, 0xb0, 0x53, 0xd4, 0x23, 0xbd, 0x48, 0x3f, 0x4d, 0x72, 0x86, 0x55, 0xd5, 0x76, 0xf9, - 0x09, 0xe7, 0x41, 0x20, 0x56, 0x32, 0x5c, 0x7d, 0x4b, 0xc7, 0x36, 0xaf, 0x13, 0xb1, 0x73, 0xcc, - 0xb0, 0x0f, 0x67, 0xa5, 0xa2, 0x87, 0x01, 0x59, 0xa6, 0xa3, 0xbb, 0xfa, 0x75, 0x5c, 0xd1, 0x0d, - 0x51, 0x54, 0x22, 0xe7, 0x9a, 0x84, 0x92, 0x15, 0x3d, 0x0b, 0x86, 0xeb, 0x61, 0x1b, 0xb8, 0xa6, - 0x46, 0xb0, 0x49, 0x30, 0x8f, 0x2b, 0x59, 0xd1, 0xe3, 0x61, 0xdf, 0x03, 0x99, 0xaa, 0xd9, 0x24, - 0xc9, 0x1e, 0xc3, 0x23, 0x7b, 0x87, 0xa4, 0x0c, 0x30, 0x98, 0x87, 0xc2, 0xd3, 0x78, 0xbf, 0x9a, - 0x95, 0x51, 0x06, 0x18, 0x8c, 0xa1, 0x3c, 0x00, 0xc3, 0x6a, 0xad, 0x66, 0x13, 0xe6, 0x82, 0x11, - 0x3b, 0x98, 0x0c, 0x79, 0x60, 0x8a, 0x98, 0xbf, 0x0c, 0x29, 0x61, 0x07, 0xb2, 0x55, 0x13, 0x4b, - 0x54, 0x2c, 0x76, 0xda, 0x8e, 0x9d, 0x4c, 0x2b, 0x29, 0x43, 0x74, 0xde, 0x03, 0x19, 0xdd, 0xa9, - 0xf8, 0xc5, 0xf9, 0xd8, 0x54, 0xec, 0x64, 0x4a, 0x19, 0xd0, 0x1d, 0xaf, 0xb0, 0x29, 0x7f, 0x2d, - 0x06, 0x43, 0xe1, 0x87, 0x0b, 0xa8, 0x04, 0xa9, 0xba, 0xa9, 0xa9, 0xd4, 0xb5, 0xd8, 0x93, 0xad, - 0x93, 0x5d, 0x9e, 0x47, 0x4c, 0x2f, 0x72, 0x7c, 0xc5, 0xa3, 0xcc, 0xff, 0xae, 0x04, 0x29, 0x01, - 0x46, 0xe3, 0x90, 0xb0, 0x54, 0x77, 0x9b, 0xb2, 0x4b, 0x16, 0x63, 0x59, 0x49, 0xa1, 0x6d, 0x02, - 0x77, 0x2c, 0xd5, 0xa0, 0x2e, 0xc0, 0xe1, 0xa4, 0x4d, 0xe6, 0xb5, 0x8e, 0xd5, 0x2a, 0x3d, 0xf5, - 0x98, 0x8d, 0x06, 0x36, 0x5c, 0x47, 0xcc, 0x2b, 0x87, 0xcf, 0x71, 0x30, 0x7a, 0x08, 0x46, 0x5c, - 0x5b, 0xd5, 0xeb, 0x21, 0xdc, 0x04, 0xc5, 0xcd, 0x8a, 0x0e, 0x0f, 0xb9, 0x00, 0x47, 0x05, 0xdf, - 0x2a, 0x76, 0x55, 0x6d, 0x1b, 0x57, 0x7d, 0xa2, 0x3e, 0x5a, 0xdd, 0x38, 0xc2, 0x11, 0x4a, 0xbc, - 0x5f, 0xd0, 0xca, 0xaf, 0x49, 0x30, 0x22, 0xce, 0x69, 0x55, 0xcf, 0x58, 0x4b, 0x00, 0xaa, 0x61, - 0x98, 0x6e, 0xd0, 0x5c, 0xad, 0xae, 0xdc, 0x42, 0x37, 0x3d, 0xeb, 0x11, 0x29, 0x01, 0x06, 0xf9, - 0x06, 0x80, 0xdf, 0xd3, 0xd1, 0x6c, 0x93, 0x30, 0xc0, 0x9f, 0x1c, 0xd1, 0xc7, 0x8f, 0xec, 0x64, - 0x0f, 0x0c, 0x44, 0x0e, 0x74, 0x68, 0x0c, 0x92, 0x9b, 0xb8, 0xa6, 0x1b, 0xbc, 0x1e, 0xcc, 0x1a, - 0xa2, 0xfe, 0x92, 0xf0, 0xea, 0x2f, 0xc5, 0x4f, 0x4b, 0x30, 0xaa, 0x99, 0x8d, 0xa8, 0xbc, 0xc5, - 0x6c, 0xa4, 0xbc, 0xe0, 0x5c, 0x92, 0x3e, 0xf8, 0x54, 0x4d, 0x77, 0xb7, 0x9b, 0x9b, 0xd3, 0x9a, - 0xd9, 0x98, 0xa9, 0x99, 0x75, 0xd5, 0xa8, 0xf9, 0xcf, 0x4f, 0xe9, 0x0f, 0xed, 0x91, 0x1a, 0x36, - 0x1e, 0xa9, 0x99, 0x81, 0xa7, 0xa9, 0x17, 0xfc, 0x9f, 0x7f, 0x2e, 0x49, 0x3f, 0x17, 0x8b, 0xcf, - 0xaf, 0x16, 0xbf, 0x1e, 0xcb, 0xcf, 0xb3, 0xe1, 0x56, 0x85, 0x79, 0x14, 0xbc, 0x55, 0xc7, 0x1a, - 0x51, 0x19, 0xbe, 0xfb, 0x10, 0x8c, 0xd5, 0xcc, 0x9a, 0x49, 0x39, 0xce, 0x90, 0x5f, 0xfc, 0x89, - 0x6c, 0xda, 0x83, 0xe6, 0xbb, 0x3e, 0xbe, 0x2d, 0x2c, 0xc3, 0x28, 0x47, 0xae, 0xd0, 0x47, 0x42, - 0xec, 0x60, 0x83, 0xf6, 0x2c, 0xab, 0xe5, 0x7e, 0xf5, 0x0d, 0xba, 0xa1, 0x2b, 0x23, 0x9c, 0x94, - 0xf4, 0xb1, 0xb3, 0x4f, 0x41, 0x81, 0xc3, 0x21, 0x7e, 0x6c, 0xd9, 0x62, 0xbb, 0x0b, 0xc7, 0xdf, - 0xe2, 0x1c, 0x47, 0x03, 0x1c, 0xd7, 0x38, 0x69, 0x61, 0x0e, 0x06, 0xf7, 0xc3, 0xeb, 0x5f, 0x72, - 0x5e, 0x19, 0x1c, 0x64, 0x32, 0x0f, 0xc3, 0x94, 0x89, 0xd6, 0x74, 0x5c, 0xb3, 0x41, 0x63, 0xe2, - 0xde, 0x6c, 0x7e, 0xfb, 0x0d, 0xb6, 0x8e, 0x86, 0x08, 0xd9, 0x9c, 0x47, 0x55, 0x28, 0x00, 0x7d, - 0x0a, 0x56, 0xc5, 0x5a, 0xbd, 0x0b, 0x87, 0x6f, 0x73, 0x41, 0x3c, 0xfc, 0xc2, 0x55, 0x18, 0x23, - 0xbf, 0x69, 0xc8, 0x0a, 0x4a, 0xd2, 0xbd, 0x06, 0x97, 0x7b, 0xed, 0x63, 0x6c, 0xa9, 0x8e, 0x7a, - 0x0c, 0x02, 0x32, 0x05, 0x66, 0xb1, 0x86, 0x5d, 0x17, 0xdb, 0x4e, 0x45, 0xad, 0xb7, 0x13, 0x2f, - 0x50, 0xc4, 0xc8, 0x7d, 0xe1, 0x7b, 0xe1, 0x59, 0x9c, 0x67, 0x94, 0xb3, 0xf5, 0x7a, 0x61, 0x03, - 0x8e, 0xb4, 0xf1, 0x8a, 0x1e, 0x78, 0xbe, 0xcc, 0x79, 0x8e, 0xb5, 0x78, 0x06, 0x61, 0xbb, 0x0a, - 0x02, 0xee, 0xcd, 0x65, 0x0f, 0x3c, 0xbf, 0xc8, 0x79, 0x22, 0x4e, 0x2b, 0xa6, 0x94, 0x70, 0xbc, - 0x0c, 0x23, 0xd7, 0xb1, 0xbd, 0x69, 0x3a, 0xbc, 0x70, 0xd4, 0x03, 0xbb, 0x2f, 0x71, 0x76, 0xc3, - 0x9c, 0x90, 0x56, 0x92, 0x08, 0xaf, 0xf3, 0x90, 0xda, 0x52, 0x35, 0xdc, 0x03, 0x8b, 0x9b, 0x9c, - 0x45, 0x3f, 0xc1, 0x27, 0xa4, 0xb3, 0x90, 0xa9, 0x99, 0x7c, 0xd7, 0xea, 0x4e, 0xfe, 0x65, 0x4e, - 0x3e, 0x20, 0x68, 0x38, 0x0b, 0xcb, 0xb4, 0x9a, 0x75, 0xb2, 0xa5, 0x75, 0x67, 0xf1, 0xb7, 0x04, - 0x0b, 0x41, 0xc3, 0x59, 0xec, 0xc3, 0xac, 0xaf, 0x08, 0x16, 0x4e, 0xc0, 0x9e, 0x4f, 0xc3, 0x80, - 0x69, 0xd4, 0x77, 0x4d, 0xa3, 0x17, 0x21, 0xbe, 0xc2, 0x39, 0x00, 0x27, 0x21, 0x0c, 0x2e, 0x40, - 0xba, 0xd7, 0x89, 0xf8, 0xdb, 0xdf, 0x13, 0xcb, 0x43, 0xcc, 0xc0, 0x3c, 0x0c, 0x8b, 0x00, 0xa5, - 0x9b, 0x46, 0x0f, 0x2c, 0xfe, 0x0e, 0x67, 0x31, 0x14, 0x20, 0xe3, 0x6a, 0xb8, 0xd8, 0x71, 0x6b, - 0xb8, 0x17, 0x26, 0x5f, 0x13, 0x6a, 0x70, 0x12, 0x6e, 0xca, 0x4d, 0x6c, 0x68, 0xdb, 0xbd, 0x71, - 0xf8, 0x05, 0x61, 0x4a, 0x41, 0x43, 0x58, 0xcc, 0xc1, 0x60, 0x43, 0xb5, 0x9d, 0x6d, 0xb5, 0xde, - 0xd3, 0x74, 0xfc, 0x5d, 0xce, 0x23, 0xe3, 0x11, 0x71, 0x8b, 0x34, 0x8d, 0xfd, 0xb0, 0xf9, 0xba, - 0xb0, 0x48, 0x80, 0x8c, 0x2f, 0x3d, 0xc7, 0xa5, 0x55, 0xb6, 0xfd, 0x70, 0xfb, 0x45, 0xb1, 0xf4, - 0x18, 0xed, 0x52, 0x90, 0xe3, 0x05, 0x48, 0x3b, 0xfa, 0x0b, 0x3d, 0xb1, 0xf9, 0x25, 0x31, 0xd3, - 0x94, 0x80, 0x10, 0x7f, 0x00, 0x8e, 0xb6, 0xdd, 0x26, 0x7a, 0x60, 0xf6, 0xf7, 0x38, 0xb3, 0xf1, - 0x36, 0x5b, 0x05, 0x0f, 0x09, 0xfb, 0x65, 0xf9, 0xf7, 0x45, 0x48, 0xc0, 0x11, 0x5e, 0xab, 0xe4, - 0x1c, 0xe1, 0xa8, 0x5b, 0xfb, 0xb3, 0xda, 0x2f, 0x0b, 0xab, 0x31, 0xda, 0x90, 0xd5, 0xd6, 0x61, - 0x9c, 0x73, 0xdc, 0xdf, 0xbc, 0xfe, 0x8a, 0x08, 0xac, 0x8c, 0x7a, 0x23, 0x3c, 0xbb, 0x1f, 0x82, - 0xbc, 0x67, 0x4e, 0x91, 0xb0, 0x3a, 0x95, 0x86, 0x6a, 0xf5, 0xc0, 0xf9, 0x57, 0x39, 0x67, 0x11, - 0xf1, 0xbd, 0x8c, 0xd7, 0x59, 0x52, 0x2d, 0xc2, 0xfc, 0xfd, 0x90, 0x13, 0xcc, 0x9b, 0x86, 0x8d, - 0x35, 0xb3, 0x66, 0xe8, 0x2f, 0xe0, 0x6a, 0x0f, 0xac, 0x7f, 0x2d, 0x32, 0x55, 0x1b, 0x01, 0x72, - 0xc2, 0x79, 0x01, 0xb2, 0x5e, 0xae, 0x52, 0xd1, 0x1b, 0x96, 0x69, 0xbb, 0x5d, 0x38, 0x7e, 0x43, - 0xcc, 0x94, 0x47, 0xb7, 0x40, 0xc9, 0x0a, 0x65, 0x18, 0xa2, 0xcd, 0x5e, 0x5d, 0xf2, 0xd7, 0x39, - 0xa3, 0x41, 0x9f, 0x8a, 0x07, 0x0e, 0xcd, 0x6c, 0x58, 0xaa, 0xdd, 0x4b, 0xfc, 0xfb, 0x07, 0x22, - 0x70, 0x70, 0x12, 0x1e, 0x38, 0xdc, 0x5d, 0x0b, 0x93, 0xdd, 0xbe, 0x07, 0x0e, 0xdf, 0x14, 0x81, - 0x43, 0xd0, 0x70, 0x16, 0x22, 0x61, 0xe8, 0x81, 0xc5, 0x3f, 0x14, 0x2c, 0x04, 0x0d, 0x61, 0xf1, - 0x8c, 0xbf, 0xd1, 0xda, 0xb8, 0xa6, 0x3b, 0xae, 0xcd, 0xd2, 0xe4, 0xbd, 0x59, 0xfd, 0xa3, 0xef, - 0x85, 0x93, 0x30, 0x25, 0x40, 0x4a, 0x22, 0x11, 0x2f, 0xbb, 0xd2, 0x53, 0x54, 0x77, 0xc1, 0x7e, - 0x43, 0x44, 0xa2, 0x00, 0x19, 0x91, 0x2d, 0x90, 0x21, 0x12, 0xb3, 0x6b, 0xe4, 0xec, 0xd0, 0x03, - 0xbb, 0x7f, 0x1c, 0x11, 0x6e, 0x4d, 0xd0, 0x12, 0x9e, 0x81, 0xfc, 0xa7, 0x69, 0x5c, 0xc3, 0xbb, - 0x3d, 0x79, 0xe7, 0x3f, 0x89, 0xe4, 0x3f, 0x1b, 0x8c, 0x92, 0xc5, 0x90, 0xe1, 0x48, 0x3e, 0x85, - 0xba, 0xdd, 0x1f, 0xca, 0xfd, 0xf8, 0x5b, 0x5c, 0xdf, 0x70, 0x3a, 0x55, 0x58, 0x24, 0x4e, 0x1e, - 0x4e, 0x7a, 0xba, 0x33, 0xfb, 0xd8, 0x5b, 0x9e, 0x9f, 0x87, 0x72, 0x9e, 0xc2, 0x45, 0x18, 0x0c, - 0x25, 0x3c, 0xdd, 0x59, 0x7d, 0x9c, 0xb3, 0xca, 0x04, 0xf3, 0x9d, 0xc2, 0x19, 0x48, 0x90, 0xe4, - 0xa5, 0x3b, 0xf9, 0x5f, 0xe5, 0xe4, 0x14, 0xbd, 0xf0, 0x5e, 0x48, 0x89, 0xa4, 0xa5, 0x3b, 0xe9, - 0x27, 0x38, 0xa9, 0x47, 0x42, 0xc8, 0x45, 0xc2, 0xd2, 0x9d, 0xfc, 0xaf, 0x09, 0x72, 0x41, 0x42, - 0xc8, 0x7b, 0x37, 0xe1, 0xb7, 0x7e, 0x32, 0xc1, 0x37, 0x1d, 0x61, 0xbb, 0x0b, 0xd0, 0xcf, 0x33, - 0x95, 0xee, 0xd4, 0x9f, 0xe2, 0x83, 0x0b, 0x8a, 0xc2, 0x93, 0x90, 0xec, 0xd1, 0xe0, 0x3f, 0xc5, - 0x49, 0x19, 0x7e, 0x61, 0x0e, 0x06, 0x02, 0xd9, 0x49, 0x77, 0xf2, 0xbf, 0xc1, 0xc9, 0x83, 0x54, - 0x44, 0x74, 0x9e, 0x9d, 0x74, 0x67, 0xf0, 0x69, 0x21, 0x3a, 0xa7, 0x20, 0x66, 0x13, 0x89, 0x49, - 0x77, 0xea, 0xcf, 0x08, 0xab, 0x0b, 0x92, 0xc2, 0xd3, 0x90, 0xf6, 0x36, 0x9b, 0xee, 0xf4, 0x9f, - 0xe5, 0xf4, 0x3e, 0x0d, 0xb1, 0x40, 0x60, 0xb3, 0xeb, 0xce, 0xe2, 0xa7, 0x85, 0x05, 0x02, 0x54, - 0x64, 0x19, 0x45, 0x13, 0x98, 0xee, 0x9c, 0x3e, 0x27, 0x96, 0x51, 0x24, 0x7f, 0x21, 0xb3, 0x49, - 0x63, 0x7e, 0x77, 0x16, 0x3f, 0x23, 0x66, 0x93, 0xe2, 0x13, 0x31, 0xa2, 0x19, 0x41, 0x77, 0x1e, - 0x7f, 0x53, 0x88, 0x11, 0x49, 0x08, 0x0a, 0xab, 0x80, 0x5a, 0xb3, 0x81, 0xee, 0xfc, 0x3e, 0xcf, - 0xf9, 0x8d, 0xb4, 0x24, 0x03, 0x85, 0x67, 0x61, 0xbc, 0x7d, 0x26, 0xd0, 0x9d, 0xeb, 0x17, 0xde, - 0x8a, 0x9c, 0xdd, 0x82, 0x89, 0x40, 0x61, 0xdd, 0xdf, 0x52, 0x82, 0x59, 0x40, 0x77, 0xb6, 0x2f, - 0xbf, 0x15, 0x0e, 0xdc, 0xc1, 0x24, 0xa0, 0x30, 0x0b, 0xe0, 0x6f, 0xc0, 0xdd, 0x79, 0x7d, 0x89, - 0xf3, 0x0a, 0x10, 0x91, 0xa5, 0xc1, 0xf7, 0xdf, 0xee, 0xf4, 0x37, 0xc5, 0xd2, 0xe0, 0x14, 0x64, - 0x69, 0x88, 0xad, 0xb7, 0x3b, 0xf5, 0x97, 0xc5, 0xd2, 0x10, 0x24, 0xc4, 0xb3, 0x03, 0xbb, 0x5b, - 0x77, 0x0e, 0x5f, 0x11, 0x9e, 0x1d, 0xa0, 0x2a, 0x2c, 0xc3, 0x48, 0xcb, 0x86, 0xd8, 0x9d, 0xd5, - 0xcf, 0x71, 0x56, 0xd9, 0xe8, 0x7e, 0x18, 0xdc, 0xbc, 0xf8, 0x66, 0xd8, 0x9d, 0xdb, 0x57, 0x23, - 0x9b, 0x17, 0xdf, 0x0b, 0x0b, 0x17, 0x20, 0x65, 0x34, 0xeb, 0x75, 0xb2, 0x78, 0xd0, 0xde, 0x77, - 0xfe, 0x72, 0xff, 0xe9, 0x07, 0xdc, 0x3a, 0x82, 0xa0, 0x70, 0x06, 0x92, 0xb8, 0xb1, 0x89, 0xab, - 0xdd, 0x28, 0xbf, 0xfb, 0x03, 0x11, 0x30, 0x09, 0x76, 0xe1, 0x69, 0x00, 0x56, 0x1a, 0xa1, 0x8f, - 0x07, 0xbb, 0xd0, 0xfe, 0xe7, 0x1f, 0xf0, 0xdb, 0x38, 0x3e, 0x89, 0xcf, 0x80, 0xdd, 0xed, 0xd9, - 0x9b, 0xc1, 0xf7, 0xc2, 0x0c, 0xe8, 0x8c, 0x9c, 0x87, 0xfe, 0xe7, 0x1c, 0xd3, 0x70, 0xd5, 0x5a, - 0x37, 0xea, 0xff, 0xc2, 0xa9, 0x05, 0x3e, 0x31, 0x58, 0xc3, 0xb4, 0xb1, 0xab, 0xd6, 0x9c, 0x6e, - 0xb4, 0xff, 0x95, 0xd3, 0x7a, 0x04, 0x84, 0x58, 0x53, 0x1d, 0xb7, 0x17, 0xbd, 0xff, 0x54, 0x10, - 0x0b, 0x02, 0x22, 0x34, 0xf9, 0x7d, 0x0d, 0xef, 0x76, 0xa3, 0xfd, 0xbe, 0x10, 0x9a, 0xe3, 0x17, - 0xde, 0x0b, 0x69, 0xf2, 0x93, 0x5d, 0xb1, 0xeb, 0x42, 0xfc, 0x67, 0x9c, 0xd8, 0xa7, 0x20, 0x23, - 0x3b, 0x6e, 0xd5, 0xd5, 0xbb, 0x1b, 0xfb, 0x36, 0x9f, 0x69, 0x81, 0x5f, 0x98, 0x85, 0x01, 0xc7, - 0xad, 0x56, 0x9b, 0x3c, 0x3f, 0xed, 0x42, 0xfe, 0xdf, 0x7e, 0xe0, 0x95, 0x2c, 0x3c, 0x1a, 0x32, - 0xdb, 0x37, 0xae, 0xb9, 0x96, 0x49, 0x1f, 0x81, 0x74, 0xe3, 0xf0, 0x16, 0xe7, 0x10, 0x20, 0x29, - 0xcc, 0x41, 0x86, 0xe8, 0x62, 0x63, 0x0b, 0xd3, 0xe7, 0x55, 0x5d, 0x58, 0xfc, 0x77, 0x6e, 0x80, - 0x10, 0x51, 0xf1, 0xc7, 0xbe, 0xfd, 0xfa, 0x84, 0xf4, 0xea, 0xeb, 0x13, 0xd2, 0x1f, 0xbf, 0x3e, - 0x21, 0x7d, 0xe6, 0x3b, 0x13, 0x87, 0x5e, 0xfd, 0xce, 0xc4, 0xa1, 0xdf, 0xff, 0xce, 0xc4, 0xa1, - 0xf6, 0x65, 0x63, 0x98, 0x37, 0xe7, 0x4d, 0x56, 0x30, 0xfe, 0xa0, 0x1c, 0x2a, 0x17, 0xd7, 0x4c, - 0xbf, 0x5a, 0xeb, 0x1d, 0x72, 0xe0, 0xe3, 0x71, 0x98, 0xd0, 0x4c, 0xa7, 0x61, 0x3a, 0x33, 0x9b, - 0xaa, 0x83, 0x67, 0xae, 0x3f, 0xb6, 0x89, 0x5d, 0xf5, 0xb1, 0x19, 0xcd, 0xd4, 0x0d, 0x5e, 0xf6, - 0x1d, 0x65, 0xfd, 0xd3, 0xa4, 0x7f, 0x9a, 0xf7, 0xe7, 0xdb, 0x56, 0x88, 0xe5, 0x79, 0x48, 0xcc, - 0x99, 0xba, 0x81, 0xc6, 0x20, 0x59, 0xc5, 0x86, 0xd9, 0xe0, 0x37, 0xc0, 0x58, 0x03, 0xdd, 0x0b, - 0x7d, 0x6a, 0xc3, 0x6c, 0x1a, 0x2e, 0x2b, 0x97, 0x17, 0x07, 0xbe, 0x7d, 0x6b, 0xf2, 0xd0, 0x1f, - 0xdc, 0x9a, 0x8c, 0x2f, 0x18, 0xae, 0xc2, 0xbb, 0x0a, 0x89, 0x37, 0x5f, 0x99, 0x94, 0xe4, 0xcb, - 0xd0, 0x5f, 0xc2, 0xda, 0x41, 0x78, 0x95, 0xb0, 0x16, 0xe1, 0xf5, 0x20, 0xa4, 0x16, 0x0c, 0x97, - 0xdd, 0xd1, 0x3b, 0x01, 0x71, 0xdd, 0x60, 0xb7, 0x3e, 0x22, 0xe3, 0x13, 0x38, 0x41, 0x2d, 0x61, - 0xcd, 0x43, 0xad, 0x62, 0x2d, 0x8a, 0x4a, 0xd8, 0x13, 0x78, 0xb1, 0xf4, 0xfb, 0xff, 0x61, 0xe2, - 0xd0, 0x8b, 0xaf, 0x4f, 0x1c, 0xea, 0x34, 0x3f, 0x21, 0xf3, 0x73, 0x13, 0xb3, 0x3f, 0x8f, 0x38, - 0xd5, 0x6b, 0x33, 0x64, 0x69, 0x39, 0x9b, 0x7d, 0xd4, 0x6e, 0x8f, 0xc3, 0x67, 0x62, 0x30, 0x19, - 0x2d, 0xa9, 0x13, 0x3f, 0x76, 0x5c, 0xb5, 0x61, 0x75, 0x7a, 0x21, 0xea, 0x02, 0xa4, 0xd7, 0x05, - 0x0e, 0xca, 0x41, 0xbf, 0x83, 0x35, 0xd3, 0xa8, 0x3a, 0x54, 0xe4, 0xb8, 0x22, 0x9a, 0xc4, 0x80, - 0x86, 0x6a, 0x98, 0x0e, 0xbf, 0xaf, 0xc9, 0x1a, 0xc5, 0x9f, 0x95, 0xf6, 0xe7, 0x58, 0x43, 0xde, - 0x50, 0xd4, 0x3c, 0xab, 0xd2, 0x07, 0x1f, 0xda, 0xeb, 0x69, 0x04, 0x55, 0xcf, 0x57, 0x21, 0xf0, - 0xe8, 0x61, 0x22, 0xfa, 0xe8, 0xe1, 0x59, 0x5c, 0xaf, 0x5f, 0x31, 0xcc, 0x1b, 0xc6, 0x7a, 0xc8, - 0x24, 0x5f, 0x4f, 0xc0, 0x09, 0x7a, 0x11, 0xdd, 0x6e, 0xe8, 0x86, 0x3b, 0xa3, 0xd9, 0xbb, 0x96, - 0x4b, 0x5d, 0xd8, 0xdc, 0xe2, 0x06, 0x19, 0xf1, 0xbb, 0xa7, 0x59, 0x77, 0x07, 0xb7, 0xdc, 0x82, - 0xe4, 0x2a, 0xa1, 0x23, 0xa6, 0x70, 0x4d, 0x57, 0xad, 0x73, 0x13, 0xb1, 0x06, 0x81, 0xb2, 0xcb, - 0xeb, 0x31, 0x06, 0xd5, 0xc5, 0xbd, 0xf5, 0x3a, 0x56, 0xb7, 0xd8, 0x65, 0xc1, 0x38, 0x7d, 0x56, - 0x98, 0x22, 0x00, 0x7a, 0x2f, 0x70, 0x0c, 0x92, 0x6a, 0x93, 0x3d, 0xe6, 0x8a, 0x9f, 0xcc, 0x28, - 0xac, 0x21, 0x5f, 0x81, 0x7e, 0x5e, 0x5a, 0x47, 0x59, 0x88, 0x5f, 0xc3, 0xbb, 0x74, 0x9c, 0x8c, - 0x42, 0x7e, 0xa2, 0x69, 0x48, 0x52, 0xe1, 0xf9, 0x2d, 0xe8, 0xdc, 0x74, 0x8b, 0xf4, 0xd3, 0x54, - 0x48, 0x85, 0xa1, 0xc9, 0x97, 0x21, 0x55, 0x32, 0x1b, 0xba, 0x61, 0x86, 0xb9, 0xa5, 0x19, 0x37, - 0x2a, 0xb3, 0xd5, 0xe4, 0xee, 0xaf, 0xb0, 0x06, 0x1a, 0x87, 0x3e, 0x76, 0x79, 0x94, 0x3f, 0xaa, - 0xe3, 0x2d, 0x79, 0x0e, 0xfa, 0x29, 0xef, 0x15, 0x0b, 0x21, 0xfe, 0x36, 0x01, 0xbf, 0xa5, 0x4a, - 0xb7, 0x04, 0xce, 0x3e, 0xe6, 0x0b, 0x8b, 0x20, 0x51, 0x55, 0x5d, 0x95, 0xeb, 0x4d, 0x7f, 0xcb, - 0x4f, 0x41, 0x8a, 0x33, 0x71, 0xd0, 0x69, 0x88, 0x9b, 0x96, 0xc3, 0x1f, 0xb6, 0xe5, 0x3b, 0xa9, - 0xb2, 0x62, 0x15, 0x13, 0x64, 0xe1, 0x28, 0x04, 0xb9, 0xa8, 0x74, 0x5c, 0x29, 0xe7, 0x02, 0x9e, - 0x14, 0x98, 0xf2, 0xc0, 0x4f, 0x36, 0xa5, 0x2d, 0xee, 0xe0, 0x39, 0xcb, 0x57, 0x62, 0x30, 0x11, - 0xe8, 0xbd, 0x8e, 0x6d, 0x92, 0x5f, 0xb2, 0x45, 0xc6, 0xbd, 0x05, 0x05, 0x84, 0xe4, 0xfd, 0x1d, - 0xdc, 0xe5, 0xbd, 0x10, 0x9f, 0xb5, 0x2c, 0x94, 0x87, 0x14, 0x7b, 0xa8, 0x66, 0x32, 0x7f, 0x49, - 0x28, 0x5e, 0x9b, 0xf4, 0x39, 0xe6, 0x96, 0x7b, 0x43, 0xb5, 0xbd, 0xd7, 0x26, 0x44, 0x5b, 0x3e, - 0x0f, 0xe9, 0x39, 0xd3, 0x70, 0xb0, 0xe1, 0x34, 0xe9, 0xe2, 0xdb, 0xac, 0x9b, 0xda, 0x35, 0xce, - 0x81, 0x35, 0x88, 0xc1, 0x55, 0xcb, 0xa2, 0x94, 0x09, 0x85, 0xfc, 0x64, 0xa1, 0xaa, 0xb8, 0xd6, - 0xd1, 0x44, 0xe7, 0xf7, 0x6f, 0x22, 0xae, 0xa4, 0x67, 0xa3, 0x3f, 0x94, 0xe0, 0x78, 0xeb, 0x82, - 0xba, 0x86, 0x77, 0x9d, 0xfd, 0xae, 0xa7, 0x73, 0x90, 0x5e, 0xa5, 0xef, 0x2e, 0x5e, 0xc1, 0xbb, - 0x28, 0x0f, 0xfd, 0xb8, 0x7a, 0xfa, 0xcc, 0x99, 0xc7, 0xce, 0x33, 0x6f, 0xbf, 0x74, 0x48, 0x11, - 0x80, 0x42, 0x8a, 0x68, 0xf5, 0xe6, 0x57, 0x26, 0xa5, 0x62, 0x12, 0xe2, 0x4e, 0xb3, 0x71, 0x57, - 0x7d, 0xe0, 0xe5, 0x24, 0x4c, 0x05, 0x29, 0x69, 0x04, 0xba, 0xae, 0xd6, 0xf5, 0xaa, 0xea, 0xbf, - 0x55, 0x9a, 0x0d, 0xe8, 0x48, 0x31, 0xda, 0xab, 0x98, 0xdf, 0xd3, 0x52, 0xf2, 0xaf, 0x49, 0x90, - 0xb9, 0x2a, 0x38, 0xaf, 0x61, 0x17, 0x5d, 0x00, 0xf0, 0x46, 0x12, 0xcb, 0xe2, 0xd8, 0x74, 0x74, - 0xac, 0x69, 0x8f, 0x46, 0x09, 0xa0, 0xa3, 0x27, 0xa9, 0xa3, 0x59, 0xa6, 0xc3, 0xef, 0xd4, 0x77, - 0x21, 0xf5, 0x90, 0xd1, 0xc3, 0x80, 0x68, 0x04, 0xab, 0x5c, 0x37, 0x5d, 0xdd, 0xa8, 0x55, 0x2c, - 0xf3, 0x06, 0x7f, 0x01, 0x29, 0xae, 0x64, 0x69, 0xcf, 0x55, 0xda, 0xb1, 0x4a, 0xe0, 0x44, 0xe8, - 0xb4, 0xc7, 0x85, 0xec, 0x17, 0x6a, 0xb5, 0x6a, 0x63, 0xc7, 0xe1, 0x41, 0x4a, 0x34, 0xd1, 0x05, - 0xe8, 0xb7, 0x9a, 0x9b, 0x15, 0x11, 0x11, 0x06, 0x4e, 0x1f, 0x6f, 0xb7, 0xbe, 0xc5, 0xfc, 0xf3, - 0x15, 0xde, 0x67, 0x35, 0x37, 0x89, 0x37, 0xdc, 0x03, 0x99, 0x36, 0xc2, 0x0c, 0x5c, 0xf7, 0xe5, - 0xa0, 0xaf, 0xc4, 0x72, 0x0d, 0x2a, 0x96, 0xad, 0x9b, 0xb6, 0xee, 0xee, 0xd2, 0x27, 0xe2, 0x71, - 0x25, 0x2b, 0x3a, 0x56, 0x39, 0x5c, 0xbe, 0x06, 0xc3, 0x6b, 0x7a, 0xc3, 0xa2, 0x77, 0x38, 0xb8, - 0xe4, 0x67, 0x7c, 0xf9, 0xa4, 0xee, 0xf2, 0x75, 0x94, 0x2c, 0xd6, 0x22, 0x59, 0xf1, 0x99, 0x8e, - 0xde, 0xf9, 0xe4, 0xfe, 0xbd, 0x33, 0xbc, 0xc1, 0xff, 0xe9, 0xd1, 0xd0, 0xe2, 0xe3, 0xdb, 0x63, - 0x20, 0x3c, 0xf5, 0xea, 0x98, 0xdd, 0xd2, 0x84, 0xfc, 0xde, 0x9b, 0x66, 0xbe, 0x4b, 0x98, 0xcc, - 0x77, 0x5d, 0x42, 0xf2, 0x79, 0x18, 0x5c, 0x55, 0x6d, 0x77, 0x0d, 0xbb, 0x97, 0xb0, 0x5a, 0xc5, - 0x76, 0x78, 0x57, 0x1d, 0x14, 0xbb, 0x2a, 0x82, 0x04, 0xdd, 0x3a, 0xd9, 0xae, 0x42, 0x7f, 0xcb, - 0xdb, 0x90, 0xa0, 0xb7, 0x62, 0xbc, 0x1d, 0x97, 0x53, 0xb0, 0x1d, 0x97, 0xc4, 0xca, 0x5d, 0x17, - 0x3b, 0x9c, 0x84, 0x35, 0xd0, 0x13, 0x62, 0xdf, 0x8c, 0xef, 0xbd, 0x6f, 0x72, 0x47, 0xe4, 0xbb, - 0x67, 0x1d, 0xfa, 0x8b, 0x24, 0xd4, 0x2e, 0x94, 0x3c, 0x41, 0x24, 0x5f, 0x10, 0xb4, 0x04, 0xc3, - 0x96, 0x6a, 0xbb, 0xf4, 0x3a, 0xf0, 0x36, 0xd5, 0x82, 0xfb, 0xfa, 0x64, 0xeb, 0xca, 0x0b, 0x29, - 0xcb, 0x47, 0x19, 0xb4, 0x82, 0x40, 0xf9, 0x4f, 0x12, 0xd0, 0xc7, 0x8d, 0xf1, 0x5e, 0xe8, 0xe7, - 0x66, 0xe5, 0xde, 0x79, 0x62, 0xba, 0x75, 0xe3, 0x99, 0xf6, 0x36, 0x08, 0xce, 0x4f, 0xd0, 0xa0, - 0xfb, 0x21, 0xa5, 0x6d, 0xab, 0xba, 0x51, 0xd1, 0xab, 0x22, 0xb3, 0x7d, 0xfd, 0xd6, 0x64, 0xff, - 0x1c, 0x81, 0x2d, 0x94, 0x94, 0x7e, 0xda, 0xb9, 0x50, 0x25, 0x3b, 0xfd, 0x36, 0xd6, 0x6b, 0xdb, - 0x2e, 0x5f, 0x61, 0xbc, 0x85, 0xce, 0x41, 0x82, 0x38, 0x04, 0x7f, 0x5b, 0x24, 0xdf, 0x72, 0xe2, - 0xf0, 0xb2, 0xb8, 0x62, 0x8a, 0x0c, 0xfc, 0x99, 0x3f, 0x9a, 0x94, 0x14, 0x4a, 0x81, 0xe6, 0x60, - 0xb0, 0xae, 0x3a, 0x6e, 0x85, 0xee, 0x50, 0x64, 0xf8, 0x24, 0x65, 0x71, 0xb4, 0xd5, 0x20, 0xdc, - 0xb0, 0x5c, 0xf4, 0x01, 0x42, 0xc5, 0x40, 0x55, 0x74, 0x12, 0xb2, 0x94, 0x89, 0x66, 0x36, 0x1a, - 0xba, 0xcb, 0x72, 0xa7, 0x3e, 0x6a, 0xf7, 0x21, 0x02, 0x9f, 0xa3, 0x60, 0x9a, 0x41, 0x1d, 0x83, - 0x34, 0xbd, 0x9e, 0x4e, 0x51, 0xd8, 0x55, 0xac, 0x14, 0x01, 0xd0, 0xce, 0x07, 0x60, 0xd8, 0x8f, - 0x8f, 0x0c, 0x25, 0xc5, 0xb8, 0xf8, 0x60, 0x8a, 0xf8, 0x28, 0x8c, 0x19, 0x78, 0x87, 0x5e, 0x0e, - 0x0b, 0x61, 0xa7, 0x29, 0x36, 0x22, 0x7d, 0x57, 0xc3, 0x14, 0xef, 0x81, 0x21, 0x4d, 0x18, 0x9f, - 0xe1, 0x02, 0xc5, 0x1d, 0xf4, 0xa0, 0x14, 0xed, 0x28, 0xa4, 0x54, 0xcb, 0x62, 0x08, 0x03, 0x3c, - 0x3e, 0x5a, 0x16, 0xed, 0x3a, 0x05, 0x23, 0x54, 0x47, 0x1b, 0x3b, 0xcd, 0xba, 0xcb, 0x99, 0x64, - 0x28, 0xce, 0x30, 0xe9, 0x50, 0x18, 0x9c, 0xe2, 0xde, 0x0b, 0x83, 0xf8, 0xba, 0x5e, 0xc5, 0x86, - 0x86, 0x19, 0xde, 0x20, 0xc5, 0xcb, 0x08, 0x20, 0x45, 0x7a, 0x10, 0xbc, 0xb8, 0x57, 0x11, 0x31, - 0x79, 0x88, 0xf1, 0x13, 0xf0, 0x59, 0x06, 0x96, 0x73, 0x90, 0x28, 0xa9, 0xae, 0x4a, 0x12, 0x08, - 0x77, 0x87, 0x6d, 0x34, 0x19, 0x85, 0xfc, 0x94, 0xdf, 0x8c, 0x41, 0xe2, 0xaa, 0xe9, 0x62, 0xf4, - 0x78, 0x20, 0xc1, 0x1b, 0x6a, 0xe7, 0xcf, 0x6b, 0x7a, 0xcd, 0xc0, 0xd5, 0x25, 0xa7, 0x16, 0x78, - 0x47, 0xd4, 0x77, 0xa7, 0x58, 0xc8, 0x9d, 0xc6, 0x20, 0x69, 0x9b, 0x4d, 0xa3, 0x2a, 0x6e, 0x31, - 0xd1, 0x06, 0x2a, 0x43, 0xca, 0xf3, 0x92, 0x44, 0x37, 0x2f, 0x19, 0x26, 0x5e, 0x42, 0x7c, 0x98, - 0x03, 0x94, 0xfe, 0x4d, 0xee, 0x2c, 0x45, 0x48, 0x7b, 0xc1, 0x8b, 0x7b, 0x5b, 0x6f, 0x0e, 0xeb, - 0x93, 0x91, 0xcd, 0xc4, 0x9b, 0x7b, 0xcf, 0x78, 0xcc, 0xe3, 0xb2, 0x5e, 0x07, 0xb7, 0x5e, 0xc8, - 0xad, 0xf8, 0xfb, 0xaa, 0xfd, 0x54, 0x2f, 0xdf, 0xad, 0xd8, 0x3b, 0xab, 0xc7, 0x21, 0xed, 0xe8, - 0x35, 0x43, 0x75, 0x9b, 0x36, 0xe6, 0x9e, 0xe7, 0x03, 0xe4, 0x6f, 0x49, 0xd0, 0xc7, 0x3c, 0x39, - 0x60, 0x37, 0xa9, 0xbd, 0xdd, 0x62, 0x9d, 0xec, 0x16, 0x3f, 0xb8, 0xdd, 0x66, 0x01, 0x3c, 0x61, - 0x1c, 0xfe, 0xbe, 0x61, 0x9b, 0x8c, 0x81, 0x89, 0xb8, 0xa6, 0xd7, 0xf8, 0x42, 0x0d, 0x10, 0xc9, - 0x7f, 0x28, 0x91, 0x24, 0x95, 0xf7, 0xa3, 0x59, 0x18, 0x14, 0x72, 0x55, 0xb6, 0xea, 0x6a, 0x8d, - 0xfb, 0xce, 0x89, 0x8e, 0xc2, 0x5d, 0xac, 0xab, 0x35, 0x65, 0x80, 0xcb, 0x43, 0x1a, 0xed, 0xe7, - 0x21, 0xd6, 0x61, 0x1e, 0x42, 0x13, 0x1f, 0x3f, 0xd8, 0xc4, 0x87, 0xa6, 0x28, 0x11, 0x9d, 0xa2, - 0x6f, 0xc4, 0xe8, 0x61, 0xc5, 0x32, 0x1d, 0xb5, 0xfe, 0x4e, 0xac, 0x88, 0x63, 0x90, 0xb6, 0xcc, - 0x7a, 0x85, 0xf5, 0xb0, 0xdb, 0x7d, 0x29, 0xcb, 0xac, 0x2b, 0x2d, 0xd3, 0x9e, 0xbc, 0x43, 0xcb, - 0xa5, 0xef, 0x0e, 0x58, 0xad, 0x3f, 0x6a, 0x35, 0x1b, 0x32, 0xcc, 0x14, 0x7c, 0x2f, 0x7b, 0x94, - 0xd8, 0x80, 0x6e, 0x8e, 0x52, 0xeb, 0xde, 0xcb, 0xc4, 0x66, 0x98, 0x0a, 0xc7, 0x23, 0x14, 0x2c, - 0xf4, 0xb7, 0x3b, 0xe5, 0x06, 0xdd, 0x52, 0xe1, 0x78, 0xf2, 0xcf, 0x4a, 0x00, 0x8b, 0xc4, 0xb2, - 0x54, 0x5f, 0xb2, 0x0b, 0x39, 0x54, 0x84, 0x4a, 0x68, 0xe4, 0x89, 0x4e, 0x93, 0xc6, 0xc7, 0xcf, - 0x38, 0x41, 0xb9, 0xe7, 0x60, 0xd0, 0x77, 0x46, 0x07, 0x0b, 0x61, 0x26, 0xf6, 0xc8, 0xaa, 0xd7, - 0xb0, 0xab, 0x64, 0xae, 0x07, 0x5a, 0xf2, 0x3f, 0x97, 0x20, 0x4d, 0x65, 0x5a, 0xc2, 0xae, 0x1a, - 0x9a, 0x43, 0xe9, 0xe0, 0x73, 0x78, 0x02, 0x80, 0xb1, 0x71, 0xf4, 0x17, 0x30, 0xf7, 0xac, 0x34, - 0x85, 0xac, 0xe9, 0x2f, 0x60, 0x74, 0xd6, 0x33, 0x78, 0x7c, 0x6f, 0x83, 0x8b, 0xac, 0x9b, 0x9b, - 0xfd, 0x08, 0xf4, 0xd3, 0xcf, 0x6e, 0xec, 0x38, 0x3c, 0x91, 0xee, 0x33, 0x9a, 0x8d, 0xf5, 0x1d, - 0x47, 0x7e, 0x0e, 0xfa, 0xd7, 0x77, 0x58, 0xed, 0xe3, 0x18, 0xa4, 0x6d, 0xd3, 0xe4, 0x7b, 0x32, - 0xcb, 0x85, 0x52, 0x04, 0x40, 0xb7, 0x20, 0x71, 0xde, 0x8f, 0xf9, 0xe7, 0x7d, 0xbf, 0x60, 0x11, - 0xef, 0xa9, 0x60, 0x71, 0xea, 0xdf, 0x4a, 0x30, 0x10, 0x88, 0x0f, 0xe8, 0x31, 0x38, 0x5c, 0x5c, - 0x5c, 0x99, 0xbb, 0x52, 0x59, 0x28, 0x55, 0x2e, 0x2e, 0xce, 0xce, 0xfb, 0xf7, 0xd7, 0xf3, 0xe3, - 0x2f, 0xdd, 0x9c, 0x42, 0x01, 0xdc, 0x0d, 0xe3, 0x9a, 0x61, 0xde, 0x30, 0xd0, 0x0c, 0x8c, 0x85, - 0x49, 0x66, 0x8b, 0x6b, 0xe5, 0xe5, 0xf5, 0xac, 0x94, 0x3f, 0xfc, 0xd2, 0xcd, 0xa9, 0x91, 0x00, - 0xc5, 0xec, 0xa6, 0x83, 0x0d, 0xb7, 0x95, 0x60, 0x6e, 0x65, 0x69, 0x69, 0x61, 0x3d, 0x1b, 0x6b, - 0x21, 0xe0, 0x01, 0xfb, 0x41, 0x18, 0x09, 0x13, 0x2c, 0x2f, 0x2c, 0x66, 0xe3, 0x79, 0xf4, 0xd2, - 0xcd, 0xa9, 0xa1, 0x00, 0xf6, 0xb2, 0x5e, 0xcf, 0xa7, 0x3e, 0xf9, 0xd5, 0x89, 0x43, 0xbf, 0xf0, - 0xf3, 0x13, 0x12, 0xd1, 0x6c, 0x30, 0x14, 0x23, 0xd0, 0xc3, 0x70, 0x64, 0x6d, 0x61, 0x7e, 0xb9, - 0x5c, 0xaa, 0x2c, 0xad, 0xcd, 0x57, 0xd8, 0x8b, 0xfb, 0x9e, 0x76, 0xc3, 0x2f, 0xdd, 0x9c, 0x1a, - 0xe0, 0x2a, 0x75, 0xc2, 0x5e, 0x55, 0xca, 0x57, 0x57, 0xd6, 0xcb, 0x59, 0x89, 0x61, 0xaf, 0xda, - 0xf8, 0xba, 0xe9, 0xb2, 0xef, 0xf2, 0x3c, 0x0a, 0x47, 0xdb, 0x60, 0x7b, 0x8a, 0x8d, 0xbc, 0x74, - 0x73, 0x6a, 0x70, 0xd5, 0xc6, 0x6c, 0xfd, 0x50, 0x8a, 0x69, 0xc8, 0xb5, 0x52, 0xac, 0xac, 0xae, - 0xac, 0xcd, 0x2e, 0x66, 0xa7, 0xf2, 0xd9, 0x97, 0x6e, 0x4e, 0x65, 0x44, 0x30, 0x24, 0xf8, 0xbe, - 0x66, 0x77, 0xf3, 0xc4, 0xf3, 0xd7, 0x63, 0x30, 0xd1, 0x72, 0x4b, 0x98, 0xd7, 0xd6, 0x3b, 0x55, - 0x34, 0x0b, 0x90, 0x2a, 0x89, 0x92, 0xfd, 0x7e, 0x0b, 0x9a, 0x3f, 0xb3, 0xcf, 0x82, 0xe6, 0xa0, - 0x18, 0x49, 0xd4, 0x33, 0x4f, 0x75, 0xaf, 0x67, 0x0a, 0xf9, 0x0f, 0x50, 0xce, 0xfc, 0xf4, 0x23, - 0x70, 0x1f, 0xaf, 0x02, 0x3b, 0xae, 0x7a, 0x4d, 0x37, 0x6a, 0x5e, 0xad, 0x9d, 0xb7, 0xb9, 0x51, - 0xc6, 0x79, 0xb9, 0x5d, 0x40, 0xf7, 0xac, 0xb8, 0xe7, 0xf7, 0x3c, 0x54, 0x76, 0x3f, 0x2c, 0x76, - 0x99, 0xa1, 0x7c, 0x97, 0x67, 0x03, 0xf2, 0xa7, 0x24, 0x18, 0xba, 0xa4, 0x3b, 0xae, 0x69, 0xeb, - 0x9a, 0x5a, 0xa7, 0xd7, 0xf1, 0xcf, 0xf6, 0xba, 0x69, 0x44, 0x62, 0xd8, 0xd3, 0xd0, 0x77, 0x5d, - 0xad, 0xb3, 0x68, 0x1d, 0xa7, 0x9f, 0x0f, 0x68, 0x6f, 0x08, 0x3f, 0x66, 0x0b, 0x06, 0x8c, 0x4c, - 0xfe, 0xe5, 0x18, 0x0c, 0xd3, 0x55, 0xee, 0xb0, 0xef, 0xc5, 0x90, 0xc3, 0x63, 0x11, 0x12, 0xb6, - 0xea, 0xf2, 0x6a, 0x67, 0x71, 0x9a, 0x57, 0xf1, 0xef, 0xef, 0x5e, 0x99, 0x9f, 0x2e, 0x61, 0x4d, - 0xa1, 0xb4, 0xe8, 0x47, 0x21, 0xd5, 0x50, 0x77, 0x2a, 0x94, 0x0f, 0x3b, 0x92, 0xcd, 0xee, 0x8f, - 0xcf, 0xed, 0x5b, 0x93, 0xc3, 0xbb, 0x6a, 0xa3, 0x5e, 0x90, 0x05, 0x1f, 0x59, 0xe9, 0x6f, 0xa8, - 0x3b, 0x44, 0x44, 0x64, 0xc1, 0x30, 0x81, 0x6a, 0xdb, 0xaa, 0x51, 0xc3, 0x6c, 0x10, 0x5a, 0xbb, - 0x2d, 0x5e, 0xda, 0xf7, 0x20, 0xe3, 0xfe, 0x20, 0x01, 0x76, 0xb2, 0x32, 0xd8, 0x50, 0x77, 0xe6, - 0x28, 0x80, 0x8c, 0x58, 0x48, 0x7d, 0xfe, 0x95, 0xc9, 0x43, 0xf4, 0xc9, 0xc8, 0x6b, 0x12, 0x80, - 0x6f, 0x31, 0xf4, 0xa3, 0x90, 0xd5, 0xbc, 0x16, 0xa5, 0x75, 0xf8, 0x1c, 0x3e, 0xd0, 0x69, 0x2e, - 0x22, 0xf6, 0x66, 0x49, 0xc7, 0xab, 0xb7, 0x26, 0x25, 0x65, 0x58, 0x8b, 0x4c, 0xc5, 0x87, 0x60, - 0xa0, 0x69, 0x55, 0x55, 0x17, 0x57, 0xe8, 0x01, 0x35, 0xd6, 0x35, 0x81, 0x99, 0x20, 0xbc, 0x6e, - 0xdf, 0x9a, 0x44, 0x4c, 0xad, 0x00, 0xb1, 0x4c, 0xd3, 0x1a, 0x60, 0x10, 0x42, 0x10, 0xd0, 0xe9, - 0x77, 0x24, 0x18, 0x28, 0x05, 0xae, 0xc5, 0xe4, 0xa0, 0xbf, 0x61, 0x1a, 0xfa, 0x35, 0xee, 0x8f, - 0x69, 0x45, 0x34, 0x51, 0x1e, 0x52, 0xec, 0x0d, 0x25, 0x77, 0x57, 0xd4, 0x70, 0x45, 0x9b, 0x50, - 0xdd, 0xc0, 0x9b, 0x8e, 0x2e, 0x66, 0x43, 0x11, 0x4d, 0x74, 0x11, 0xb2, 0x0e, 0xd6, 0x9a, 0xb6, - 0xee, 0xee, 0x56, 0x34, 0xd3, 0x70, 0x55, 0xcd, 0x65, 0xef, 0xba, 0x14, 0x8f, 0xdd, 0xbe, 0x35, - 0x79, 0x84, 0xc9, 0x1a, 0xc5, 0x90, 0x95, 0x61, 0x01, 0x9a, 0x63, 0x10, 0x32, 0x42, 0x15, 0xbb, - 0xaa, 0x5e, 0x77, 0x68, 0x4e, 0x98, 0x56, 0x44, 0x33, 0xa0, 0xcb, 0xff, 0xee, 0x0b, 0x56, 0xec, - 0x2e, 0x42, 0xd6, 0xb4, 0xb0, 0x1d, 0xca, 0xb0, 0xa5, 0xe8, 0xc8, 0x51, 0x0c, 0x59, 0x19, 0x16, - 0x20, 0x91, 0x7d, 0x5f, 0x24, 0xd3, 0x2c, 0x4e, 0xc0, 0x56, 0x73, 0x53, 0x14, 0xfa, 0x42, 0x7c, - 0xa2, 0x18, 0x32, 0x99, 0x50, 0x0e, 0x5a, 0xa5, 0x10, 0x92, 0x21, 0x3f, 0xa7, 0xea, 0x75, 0xf1, - 0x16, 0xa6, 0xc2, 0x5b, 0xa8, 0x00, 0x7d, 0x8e, 0xab, 0xba, 0x4d, 0x87, 0x7f, 0xf3, 0x48, 0xee, - 0xe4, 0x3c, 0x45, 0xd3, 0xa8, 0xae, 0x51, 0x4c, 0x85, 0x53, 0xa0, 0x8b, 0xd0, 0xe7, 0x9a, 0xd7, - 0xb0, 0xc1, 0x8d, 0xb2, 0xaf, 0x15, 0x4b, 0x9f, 0x22, 0x32, 0x6a, 0xe4, 0x42, 0xb6, 0x8a, 0xeb, - 0xb8, 0xc6, 0x32, 0xc0, 0x6d, 0x95, 0x1c, 0x94, 0xe8, 0xa7, 0x8f, 0x8a, 0x0b, 0xfb, 0x5e, 0x56, - 0xdc, 0x22, 0x51, 0x7e, 0xb2, 0x32, 0xec, 0x81, 0xd6, 0x28, 0x04, 0x5d, 0x09, 0xdd, 0xc8, 0xe2, - 0xdf, 0x07, 0xbb, 0xb7, 0x93, 0xfa, 0x01, 0x2f, 0x15, 0xa5, 0x94, 0xe0, 0x7d, 0xae, 0x8b, 0x90, - 0x6d, 0x1a, 0x9b, 0xa6, 0x41, 0x5f, 0x95, 0xe2, 0x47, 0x11, 0x72, 0x14, 0x8d, 0x07, 0xa7, 0x29, - 0x8a, 0x21, 0x2b, 0xc3, 0x1e, 0xe8, 0x12, 0x3b, 0xb0, 0x54, 0x61, 0xc8, 0xc7, 0xa2, 0x4b, 0x2f, - 0xdd, 0x75, 0xe9, 0xdd, 0xc3, 0x97, 0xde, 0xe1, 0xe8, 0x28, 0xfe, 0xea, 0x1b, 0xf4, 0x80, 0x84, - 0x0c, 0x5d, 0x02, 0xf0, 0x17, 0x3c, 0x2d, 0xa9, 0x0c, 0x74, 0x9e, 0x78, 0x3f, 0x6a, 0x88, 0xa3, - 0xa9, 0x4f, 0x8b, 0x3e, 0x02, 0xa3, 0x0d, 0xdd, 0xa8, 0x38, 0xb8, 0xbe, 0x55, 0xe1, 0x06, 0x26, - 0x2c, 0xe9, 0xa7, 0x2e, 0x8a, 0x8b, 0xfb, 0xf3, 0x87, 0xdb, 0xb7, 0x26, 0xf3, 0x3c, 0x28, 0xb6, - 0xb2, 0x94, 0x95, 0x91, 0x86, 0x6e, 0xac, 0xe1, 0xfa, 0x56, 0xc9, 0x83, 0x15, 0x32, 0x9f, 0x7c, - 0x65, 0xf2, 0x10, 0x5f, 0x80, 0x87, 0xe4, 0xb3, 0xb4, 0xcc, 0xcf, 0x17, 0x0e, 0x76, 0xc8, 0xf1, - 0x49, 0x15, 0x0d, 0x5a, 0x7c, 0x49, 0x2b, 0x3e, 0x80, 0x2d, 0xdc, 0x17, 0xff, 0xfd, 0x94, 0x24, - 0xff, 0x92, 0x04, 0x7d, 0xa5, 0xab, 0xab, 0xaa, 0x6e, 0xa3, 0x05, 0x18, 0xf1, 0x3d, 0x27, 0xbc, - 0x6c, 0x8f, 0xdf, 0xbe, 0x35, 0x99, 0x8b, 0x3a, 0x97, 0xb7, 0x6e, 0x7d, 0x07, 0x16, 0x0b, 0x77, - 0xa1, 0xd3, 0x19, 0x3b, 0xc4, 0xaa, 0x05, 0x45, 0x6e, 0x3d, 0x81, 0x47, 0xd4, 0x2c, 0x43, 0x3f, - 0x93, 0xd6, 0x41, 0x05, 0x48, 0x5a, 0xe4, 0x07, 0x7f, 0x86, 0x31, 0xd1, 0xd1, 0x79, 0x29, 0xbe, - 0x57, 0x73, 0x25, 0x24, 0xf2, 0x67, 0x63, 0x00, 0xa5, 0xab, 0x57, 0xd7, 0x6d, 0xdd, 0xaa, 0x63, - 0xf7, 0x4e, 0x6a, 0xbe, 0x0e, 0x87, 0x03, 0x07, 0x3a, 0x5b, 0x8b, 0x68, 0x3f, 0x75, 0xfb, 0xd6, - 0xe4, 0xf1, 0xa8, 0xf6, 0x01, 0x34, 0x59, 0x19, 0xf5, 0x8f, 0x76, 0xb6, 0xd6, 0x96, 0x6b, 0xd5, - 0x71, 0x3d, 0xae, 0xf1, 0xce, 0x5c, 0x03, 0x68, 0x41, 0xae, 0x25, 0xc7, 0x6d, 0x6f, 0xda, 0x35, - 0x18, 0xf0, 0x4d, 0xe2, 0xa0, 0x12, 0xa4, 0x5c, 0xfe, 0x9b, 0x5b, 0x58, 0xee, 0x6c, 0x61, 0x41, - 0xc6, 0xad, 0xec, 0x51, 0xca, 0x7f, 0x2e, 0x01, 0xf8, 0x3e, 0xfb, 0xc3, 0xe9, 0x62, 0x24, 0x94, - 0xf3, 0xc0, 0x1b, 0x3f, 0x50, 0xf2, 0xc5, 0xa9, 0x23, 0xf6, 0xfc, 0xc9, 0x18, 0x8c, 0x6e, 0x88, - 0xc8, 0xf3, 0x43, 0x6f, 0x83, 0x55, 0xe8, 0xc7, 0x86, 0x6b, 0xeb, 0xd4, 0x08, 0x64, 0xb6, 0x1f, - 0xed, 0x34, 0xdb, 0x6d, 0x74, 0xa2, 0xdf, 0xfa, 0x10, 0xcf, 0x07, 0x38, 0x9b, 0x88, 0x35, 0x3e, - 0x1d, 0x87, 0x5c, 0x27, 0x4a, 0x34, 0x07, 0xc3, 0x9a, 0x8d, 0x29, 0xa0, 0x12, 0x2c, 0x52, 0x16, - 0xf3, 0x7e, 0xae, 0x18, 0x41, 0x90, 0x95, 0x21, 0x01, 0xe1, 0xbb, 0x47, 0x0d, 0x48, 0x22, 0x47, - 0xdc, 0x8e, 0x60, 0xf5, 0x98, 0xb9, 0xc9, 0x7c, 0xfb, 0x10, 0x83, 0x84, 0x19, 0xb0, 0xfd, 0x63, - 0xc8, 0x87, 0xd2, 0x0d, 0xe4, 0x79, 0x18, 0xd6, 0x0d, 0xdd, 0xd5, 0xd5, 0x7a, 0x65, 0x53, 0xad, - 0xab, 0x86, 0x76, 0x90, 0x3c, 0x98, 0x85, 0x7c, 0x3e, 0x6c, 0x84, 0x9d, 0xac, 0x0c, 0x71, 0x48, - 0x91, 0x01, 0xd0, 0x25, 0xe8, 0x17, 0x43, 0x25, 0x0e, 0x94, 0x6d, 0x08, 0xf2, 0x40, 0xca, 0xf6, - 0x53, 0x71, 0x18, 0x51, 0x70, 0xf5, 0xff, 0x4f, 0xc5, 0xfe, 0xa6, 0x62, 0x09, 0x80, 0x2d, 0x77, - 0x12, 0x60, 0x0f, 0x30, 0x1b, 0x24, 0x60, 0xa4, 0x19, 0x87, 0x92, 0xe3, 0x06, 0xe6, 0xe3, 0x56, - 0x0c, 0x32, 0xc1, 0xf9, 0xf8, 0x4b, 0xba, 0x2b, 0xa1, 0x05, 0x3f, 0x12, 0x25, 0xf8, 0x27, 0x12, - 0x3b, 0x44, 0xa2, 0x16, 0xef, 0xdd, 0x3b, 0x04, 0xfd, 0x8f, 0x18, 0xf4, 0xad, 0xaa, 0xb6, 0xda, - 0x70, 0x90, 0xd6, 0x92, 0x69, 0x8a, 0x4a, 0x69, 0xcb, 0xf7, 0x6d, 0x79, 0x95, 0xa1, 0x4b, 0xa2, - 0xf9, 0xf9, 0x36, 0x89, 0xe6, 0xfb, 0x60, 0x88, 0x1c, 0x70, 0x03, 0xb7, 0x2d, 0x88, 0xb5, 0x07, - 0x8b, 0x47, 0x7d, 0x2e, 0xe1, 0x7e, 0x76, 0xfe, 0xbd, 0x1a, 0xbc, 0x6e, 0x31, 0x40, 0x30, 0xfc, - 0xc0, 0x4c, 0xc8, 0xc7, 0xfd, 0x83, 0x66, 0xa0, 0x53, 0x56, 0xa0, 0xa1, 0xee, 0x94, 0x59, 0x03, - 0x2d, 0x02, 0xda, 0xf6, 0x6a, 0x1d, 0x15, 0xdf, 0x9c, 0x84, 0xfe, 0xc4, 0xed, 0x5b, 0x93, 0x47, - 0x19, 0x7d, 0x2b, 0x8e, 0xac, 0x8c, 0xf8, 0x40, 0xc1, 0xed, 0x09, 0x00, 0xa2, 0x57, 0x85, 0x5d, - 0x6e, 0x64, 0xc7, 0x9d, 0xc3, 0xb7, 0x6f, 0x4d, 0x8e, 0x30, 0x2e, 0x7e, 0x9f, 0xac, 0xa4, 0x49, - 0xa3, 0x44, 0x7e, 0x07, 0x3c, 0xfb, 0xab, 0x12, 0x20, 0x3f, 0xe4, 0x2b, 0xd8, 0xb1, 0xc8, 0xf9, - 0x8c, 0x24, 0xe2, 0x81, 0xac, 0x59, 0xda, 0x3b, 0x11, 0xf7, 0xe9, 0x45, 0x22, 0x1e, 0x58, 0x29, - 0xe7, 0xfd, 0xf0, 0x18, 0xe3, 0xf3, 0xd8, 0xe6, 0x26, 0xe8, 0xf4, 0x9c, 0xa9, 0x0b, 0xea, 0x96, - 0x78, 0x78, 0x48, 0xfe, 0xd7, 0x12, 0x1c, 0x6d, 0xf1, 0x28, 0x4f, 0xd8, 0xbf, 0x02, 0xc8, 0x0e, - 0x74, 0xf2, 0xcf, 0x5d, 0x31, 0xa1, 0xf7, 0xed, 0xa0, 0x23, 0x76, 0x4b, 0xdc, 0xbd, 0x73, 0x11, - 0x9e, 0x5d, 0x25, 0xfd, 0x67, 0x12, 0x8c, 0x05, 0x87, 0xf7, 0x14, 0x59, 0x86, 0x4c, 0x70, 0x74, - 0xae, 0xc2, 0x7d, 0xbd, 0xa8, 0xc0, 0xa5, 0x0f, 0xd1, 0xa3, 0x67, 0xfc, 0xe5, 0xca, 0xaa, 0x61, - 0x8f, 0xf5, 0x6c, 0x0d, 0x21, 0x53, 0x74, 0xd9, 0x26, 0xe8, 0x7c, 0xfc, 0x1f, 0x09, 0x12, 0xab, - 0xa6, 0x59, 0x47, 0x26, 0x8c, 0x18, 0xa6, 0x5b, 0x21, 0x9e, 0x85, 0xab, 0x15, 0x7e, 0xe8, 0x66, - 0x71, 0x70, 0x6e, 0x7f, 0x46, 0xfa, 0xee, 0xad, 0xc9, 0x56, 0x56, 0xca, 0xb0, 0x61, 0xba, 0x45, - 0x0a, 0x59, 0x67, 0x47, 0xf2, 0x8f, 0xc0, 0x60, 0x78, 0x30, 0x16, 0x25, 0x9f, 0xdd, 0xf7, 0x60, - 0x61, 0x36, 0xb7, 0x6f, 0x4d, 0x8e, 0xf9, 0x2b, 0xc6, 0x03, 0xcb, 0x4a, 0x66, 0x33, 0x30, 0x3a, - 0xbb, 0x89, 0xf6, 0xfd, 0x57, 0x26, 0xa5, 0x53, 0xdf, 0x94, 0x00, 0xfc, 0xca, 0x03, 0x7a, 0x18, - 0x8e, 0x14, 0x57, 0x96, 0x4b, 0x95, 0xb5, 0xf5, 0xd9, 0xf5, 0x8d, 0xb5, 0xca, 0xc6, 0xf2, 0xda, - 0x6a, 0x79, 0x6e, 0xe1, 0xe2, 0x42, 0xb9, 0xe4, 0x57, 0xf2, 0x1d, 0x0b, 0x6b, 0xfa, 0x96, 0x8e, - 0xab, 0xe8, 0x7e, 0x18, 0x0b, 0x63, 0x93, 0x56, 0xb9, 0x94, 0x95, 0xf2, 0x99, 0x97, 0x6e, 0x4e, - 0xa5, 0x58, 0x2e, 0x86, 0xab, 0xe8, 0x24, 0x1c, 0x6e, 0xc5, 0x5b, 0x58, 0x9e, 0xcf, 0xc6, 0xf2, - 0x83, 0x2f, 0xdd, 0x9c, 0x4a, 0x7b, 0x49, 0x1b, 0x92, 0x01, 0x05, 0x31, 0x39, 0xbf, 0x78, 0x1e, - 0x5e, 0xba, 0x39, 0xd5, 0xc7, 0x0c, 0x98, 0x4f, 0x7c, 0xf2, 0xab, 0x13, 0x87, 0x8a, 0x17, 0x3b, - 0xd6, 0xea, 0x1f, 0xde, 0xd3, 0x76, 0x3b, 0x5e, 0xc1, 0x39, 0x5c, 0xa0, 0xff, 0xd6, 0x30, 0x4c, - 0x76, 0xa8, 0x48, 0xbb, 0x3b, 0x07, 0x2a, 0x46, 0x77, 0xa9, 0x16, 0xe7, 0x7b, 0x2a, 0x80, 0xcb, - 0x37, 0x13, 0x80, 0x96, 0x9c, 0xda, 0x1c, 0xc9, 0x7e, 0x02, 0xd7, 0xbe, 0x22, 0xc5, 0x15, 0xe9, - 0x6d, 0x15, 0x57, 0x96, 0x42, 0xe5, 0x8a, 0xd8, 0xfe, 0x8a, 0x9c, 0x3d, 0xd7, 0x2c, 0xe2, 0xef, - 0x48, 0xcd, 0xa2, 0x7d, 0x4a, 0x93, 0xb8, 0x73, 0x67, 0x9f, 0xe4, 0x81, 0xce, 0x3e, 0xe3, 0xd0, - 0xc7, 0x8b, 0x8b, 0xec, 0x9b, 0xe3, 0xbc, 0x85, 0xce, 0x88, 0x4f, 0x35, 0xf7, 0xf7, 0xb6, 0xa9, - 0x30, 0xec, 0x42, 0xea, 0x93, 0x62, 0x4b, 0xf9, 0x5c, 0x1c, 0xb2, 0x4b, 0x4e, 0xad, 0x5c, 0xd5, - 0xdd, 0xbb, 0xe4, 0x1d, 0x4f, 0x77, 0x3e, 0x01, 0xa2, 0xdb, 0xb7, 0x26, 0x87, 0x98, 0x15, 0xf6, - 0xd0, 0xbd, 0x01, 0xc3, 0x91, 0x4a, 0x3a, 0xf7, 0x85, 0xd2, 0x41, 0x0a, 0xfa, 0x11, 0x56, 0x32, - 0x4d, 0xd8, 0x03, 0x1e, 0x89, 0x76, 0xda, 0xbb, 0x1f, 0x73, 0x81, 0x4b, 0x77, 0xb3, 0x5c, 0xe6, - 0xcf, 0xca, 0x9f, 0x48, 0x30, 0xb0, 0xe4, 0x88, 0x43, 0x28, 0xfe, 0x21, 0x3d, 0x90, 0x3f, 0xe9, - 0xbd, 0x36, 0x12, 0xef, 0xcd, 0xfb, 0xc4, 0xab, 0x24, 0xbe, 0xa2, 0xbf, 0x1b, 0xa3, 0xe1, 0xa9, - 0x88, 0x6b, 0xba, 0xe1, 0x6d, 0xbe, 0xf8, 0x2f, 0xeb, 0xb9, 0xc2, 0x37, 0x68, 0xe2, 0xa0, 0x06, - 0x7d, 0x53, 0x82, 0xc1, 0x25, 0xa7, 0xb6, 0x61, 0x54, 0xff, 0x5f, 0xf7, 0x9d, 0x3b, 0xbe, 0x85, - 0xff, 0x8b, 0x18, 0x9c, 0x0a, 0xee, 0xb9, 0xcf, 0x37, 0xb1, 0xbd, 0xeb, 0x6d, 0xab, 0x96, 0x5a, - 0xd3, 0x8d, 0xe0, 0xf3, 0xf6, 0xa3, 0x41, 0x81, 0x29, 0xae, 0x10, 0x5b, 0x36, 0x60, 0x60, 0x55, - 0xad, 0x61, 0x05, 0x3f, 0xdf, 0xc4, 0x8e, 0xdb, 0xe6, 0xf5, 0x95, 0x71, 0xe8, 0x33, 0xb7, 0xb6, - 0xc4, 0x65, 0x9a, 0x84, 0xc2, 0x5b, 0x68, 0x0c, 0x92, 0x75, 0xbd, 0xa1, 0x33, 0xa3, 0x24, 0x14, - 0xd6, 0x40, 0x93, 0x30, 0xa0, 0x11, 0xdd, 0x2b, 0xec, 0x62, 0x70, 0x42, 0x7c, 0xce, 0xa2, 0x69, - 0xb8, 0xeb, 0x04, 0x22, 0x3f, 0x0d, 0x19, 0x36, 0x1e, 0x4f, 0xa0, 0x8f, 0x42, 0x8a, 0x5e, 0xe4, - 0xf4, 0x47, 0xed, 0x27, 0xed, 0x2b, 0xec, 0x55, 0x17, 0xc6, 0x85, 0x0d, 0xcc, 0x1a, 0xc5, 0x62, - 0x47, 0x53, 0x9e, 0xec, 0x1e, 0xec, 0x98, 0xa1, 0x3c, 0x33, 0xfe, 0x56, 0x12, 0x0e, 0xf3, 0x07, - 0xe1, 0xaa, 0xa5, 0xcf, 0x6c, 0xbb, 0xae, 0x78, 0xe7, 0x0a, 0xf8, 0xc9, 0x55, 0xb5, 0x74, 0x79, - 0x17, 0x12, 0x97, 0x5c, 0xd7, 0x42, 0xa7, 0x20, 0x69, 0x37, 0xeb, 0x58, 0x14, 0x70, 0xc7, 0xa6, - 0x7d, 0x9c, 0x69, 0x82, 0xa0, 0x34, 0xeb, 0x58, 0x61, 0x28, 0xa8, 0x0c, 0x93, 0x5b, 0xcd, 0x7a, - 0x7d, 0xb7, 0x52, 0xc5, 0xf4, 0x3f, 0x0c, 0x79, 0x1f, 0xf3, 0xc7, 0x3b, 0x96, 0x6a, 0x78, 0xc9, - 0x47, 0x4a, 0x39, 0x4e, 0xd1, 0x4a, 0x14, 0x4b, 0x7c, 0xc8, 0xbf, 0x2c, 0x70, 0xe4, 0x3f, 0x88, - 0x41, 0x4a, 0xb0, 0xa6, 0xef, 0x9e, 0xe0, 0x3a, 0xd6, 0x5c, 0x53, 0x3c, 0xd2, 0xf4, 0xda, 0x08, - 0x41, 0xbc, 0xc6, 0xa7, 0x28, 0x7d, 0xe9, 0x90, 0x42, 0x1a, 0x04, 0xe6, 0xbd, 0x11, 0x44, 0x60, - 0x56, 0x93, 0xcc, 0x5a, 0xc2, 0x32, 0x45, 0xa5, 0xe5, 0xd2, 0x21, 0x85, 0xb6, 0x50, 0x0e, 0xfa, - 0xc8, 0x02, 0x72, 0xd9, 0x67, 0x16, 0x09, 0x9c, 0xb7, 0xd1, 0x38, 0x24, 0x2d, 0xd5, 0xd5, 0xd8, - 0x65, 0x5e, 0xd2, 0xc1, 0x9a, 0x64, 0x4d, 0xb0, 0xd7, 0x5b, 0xa3, 0xff, 0xbe, 0x83, 0x18, 0x83, - 0x7d, 0x47, 0x8c, 0xc8, 0xbd, 0xaa, 0xba, 0x2e, 0xb6, 0x0d, 0xc2, 0x90, 0xa1, 0x23, 0x04, 0x89, - 0x4d, 0xb3, 0xba, 0xcb, 0xff, 0xa5, 0x08, 0xfd, 0xcd, 0xff, 0xd9, 0x01, 0xf5, 0x87, 0x0a, 0xed, - 0x64, 0xff, 0x49, 0x29, 0x23, 0x80, 0x45, 0x82, 0x54, 0x86, 0x51, 0xb5, 0x5a, 0xd5, 0x89, 0x57, - 0xab, 0xf5, 0xca, 0xa6, 0x4e, 0xb3, 0x68, 0x87, 0xfe, 0x9f, 0xac, 0x4e, 0x73, 0x81, 0x7c, 0x82, - 0x22, 0xc7, 0x2f, 0xa6, 0xa1, 0xdf, 0x62, 0x42, 0xc9, 0x17, 0x60, 0xa4, 0x45, 0x52, 0x22, 0xdf, - 0x35, 0xdd, 0xa8, 0x8a, 0xd7, 0xa4, 0xc8, 0x6f, 0x02, 0xa3, 0xdf, 0x02, 0x64, 0x0f, 0x8b, 0xe9, - 0xef, 0xe2, 0x4f, 0x74, 0xbe, 0x75, 0x32, 0x14, 0xb8, 0x75, 0xa2, 0x5a, 0x7a, 0x31, 0x4d, 0xf9, - 0xf3, 0xcb, 0x26, 0xb3, 0xbc, 0x83, 0x5d, 0x34, 0x99, 0x36, 0xed, 0xda, 0x4c, 0x0d, 0x1b, 0x22, - 0xa3, 0x26, 0x5d, 0xaa, 0xa5, 0x3b, 0xd4, 0x1d, 0xfd, 0x6f, 0x13, 0x3a, 0x17, 0x02, 0xbf, 0xe9, - 0x1d, 0x94, 0xc4, 0xfc, 0xec, 0xea, 0x82, 0xe7, 0xc7, 0xbf, 0x19, 0x83, 0xe3, 0x01, 0x3f, 0x0e, - 0x20, 0xb7, 0xba, 0x73, 0xbe, 0xbd, 0xc7, 0xf7, 0xf0, 0x65, 0xbf, 0x2b, 0x90, 0x20, 0xf8, 0xa8, - 0xcb, 0xbf, 0x22, 0xc8, 0xfd, 0xca, 0xbf, 0xfa, 0xa7, 0x32, 0x75, 0x8a, 0xf6, 0xb3, 0x42, 0x99, - 0x14, 0x3f, 0xd1, 0xbb, 0xfd, 0xb2, 0xfe, 0x67, 0x19, 0x9d, 0x3b, 0x67, 0xc6, 0xa8, 0x0d, 0xdf, - 0x38, 0x03, 0x72, 0x87, 0x63, 0x0a, 0x8b, 0x98, 0x7b, 0x1f, 0x8c, 0xf6, 0x11, 0x8e, 0x3b, 0xdd, - 0xe8, 0xd9, 0x6b, 0x06, 0x7b, 0x3c, 0x42, 0xed, 0xc0, 0xf8, 0x33, 0x64, 0x6c, 0xbf, 0xea, 0x25, - 0x02, 0xfb, 0xb8, 0xf7, 0x70, 0x5e, 0xe2, 0xff, 0xa6, 0x4c, 0x3c, 0x78, 0x07, 0x5f, 0x3e, 0x7e, - 0x20, 0xba, 0x7f, 0xba, 0xe3, 0x7e, 0x31, 0x1d, 0xd8, 0x2c, 0x94, 0x00, 0xa5, 0xfc, 0x8b, 0x12, - 0x1c, 0x69, 0x19, 0x9a, 0xc7, 0xf8, 0xf9, 0x36, 0x2f, 0x49, 0xf5, 0x7c, 0xcb, 0x27, 0xf8, 0xc2, - 0xd4, 0x7c, 0x1b, 0x61, 0x1f, 0xe8, 0x2a, 0x2c, 0x93, 0x22, 0x24, 0xed, 0x53, 0x70, 0x38, 0x2c, - 0xac, 0x30, 0xd3, 0x7b, 0x60, 0x28, 0x9c, 0x13, 0x70, 0x73, 0x0d, 0x86, 0xb2, 0x02, 0xb9, 0x12, - 0xb5, 0xb3, 0xa7, 0x6b, 0x19, 0xd2, 0x1e, 0x2a, 0x3f, 0x8d, 0xf4, 0xac, 0xaa, 0x4f, 0x29, 0x7f, - 0x56, 0x82, 0xa9, 0xf0, 0x08, 0x7e, 0xf2, 0xed, 0xec, 0x4f, 0xd8, 0x3b, 0x36, 0xc5, 0x6f, 0x4a, - 0x70, 0xcf, 0x1e, 0x32, 0x71, 0x03, 0xbc, 0x00, 0x63, 0x81, 0xc2, 0x9e, 0x08, 0xe1, 0x62, 0xda, - 0x4f, 0x75, 0xaf, 0x48, 0x7a, 0x75, 0xac, 0x63, 0xc4, 0x28, 0x5f, 0xff, 0xa3, 0xc9, 0xd1, 0xd6, - 0x3e, 0x47, 0x19, 0x6d, 0x2d, 0xc6, 0xdd, 0x41, 0xff, 0x78, 0x59, 0x82, 0x07, 0xc3, 0xaa, 0xb6, - 0x79, 0xda, 0xf6, 0x6e, 0xcd, 0xc3, 0xbf, 0x93, 0xe0, 0x54, 0x2f, 0xc2, 0xf1, 0x09, 0xd9, 0x84, - 0x51, 0xbf, 0xbc, 0x1e, 0x9d, 0x8f, 0x87, 0xf6, 0xf1, 0x5c, 0x92, 0x7b, 0x29, 0xf2, 0xb8, 0xdd, - 0x05, 0xc3, 0x5b, 0x7c, 0x61, 0x05, 0xa7, 0xdc, 0x33, 0x72, 0x38, 0xf1, 0x17, 0x46, 0x0e, 0xa5, - 0xfe, 0x6d, 0xe6, 0x22, 0xd6, 0x66, 0x2e, 0x02, 0xa7, 0x90, 0xeb, 0x3c, 0x6e, 0xb5, 0x29, 0xa9, - 0x7f, 0x08, 0x46, 0xdb, 0xb8, 0x32, 0x5f, 0xd5, 0xfb, 0xf0, 0x64, 0x05, 0xb5, 0x3a, 0xab, 0xbc, - 0x0b, 0x93, 0x74, 0xdc, 0x36, 0x86, 0xbe, 0xdb, 0x2a, 0x37, 0x78, 0x6c, 0x69, 0x3b, 0x34, 0xd7, - 0x7d, 0x01, 0xfa, 0xd8, 0x3c, 0x73, 0x75, 0x0f, 0xe0, 0x28, 0x9c, 0x81, 0xfc, 0x45, 0x11, 0xcb, - 0x4a, 0x42, 0xec, 0xf6, 0x6b, 0xa8, 0x17, 0x5d, 0xef, 0xd0, 0x1a, 0x0a, 0x18, 0xe3, 0x35, 0x11, - 0xd5, 0xda, 0x4b, 0xc7, 0xcd, 0xa1, 0xdd, 0xb1, 0xa8, 0xc6, 0x6c, 0x73, 0x77, 0xc3, 0xd7, 0xcf, - 0x8b, 0xf0, 0xe5, 0xe9, 0xd4, 0x25, 0x7c, 0xbd, 0x3b, 0xa6, 0xf7, 0x02, 0x59, 0x17, 0x31, 0xff, - 0x22, 0x06, 0xb2, 0xef, 0x4b, 0x70, 0x94, 0xea, 0x16, 0x7c, 0x4e, 0xb3, 0x5f, 0x93, 0x3f, 0x0c, - 0xc8, 0xb1, 0xb5, 0x4a, 0xdb, 0xd5, 0x9d, 0x75, 0x6c, 0xed, 0x6a, 0x68, 0x7f, 0x79, 0x18, 0x50, - 0xd5, 0x71, 0xa3, 0xd8, 0xec, 0x1a, 0x6b, 0xb6, 0xea, 0xb8, 0x57, 0xf7, 0xd8, 0x8d, 0x12, 0x77, - 0x60, 0x3a, 0x5f, 0x95, 0x20, 0xdf, 0x4e, 0x65, 0x3e, 0x7d, 0x3a, 0x8c, 0x87, 0x9e, 0xf9, 0x45, - 0x67, 0xf0, 0xe1, 0x5e, 0x9e, 0x74, 0x45, 0x96, 0xd1, 0x61, 0x1b, 0xdf, 0xed, 0x3c, 0x60, 0x32, - 0xec, 0xa1, 0xad, 0x99, 0xf5, 0xbb, 0xb6, 0x7c, 0x7e, 0xbd, 0x25, 0xae, 0xfe, 0x85, 0xc8, 0xbd, - 0x77, 0x60, 0xa2, 0x83, 0xd4, 0x77, 0x7b, 0xdf, 0xdb, 0xee, 0x38, 0x99, 0x77, 0x3a, 0x7d, 0x7f, - 0x82, 0xaf, 0x84, 0xf0, 0x2b, 0x12, 0x81, 0xb3, 0x58, 0xbb, 0x97, 0x47, 0xe5, 0x0f, 0xc0, 0xb1, - 0xb6, 0x54, 0x5c, 0xb6, 0x02, 0x24, 0xb6, 0x75, 0xc7, 0xe5, 0x62, 0xdd, 0xdf, 0x49, 0xac, 0x08, - 0x35, 0xa5, 0x91, 0x11, 0x64, 0x29, 0xeb, 0x55, 0xd3, 0xac, 0x73, 0x31, 0xe4, 0x2b, 0x30, 0x12, - 0x80, 0xf1, 0x41, 0xce, 0x42, 0xc2, 0x32, 0xf9, 0x87, 0x4f, 0x06, 0x4e, 0x1f, 0xef, 0x34, 0x08, - 0xa1, 0xe1, 0x6a, 0x53, 0x7c, 0x79, 0x0c, 0x10, 0x63, 0x46, 0xaf, 0x84, 0x88, 0x21, 0xd6, 0x60, - 0x34, 0x04, 0xe5, 0x83, 0xfc, 0x08, 0xf4, 0x59, 0x14, 0xe2, 0xbd, 0xe5, 0xd7, 0x69, 0x18, 0x8a, - 0xe5, 0x7d, 0x6a, 0x82, 0xb6, 0x4e, 0x7f, 0xf7, 0x30, 0x24, 0x29, 0x57, 0xf4, 0x05, 0x09, 0x20, - 0x70, 0xc1, 0x63, 0xba, 0x13, 0x9b, 0xf6, 0x67, 0xe2, 0xfc, 0x4c, 0xcf, 0xf8, 0x3c, 0x67, 0x3b, - 0xf5, 0x13, 0xff, 0xe6, 0x8d, 0xcf, 0xc5, 0xee, 0x43, 0xf2, 0x4c, 0x87, 0xd3, 0x78, 0x60, 0xbd, - 0x7c, 0x2d, 0xf4, 0xd5, 0x8d, 0x47, 0x7a, 0x1b, 0x4a, 0x48, 0x36, 0xdd, 0x2b, 0x3a, 0x17, 0xec, - 0x02, 0x15, 0xec, 0x0c, 0x7a, 0xbc, 0xbb, 0x60, 0x33, 0x1f, 0x0e, 0x2f, 0x9a, 0x8f, 0xa2, 0xdf, - 0x93, 0x60, 0xac, 0xdd, 0x91, 0x0e, 0x9d, 0xeb, 0x4d, 0x8a, 0xd6, 0x94, 0x22, 0x7f, 0xfe, 0x00, - 0x94, 0x5c, 0x95, 0x79, 0xaa, 0xca, 0x2c, 0x7a, 0xfa, 0x00, 0xaa, 0xcc, 0x04, 0xf6, 0x1d, 0xf4, - 0xbf, 0x24, 0x38, 0xb1, 0xe7, 0x09, 0x09, 0xcd, 0xf6, 0x26, 0xe5, 0x1e, 0xb9, 0x53, 0xbe, 0xf8, - 0x76, 0x58, 0x70, 0x8d, 0x9f, 0xa1, 0x1a, 0x5f, 0x41, 0x0b, 0x07, 0xd1, 0xd8, 0xcf, 0x88, 0x82, - 0xba, 0xff, 0x76, 0xf8, 0xa2, 0xf0, 0xde, 0xee, 0xd4, 0x72, 0xf0, 0xe8, 0xb2, 0x30, 0x5a, 0x93, - 0x5a, 0xf9, 0xfd, 0x54, 0x05, 0x05, 0xad, 0xbe, 0xcd, 0x49, 0x9b, 0xf9, 0x70, 0x38, 0xf0, 0x7f, - 0x14, 0xfd, 0x4f, 0xa9, 0xfd, 0xbd, 0xdf, 0x27, 0xf7, 0x14, 0xb1, 0xf3, 0xa1, 0x2a, 0x7f, 0x6e, - 0xff, 0x84, 0x5c, 0xc9, 0x06, 0x55, 0xb2, 0x86, 0xf0, 0x9d, 0x56, 0xb2, 0xed, 0x24, 0xa2, 0xdf, - 0x91, 0x60, 0xac, 0xdd, 0x99, 0xa4, 0xcb, 0xb2, 0xdc, 0xe3, 0x90, 0xd5, 0x65, 0x59, 0xee, 0x75, - 0x00, 0x92, 0x7f, 0x84, 0x2a, 0x7f, 0x16, 0x3d, 0xd1, 0x49, 0xf9, 0x3d, 0x67, 0x91, 0xac, 0xc5, - 0x3d, 0x93, 0xfc, 0x2e, 0x6b, 0xb1, 0x97, 0x73, 0x4c, 0x97, 0xb5, 0xd8, 0xd3, 0x19, 0xa3, 0xfb, - 0x5a, 0xf4, 0x34, 0xeb, 0x71, 0x1a, 0x1d, 0xf4, 0x9b, 0x12, 0x0c, 0x86, 0x32, 0x62, 0xf4, 0xd8, - 0x9e, 0x82, 0xb6, 0x3b, 0x30, 0xe4, 0x4f, 0xef, 0x87, 0x84, 0xeb, 0xb2, 0x40, 0x75, 0x99, 0x43, - 0xb3, 0x07, 0xd1, 0xc5, 0x0e, 0x49, 0xfc, 0xaa, 0x04, 0xa3, 0x6d, 0xb2, 0xcc, 0x2e, 0xab, 0xb0, - 0x73, 0xd2, 0x9c, 0x3f, 0xb7, 0x7f, 0x42, 0xae, 0xd5, 0x45, 0xaa, 0xd5, 0xfb, 0xd0, 0x53, 0x07, - 0xd1, 0x2a, 0xb0, 0x3f, 0xdf, 0xf2, 0xaf, 0x51, 0x06, 0xc6, 0x41, 0x67, 0xf7, 0x29, 0x98, 0x50, - 0xe8, 0xc9, 0x7d, 0xd3, 0x71, 0x7d, 0x9e, 0xa5, 0xfa, 0x3c, 0x83, 0x56, 0xde, 0x9e, 0x3e, 0xad, - 0xdb, 0xfa, 0x37, 0x5a, 0x5f, 0xd1, 0xdd, 0xdb, 0x8b, 0xda, 0x26, 0xab, 0xf9, 0xc7, 0xf7, 0x45, - 0xc3, 0x95, 0x3a, 0x47, 0x95, 0x3a, 0x8d, 0x1e, 0xed, 0xa4, 0x54, 0xe0, 0xae, 0xac, 0x6e, 0x6c, - 0x99, 0x33, 0x1f, 0x66, 0x29, 0xf0, 0x47, 0xd1, 0x8f, 0x8b, 0x7b, 0x8a, 0x27, 0xf7, 0x1c, 0x37, - 0x90, 0xc7, 0xe6, 0x1f, 0xec, 0x01, 0x93, 0xcb, 0x75, 0x1f, 0x95, 0x6b, 0x02, 0x1d, 0xef, 0x24, - 0x17, 0xc9, 0x65, 0xd1, 0xa7, 0x24, 0xef, 0x6a, 0xf3, 0xa9, 0xbd, 0x79, 0x07, 0x93, 0xdd, 0xfc, - 0x43, 0x3d, 0xe1, 0x72, 0x49, 0xee, 0xa7, 0x92, 0x4c, 0xa1, 0x89, 0x8e, 0x92, 0xb0, 0xd4, 0xf7, - 0x4e, 0xdf, 0x1c, 0xf8, 0xb3, 0xfe, 0x8e, 0xaf, 0xa3, 0xd7, 0xb0, 0x81, 0x1d, 0xdd, 0x39, 0xd0, - 0x0d, 0xc0, 0xde, 0x1e, 0x4f, 0xfd, 0x5e, 0x12, 0x32, 0xf3, 0x6c, 0x94, 0x35, 0x57, 0x75, 0xdf, - 0xe6, 0x41, 0x00, 0x39, 0xfc, 0xa3, 0x53, 0xec, 0x5b, 0x78, 0xfe, 0xd7, 0xdd, 0x32, 0xfb, 0x7a, - 0xd9, 0x93, 0xdd, 0x7f, 0xe2, 0xef, 0x55, 0x46, 0xf9, 0xc9, 0xec, 0xfb, 0x55, 0xf4, 0xee, 0x02, - 0xfb, 0x8a, 0xdd, 0xc7, 0x25, 0x38, 0x4c, 0xb1, 0xfc, 0xf5, 0x46, 0x31, 0xc5, 0x9b, 0x3e, 0x1d, - 0x3d, 0x66, 0x51, 0x0d, 0x94, 0x60, 0xd8, 0x77, 0xe7, 0xee, 0xe3, 0xb7, 0xe0, 0x8f, 0x07, 0x06, - 0x8f, 0xb2, 0x95, 0x95, 0xd1, 0x7a, 0x0b, 0xa5, 0x13, 0x39, 0xd7, 0x27, 0x0e, 0x7e, 0xae, 0xbf, - 0x0c, 0x03, 0x81, 0x48, 0x9f, 0x4b, 0x76, 0x79, 0x39, 0x2d, 0x5a, 0x44, 0x0b, 0x12, 0xa3, 0x4f, - 0x48, 0x70, 0xb8, 0xed, 0x26, 0x48, 0xff, 0xc1, 0xdf, 0x3e, 0x8b, 0x74, 0x11, 0xe3, 0xb4, 0xe5, - 0x2b, 0x2b, 0x63, 0xcd, 0x76, 0xd9, 0xc4, 0x2a, 0x0c, 0x86, 0x36, 0xb0, 0x9c, 0xf8, 0x37, 0x9d, - 0xbd, 0xdf, 0xcb, 0x0e, 0x33, 0x40, 0x79, 0x48, 0xe1, 0x1d, 0xcb, 0xb4, 0x5d, 0x5c, 0xa5, 0x57, - 0x1e, 0x52, 0x8a, 0xd7, 0x96, 0x97, 0x01, 0xb5, 0x4e, 0x6e, 0xf4, 0x43, 0x8b, 0x69, 0xff, 0x43, - 0x8b, 0x63, 0x90, 0x0c, 0x7e, 0x8a, 0x90, 0x35, 0xee, 0xde, 0x6d, 0xa1, 0xff, 0x1b, 0x00, 0x00, - 0xff, 0xff, 0x08, 0x1f, 0x88, 0x9b, 0x77, 0x8d, 0x00, 0x00, + // 9554 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x24, 0xc7, + 0x75, 0x18, 0x7e, 0xb3, 0x1f, 0xc0, 0xee, 0xc3, 0x02, 0x58, 0x34, 0x70, 0xe0, 0xde, 0xf2, 0x08, + 0x80, 0xc3, 0xaf, 0xe3, 0x91, 0x04, 0xc8, 0x23, 0xef, 0x78, 0xb7, 0x27, 0x91, 0xc2, 0x02, 0x7b, + 0x38, 0xdc, 0xe1, 0x8b, 0x03, 0xe0, 0xa8, 0x2f, 0xff, 0xb6, 0x06, 0xbb, 0x8d, 0xc5, 0x10, 0xbb, + 0x33, 0xc3, 0x99, 0xd9, 0xbb, 0x03, 0x25, 0x55, 0xd1, 0x92, 0x7e, 0x8a, 0x44, 0xc7, 0x91, 0x64, + 0xb9, 0x1c, 0x89, 0xd2, 0x29, 0x92, 0xe5, 0x44, 0x8e, 0xec, 0xc4, 0x1f, 0x52, 0x94, 0x38, 0x49, + 0x95, 0xe5, 0x54, 0x1c, 0x4b, 0x4a, 0x95, 0x4b, 0xaa, 0xb8, 0x12, 0xc7, 0x15, 0x9f, 0x1d, 0x4a, + 0x71, 0x18, 0x45, 0x89, 0xe5, 0x8b, 0x9c, 0x38, 0xa5, 0x54, 0x25, 0xd5, 0x5f, 0xf3, 0xb5, 0x1f, + 0xb3, 0x0b, 0xdd, 0x89, 0x72, 0x9c, 0xbf, 0xb0, 0xfd, 0xfa, 0xbd, 0xd7, 0xaf, 0x5f, 0xbf, 0x7e, + 0xfd, 0xfa, 0x75, 0xf7, 0x00, 0x3e, 0x79, 0x1e, 0x66, 0x6a, 0x86, 0x51, 0xab, 0xe3, 0x39, 0xd3, + 0x32, 0x1c, 0x63, 0xa7, 0xb9, 0x3b, 0x57, 0xc5, 0x76, 0xc5, 0xd2, 0x4c, 0xc7, 0xb0, 0x66, 0x29, + 0x0c, 0x8d, 0x32, 0x8c, 0x59, 0x81, 0x21, 0xaf, 0xc2, 0xd8, 0x05, 0xad, 0x8e, 0x17, 0x5d, 0xc4, + 0x4d, 0xec, 0xa0, 0xb3, 0x90, 0xd8, 0xd5, 0xea, 0x38, 0x27, 0xcd, 0xc4, 0x4f, 0x0c, 0x9d, 0xba, + 0x7f, 0x36, 0x44, 0x34, 0x1b, 0xa4, 0xd8, 0x20, 0x60, 0x85, 0x52, 0xc8, 0xdf, 0x4e, 0xc0, 0x78, + 0x9b, 0x5a, 0x84, 0x20, 0xa1, 0xab, 0x0d, 0xc2, 0x51, 0x3a, 0x91, 0x56, 0xe8, 0x6f, 0x94, 0x83, + 0x41, 0x53, 0xad, 0xec, 0xab, 0x35, 0x9c, 0x8b, 0x51, 0xb0, 0x28, 0xa2, 0x29, 0x80, 0x2a, 0x36, + 0xb1, 0x5e, 0xc5, 0x7a, 0xe5, 0x20, 0x17, 0x9f, 0x89, 0x9f, 0x48, 0x2b, 0x3e, 0x08, 0x7a, 0x04, + 0xc6, 0xcc, 0xe6, 0x4e, 0x5d, 0xab, 0x94, 0x7d, 0x68, 0x30, 0x13, 0x3f, 0x91, 0x54, 0xb2, 0xac, + 0x62, 0xd1, 0x43, 0x7e, 0x08, 0x46, 0xaf, 0x61, 0x75, 0xdf, 0x8f, 0x3a, 0x44, 0x51, 0x47, 0x08, + 0xd8, 0x87, 0xb8, 0x00, 0x99, 0x06, 0xb6, 0x6d, 0xb5, 0x86, 0xcb, 0xce, 0x81, 0x89, 0x73, 0x09, + 0xda, 0xfb, 0x99, 0x96, 0xde, 0x87, 0x7b, 0x3e, 0xc4, 0xa9, 0xb6, 0x0e, 0x4c, 0x8c, 0xe6, 0x21, + 0x8d, 0xf5, 0x66, 0x83, 0x71, 0x48, 0x76, 0xd0, 0x5f, 0x49, 0x6f, 0x36, 0xc2, 0x5c, 0x52, 0x84, + 0x8c, 0xb3, 0x18, 0xb4, 0xb1, 0x75, 0x55, 0xab, 0xe0, 0xdc, 0x00, 0x65, 0xf0, 0x50, 0x0b, 0x83, + 0x4d, 0x56, 0x1f, 0xe6, 0x21, 0xe8, 0xd0, 0x02, 0xa4, 0xf1, 0x75, 0x07, 0xeb, 0xb6, 0x66, 0xe8, + 0xb9, 0x41, 0xca, 0xe4, 0x81, 0x36, 0xa3, 0x88, 0xeb, 0xd5, 0x30, 0x0b, 0x8f, 0x0e, 0x9d, 0x81, + 0x41, 0xc3, 0x74, 0x34, 0x43, 0xb7, 0x73, 0xa9, 0x19, 0xe9, 0xc4, 0xd0, 0xa9, 0xe3, 0x6d, 0x0d, + 0x61, 0x9d, 0xe1, 0x28, 0x02, 0x19, 0x2d, 0x43, 0xd6, 0x36, 0x9a, 0x56, 0x05, 0x97, 0x2b, 0x46, + 0x15, 0x97, 0x35, 0x7d, 0xd7, 0xc8, 0xa5, 0x29, 0x83, 0xe9, 0xd6, 0x8e, 0x50, 0xc4, 0x05, 0xa3, + 0x8a, 0x97, 0xf5, 0x5d, 0x43, 0x19, 0xb1, 0x03, 0x65, 0x34, 0x09, 0x03, 0xf6, 0x81, 0xee, 0xa8, + 0xd7, 0x73, 0x19, 0x6a, 0x21, 0xbc, 0x24, 0xff, 0xc6, 0x00, 0x8c, 0xf6, 0x62, 0x62, 0xe7, 0x21, + 0xb9, 0x4b, 0x7a, 0x99, 0x8b, 0xf5, 0xa3, 0x03, 0x46, 0x13, 0x54, 0xe2, 0xc0, 0x21, 0x95, 0x38, + 0x0f, 0x43, 0x3a, 0xb6, 0x1d, 0x5c, 0x65, 0x16, 0x11, 0xef, 0xd1, 0xa6, 0x80, 0x11, 0xb5, 0x9a, + 0x54, 0xe2, 0x50, 0x26, 0xf5, 0x56, 0x18, 0x75, 0x45, 0x2a, 0x5b, 0xaa, 0x5e, 0x13, 0xb6, 0x39, + 0x17, 0x25, 0xc9, 0x6c, 0x49, 0xd0, 0x29, 0x84, 0x4c, 0x19, 0xc1, 0x81, 0x32, 0x5a, 0x04, 0x30, + 0x74, 0x6c, 0xec, 0x96, 0xab, 0xb8, 0x52, 0xcf, 0xa5, 0x3a, 0x68, 0x69, 0x9d, 0xa0, 0xb4, 0x68, + 0xc9, 0x60, 0xd0, 0x4a, 0x1d, 0x9d, 0xf3, 0x4c, 0x6d, 0xb0, 0x83, 0xa5, 0xac, 0xb2, 0x49, 0xd6, + 0x62, 0x6d, 0xdb, 0x30, 0x62, 0x61, 0x62, 0xf7, 0xb8, 0xca, 0x7b, 0x96, 0xa6, 0x42, 0xcc, 0x46, + 0xf6, 0x4c, 0xe1, 0x64, 0xac, 0x63, 0xc3, 0x96, 0xbf, 0x88, 0xee, 0x03, 0x17, 0x50, 0xa6, 0x66, + 0x05, 0xd4, 0x0b, 0x65, 0x04, 0x70, 0x4d, 0x6d, 0xe0, 0xfc, 0x4b, 0x30, 0x12, 0x54, 0x0f, 0x9a, + 0x80, 0xa4, 0xed, 0xa8, 0x96, 0x43, 0xad, 0x30, 0xa9, 0xb0, 0x02, 0xca, 0x42, 0x1c, 0xeb, 0x55, + 0xea, 0xe5, 0x92, 0x0a, 0xf9, 0x89, 0xde, 0xe2, 0x75, 0x38, 0x4e, 0x3b, 0xfc, 0x60, 0xeb, 0x88, + 0x06, 0x38, 0x87, 0xfb, 0x9d, 0x7f, 0x1a, 0x86, 0x03, 0x1d, 0xe8, 0xb5, 0x69, 0xf9, 0xdd, 0x70, + 0xb4, 0x2d, 0x6b, 0xf4, 0x56, 0x98, 0x68, 0xea, 0x9a, 0xee, 0x60, 0xcb, 0xb4, 0x30, 0xb1, 0x58, + 0xd6, 0x54, 0xee, 0x3f, 0x0e, 0x76, 0xb0, 0xb9, 0x6d, 0x3f, 0x36, 0xe3, 0xa2, 0x8c, 0x37, 0x5b, + 0x81, 0x27, 0xd3, 0xa9, 0xd7, 0x07, 0xb3, 0x2f, 0xbf, 0xfc, 0xf2, 0xcb, 0x31, 0xf9, 0xe3, 0x03, + 0x30, 0xd1, 0x6e, 0xce, 0xb4, 0x9d, 0xbe, 0x93, 0x30, 0xa0, 0x37, 0x1b, 0x3b, 0xd8, 0xa2, 0x4a, + 0x4a, 0x2a, 0xbc, 0x84, 0xe6, 0x21, 0x59, 0x57, 0x77, 0x70, 0x3d, 0x97, 0x98, 0x91, 0x4e, 0x8c, + 0x9c, 0x7a, 0xa4, 0xa7, 0x59, 0x39, 0xbb, 0x42, 0x48, 0x14, 0x46, 0x89, 0x9e, 0x81, 0x04, 0x77, + 0xd1, 0x84, 0xc3, 0xc9, 0xde, 0x38, 0x90, 0xb9, 0xa4, 0x50, 0x3a, 0x74, 0x37, 0xa4, 0xc9, 0x5f, + 0x66, 0x1b, 0x03, 0x54, 0xe6, 0x14, 0x01, 0x10, 0xbb, 0x40, 0x79, 0x48, 0xd1, 0x69, 0x52, 0xc5, + 0x62, 0x69, 0x73, 0xcb, 0xc4, 0xb0, 0xaa, 0x78, 0x57, 0x6d, 0xd6, 0x9d, 0xf2, 0x55, 0xb5, 0xde, + 0xc4, 0xd4, 0xe0, 0xd3, 0x4a, 0x86, 0x03, 0xaf, 0x10, 0x18, 0x9a, 0x86, 0x21, 0x36, 0xab, 0x34, + 0xbd, 0x8a, 0xaf, 0x53, 0xef, 0x99, 0x54, 0xd8, 0x44, 0x5b, 0x26, 0x10, 0xd2, 0xfc, 0x0b, 0xb6, + 0xa1, 0x0b, 0xd3, 0xa4, 0x4d, 0x10, 0x00, 0x6d, 0xfe, 0xe9, 0xb0, 0xe3, 0xbe, 0xa7, 0x7d, 0xf7, + 0xc2, 0x36, 0x25, 0x7f, 0x39, 0x06, 0x09, 0xea, 0x2f, 0x46, 0x61, 0x68, 0xeb, 0x6d, 0x1b, 0xa5, + 0xf2, 0xe2, 0xfa, 0x76, 0x71, 0xa5, 0x94, 0x95, 0xd0, 0x08, 0x00, 0x05, 0x5c, 0x58, 0x59, 0x9f, + 0xdf, 0xca, 0xc6, 0xdc, 0xf2, 0xf2, 0xda, 0xd6, 0x99, 0xa7, 0xb2, 0x71, 0x97, 0x60, 0x9b, 0x01, + 0x12, 0x7e, 0x84, 0x27, 0x4f, 0x65, 0x93, 0x28, 0x0b, 0x19, 0xc6, 0x60, 0xf9, 0xad, 0xa5, 0xc5, + 0x33, 0x4f, 0x65, 0x07, 0x82, 0x90, 0x27, 0x4f, 0x65, 0x07, 0xd1, 0x30, 0xa4, 0x29, 0xa4, 0xb8, + 0xbe, 0xbe, 0x92, 0x4d, 0xb9, 0x3c, 0x37, 0xb7, 0x94, 0xe5, 0xb5, 0xa5, 0x6c, 0xda, 0xe5, 0xb9, + 0xa4, 0xac, 0x6f, 0x6f, 0x64, 0xc1, 0xe5, 0xb0, 0x5a, 0xda, 0xdc, 0x9c, 0x5f, 0x2a, 0x65, 0x87, + 0x5c, 0x8c, 0xe2, 0xdb, 0xb6, 0x4a, 0x9b, 0xd9, 0x4c, 0x40, 0xac, 0x27, 0x4f, 0x65, 0x87, 0xdd, + 0x26, 0x4a, 0x6b, 0xdb, 0xab, 0xd9, 0x11, 0x34, 0x06, 0xc3, 0xac, 0x09, 0x21, 0xc4, 0x68, 0x08, + 0x74, 0xe6, 0xa9, 0x6c, 0xd6, 0x13, 0x84, 0x71, 0x19, 0x0b, 0x00, 0xce, 0x3c, 0x95, 0x45, 0xf2, + 0x02, 0x24, 0xa9, 0x75, 0x21, 0x04, 0x23, 0x2b, 0xf3, 0xc5, 0xd2, 0x4a, 0x79, 0x7d, 0x63, 0x6b, + 0x79, 0x7d, 0x6d, 0x7e, 0x25, 0x2b, 0x79, 0x30, 0xa5, 0xf4, 0xdc, 0xf6, 0xb2, 0x52, 0x5a, 0xcc, + 0xc6, 0xfc, 0xb0, 0x8d, 0xd2, 0xfc, 0x56, 0x69, 0x31, 0x1b, 0x97, 0x2b, 0x30, 0xd1, 0xce, 0x4f, + 0xb6, 0x9d, 0x19, 0xbe, 0x21, 0x8e, 0x75, 0x18, 0x62, 0xca, 0xab, 0x65, 0x88, 0xbf, 0x15, 0x83, + 0xf1, 0x36, 0x6b, 0x45, 0xdb, 0x46, 0x9e, 0x85, 0x24, 0x33, 0x51, 0xb6, 0x7a, 0x3e, 0xdc, 0x76, + 0xd1, 0xa1, 0x06, 0xdb, 0xb2, 0x82, 0x52, 0x3a, 0x7f, 0x04, 0x11, 0xef, 0x10, 0x41, 0x10, 0x16, + 0x2d, 0x3e, 0xfd, 0x27, 0x5a, 0x7c, 0x3a, 0x5b, 0xf6, 0xce, 0xf4, 0xb2, 0xec, 0x51, 0x58, 0x7f, + 0xbe, 0x3d, 0xd9, 0xc6, 0xb7, 0x9f, 0x87, 0xb1, 0x16, 0x46, 0x3d, 0xfb, 0xd8, 0xf7, 0x49, 0x90, + 0xeb, 0xa4, 0x9c, 0x08, 0x4f, 0x17, 0x0b, 0x78, 0xba, 0xf3, 0x61, 0x0d, 0xde, 0xdb, 0x79, 0x10, + 0x5a, 0xc6, 0xfa, 0xf3, 0x12, 0x4c, 0xb6, 0x8f, 0x14, 0xdb, 0xca, 0xf0, 0x0c, 0x0c, 0x34, 0xb0, + 0xb3, 0x67, 0x88, 0x68, 0xe9, 0xc1, 0x36, 0x6b, 0x30, 0xa9, 0x0e, 0x0f, 0x36, 0xa7, 0xf2, 0x2f, + 0xe2, 0xf1, 0x4e, 0xe1, 0x1e, 0x93, 0xa6, 0x45, 0xd2, 0x0f, 0xc5, 0xe0, 0x68, 0x5b, 0xe6, 0x6d, + 0x05, 0xbd, 0x07, 0x40, 0xd3, 0xcd, 0xa6, 0xc3, 0x22, 0x22, 0xe6, 0x60, 0xd3, 0x14, 0x42, 0x9d, + 0x17, 0x71, 0x9e, 0x4d, 0xc7, 0xad, 0x8f, 0xd3, 0x7a, 0x60, 0x20, 0x8a, 0x70, 0xd6, 0x13, 0x34, + 0x41, 0x05, 0x9d, 0xea, 0xd0, 0xd3, 0x16, 0xc3, 0x7c, 0x1c, 0xb2, 0x95, 0xba, 0x86, 0x75, 0xa7, + 0x6c, 0x3b, 0x16, 0x56, 0x1b, 0x9a, 0x5e, 0xa3, 0x2b, 0x48, 0xaa, 0x90, 0xdc, 0x55, 0xeb, 0x36, + 0x56, 0x46, 0x59, 0xf5, 0xa6, 0xa8, 0x25, 0x14, 0xd4, 0x80, 0x2c, 0x1f, 0xc5, 0x40, 0x80, 0x82, + 0x55, 0xbb, 0x14, 0xf2, 0xcf, 0xa4, 0x61, 0xc8, 0x17, 0x57, 0xa3, 0x7b, 0x21, 0xf3, 0x82, 0x7a, + 0x55, 0x2d, 0x8b, 0xbd, 0x12, 0xd3, 0xc4, 0x10, 0x81, 0x6d, 0xf0, 0xfd, 0xd2, 0xe3, 0x30, 0x41, + 0x51, 0x8c, 0xa6, 0x83, 0xad, 0x72, 0xa5, 0xae, 0xda, 0x36, 0x55, 0x5a, 0x8a, 0xa2, 0x22, 0x52, + 0xb7, 0x4e, 0xaa, 0x16, 0x44, 0x0d, 0x3a, 0x0d, 0xe3, 0x94, 0xa2, 0xd1, 0xac, 0x3b, 0x9a, 0x59, + 0xc7, 0x65, 0xb2, 0x7b, 0xb3, 0xe9, 0x4a, 0xe2, 0x4a, 0x36, 0x46, 0x30, 0x56, 0x39, 0x02, 0x91, + 0xc8, 0x46, 0x8b, 0x70, 0x0f, 0x25, 0xab, 0x61, 0x1d, 0x5b, 0xaa, 0x83, 0xcb, 0xf8, 0xc5, 0xa6, + 0x5a, 0xb7, 0xcb, 0xaa, 0x5e, 0x2d, 0xef, 0xa9, 0xf6, 0x5e, 0x6e, 0x82, 0x30, 0x28, 0xc6, 0x72, + 0x92, 0x72, 0x8c, 0x20, 0x2e, 0x71, 0xbc, 0x12, 0x45, 0x9b, 0xd7, 0xab, 0x17, 0x55, 0x7b, 0x0f, + 0x15, 0x60, 0x92, 0x72, 0xb1, 0x1d, 0x4b, 0xd3, 0x6b, 0xe5, 0xca, 0x1e, 0xae, 0xec, 0x97, 0x9b, + 0xce, 0xee, 0xd9, 0xdc, 0xdd, 0xfe, 0xf6, 0xa9, 0x84, 0x9b, 0x14, 0x67, 0x81, 0xa0, 0x6c, 0x3b, + 0xbb, 0x67, 0xd1, 0x26, 0x64, 0xc8, 0x60, 0x34, 0xb4, 0x97, 0x70, 0x79, 0xd7, 0xb0, 0xe8, 0xd2, + 0x38, 0xd2, 0xc6, 0x35, 0xf9, 0x34, 0x38, 0xbb, 0xce, 0x09, 0x56, 0x8d, 0x2a, 0x2e, 0x24, 0x37, + 0x37, 0x4a, 0xa5, 0x45, 0x65, 0x48, 0x70, 0xb9, 0x60, 0x58, 0xc4, 0xa0, 0x6a, 0x86, 0xab, 0xe0, + 0x21, 0x66, 0x50, 0x35, 0x43, 0xa8, 0xf7, 0x34, 0x8c, 0x57, 0x2a, 0xac, 0xcf, 0x5a, 0xa5, 0xcc, + 0xf7, 0x58, 0x76, 0x2e, 0x1b, 0x50, 0x56, 0xa5, 0xb2, 0xc4, 0x10, 0xb8, 0x8d, 0xdb, 0xe8, 0x1c, + 0x1c, 0xf5, 0x94, 0xe5, 0x27, 0x1c, 0x6b, 0xe9, 0x65, 0x98, 0xf4, 0x34, 0x8c, 0x9b, 0x07, 0xad, + 0x84, 0x28, 0xd0, 0xa2, 0x79, 0x10, 0x26, 0x7b, 0x1a, 0x26, 0xcc, 0x3d, 0xb3, 0x95, 0xee, 0xa4, + 0x9f, 0x0e, 0x99, 0x7b, 0x66, 0x98, 0xf0, 0x01, 0xba, 0xe1, 0xb6, 0x70, 0x45, 0x75, 0x70, 0x35, + 0x77, 0x97, 0x1f, 0xdd, 0x57, 0x81, 0xe6, 0x20, 0x5b, 0xa9, 0x94, 0xb1, 0xae, 0xee, 0xd4, 0x71, + 0x59, 0xb5, 0xb0, 0xae, 0xda, 0xb9, 0x69, 0x3f, 0xf2, 0x48, 0xa5, 0x52, 0xa2, 0xb5, 0xf3, 0xb4, + 0x12, 0x9d, 0x84, 0x31, 0x63, 0xe7, 0x85, 0x0a, 0x33, 0xc9, 0xb2, 0x69, 0xe1, 0x5d, 0xed, 0x7a, + 0xee, 0x7e, 0xaa, 0xdf, 0x51, 0x52, 0x41, 0x0d, 0x72, 0x83, 0x82, 0xd1, 0xc3, 0x90, 0xad, 0xd8, + 0x7b, 0xaa, 0x65, 0x52, 0x9f, 0x6c, 0x9b, 0x6a, 0x05, 0xe7, 0x1e, 0x60, 0xa8, 0x0c, 0xbe, 0x26, + 0xc0, 0x64, 0x4a, 0xd8, 0xd7, 0xb4, 0x5d, 0x47, 0x70, 0x7c, 0x88, 0x4d, 0x09, 0x0a, 0xe3, 0xdc, + 0x4e, 0x40, 0x96, 0xa8, 0x22, 0xd0, 0xf0, 0x09, 0x8a, 0x36, 0x62, 0xee, 0x99, 0xfe, 0x76, 0xef, + 0x83, 0x61, 0x82, 0xe9, 0x35, 0xfa, 0x30, 0x0b, 0xc8, 0xcc, 0x3d, 0x5f, 0x8b, 0x4f, 0xc1, 0x24, + 0x41, 0x6a, 0x60, 0x47, 0xad, 0xaa, 0x8e, 0xea, 0xc3, 0x7e, 0x94, 0x62, 0x13, 0xbd, 0xaf, 0xf2, + 0xca, 0x80, 0x9c, 0x56, 0x73, 0xe7, 0xc0, 0xb5, 0xac, 0xc7, 0x98, 0x9c, 0x04, 0x26, 0x6c, 0xeb, + 0x8e, 0x05, 0xdd, 0x72, 0x01, 0x32, 0x7e, 0xc3, 0x47, 0x69, 0x60, 0xa6, 0x9f, 0x95, 0x48, 0x14, + 0xb4, 0xb0, 0xbe, 0x48, 0xe2, 0x97, 0xb7, 0x97, 0xb2, 0x31, 0x12, 0x47, 0xad, 0x2c, 0x6f, 0x95, + 0xca, 0xca, 0xf6, 0xda, 0xd6, 0xf2, 0x6a, 0x29, 0x1b, 0xf7, 0x05, 0xec, 0x97, 0x12, 0xa9, 0x07, + 0xb3, 0x0f, 0xc9, 0xdf, 0x8c, 0xc1, 0x48, 0x70, 0x07, 0x86, 0xde, 0x04, 0x77, 0x89, 0x74, 0x89, + 0x8d, 0x9d, 0xf2, 0x35, 0xcd, 0xa2, 0x33, 0xb2, 0xa1, 0xb2, 0xd5, 0xd1, 0xb5, 0x89, 0x09, 0x8e, + 0xb5, 0x89, 0x9d, 0xe7, 0x35, 0x8b, 0xcc, 0xb7, 0x86, 0xea, 0xa0, 0x15, 0x98, 0xd6, 0x8d, 0xb2, + 0xed, 0xa8, 0x7a, 0x55, 0xb5, 0xaa, 0x65, 0x2f, 0x51, 0x55, 0x56, 0x2b, 0x15, 0x6c, 0xdb, 0x06, + 0x5b, 0x09, 0x5d, 0x2e, 0xc7, 0x75, 0x63, 0x93, 0x23, 0x7b, 0x4b, 0xc4, 0x3c, 0x47, 0x0d, 0xd9, + 0x6f, 0xbc, 0x93, 0xfd, 0xde, 0x0d, 0xe9, 0x86, 0x6a, 0x96, 0xb1, 0xee, 0x58, 0x07, 0x34, 0xee, + 0x4e, 0x29, 0xa9, 0x86, 0x6a, 0x96, 0x48, 0xf9, 0x47, 0xb2, 0xfd, 0xb9, 0x94, 0x48, 0xa5, 0xb2, + 0xe9, 0x4b, 0x89, 0x54, 0x3a, 0x0b, 0xf2, 0x6b, 0x71, 0xc8, 0xf8, 0xe3, 0x70, 0xb2, 0xad, 0xa9, + 0xd0, 0x25, 0x4b, 0xa2, 0x4e, 0xed, 0xbe, 0xae, 0x51, 0xfb, 0xec, 0x02, 0x59, 0xcb, 0x0a, 0x03, + 0x2c, 0x3a, 0x56, 0x18, 0x25, 0x89, 0x23, 0x88, 0xb1, 0x61, 0x16, 0x8d, 0xa4, 0x14, 0x5e, 0x42, + 0x4b, 0x30, 0xf0, 0x82, 0x4d, 0x79, 0x0f, 0x50, 0xde, 0xf7, 0x77, 0xe7, 0x7d, 0x69, 0x93, 0x32, + 0x4f, 0x5f, 0xda, 0x2c, 0xaf, 0xad, 0x2b, 0xab, 0xf3, 0x2b, 0x0a, 0x27, 0x47, 0xc7, 0x20, 0x51, + 0x57, 0x5f, 0x3a, 0x08, 0xae, 0x7a, 0x14, 0xd4, 0xeb, 0x20, 0x1c, 0x83, 0xc4, 0x35, 0xac, 0xee, + 0x07, 0xd7, 0x1a, 0x0a, 0xba, 0x83, 0x93, 0x61, 0x0e, 0x92, 0x54, 0x5f, 0x08, 0x80, 0x6b, 0x2c, + 0x7b, 0x04, 0xa5, 0x20, 0xb1, 0xb0, 0xae, 0x90, 0x09, 0x91, 0x85, 0x0c, 0x83, 0x96, 0x37, 0x96, + 0x4b, 0x0b, 0xa5, 0x6c, 0x4c, 0x3e, 0x0d, 0x03, 0x4c, 0x09, 0x64, 0xb2, 0xb8, 0x6a, 0xc8, 0x1e, + 0xe1, 0x45, 0xce, 0x43, 0x12, 0xb5, 0xdb, 0xab, 0xc5, 0x92, 0x92, 0x8d, 0x05, 0x87, 0x3a, 0x91, + 0x4d, 0xca, 0x36, 0x64, 0xfc, 0x81, 0xf8, 0x8f, 0x66, 0x93, 0xfd, 0x15, 0x09, 0x86, 0x7c, 0x81, + 0x35, 0x89, 0x88, 0xd4, 0x7a, 0xdd, 0xb8, 0x56, 0x56, 0xeb, 0x9a, 0x6a, 0x73, 0xd3, 0x00, 0x0a, + 0x9a, 0x27, 0x90, 0x5e, 0x87, 0xee, 0x47, 0x34, 0x45, 0x92, 0xd9, 0x01, 0xf9, 0xd3, 0x12, 0x64, + 0xc3, 0x91, 0x6d, 0x48, 0x4c, 0xe9, 0x8d, 0x14, 0x53, 0xfe, 0x94, 0x04, 0x23, 0xc1, 0x70, 0x36, + 0x24, 0xde, 0xbd, 0x6f, 0xa8, 0x78, 0x7f, 0x1c, 0x83, 0xe1, 0x40, 0x10, 0xdb, 0xab, 0x74, 0x2f, + 0xc2, 0x98, 0x56, 0xc5, 0x0d, 0xd3, 0x70, 0xb0, 0x5e, 0x39, 0x28, 0xd7, 0xf1, 0x55, 0x5c, 0xcf, + 0xc9, 0xd4, 0x69, 0xcc, 0x75, 0x0f, 0x93, 0x67, 0x97, 0x3d, 0xba, 0x15, 0x42, 0x56, 0x18, 0x5f, + 0x5e, 0x2c, 0xad, 0x6e, 0xac, 0x6f, 0x95, 0xd6, 0x16, 0xde, 0x56, 0xde, 0x5e, 0xbb, 0xbc, 0xb6, + 0xfe, 0xfc, 0x9a, 0x92, 0xd5, 0x42, 0x68, 0x77, 0x70, 0xda, 0x6f, 0x40, 0x36, 0x2c, 0x14, 0xba, + 0x0b, 0xda, 0x89, 0x95, 0x3d, 0x82, 0xc6, 0x61, 0x74, 0x6d, 0xbd, 0xbc, 0xb9, 0xbc, 0x58, 0x2a, + 0x97, 0x2e, 0x5c, 0x28, 0x2d, 0x6c, 0x6d, 0xb2, 0xc4, 0x87, 0x8b, 0xbd, 0x15, 0x98, 0xe0, 0xf2, + 0xab, 0x71, 0x18, 0x6f, 0x23, 0x09, 0x9a, 0xe7, 0x5b, 0x16, 0xb6, 0x8b, 0x7a, 0xac, 0x17, 0xe9, + 0x67, 0x49, 0xcc, 0xb0, 0xa1, 0x5a, 0x0e, 0xdf, 0xe1, 0x3c, 0x0c, 0x44, 0x4b, 0xba, 0xa3, 0xed, + 0x6a, 0xd8, 0xe2, 0x79, 0x22, 0xb6, 0x8f, 0x19, 0xf5, 0xe0, 0x2c, 0x55, 0xf4, 0x28, 0x20, 0xd3, + 0xb0, 0x35, 0x47, 0xbb, 0x8a, 0xcb, 0x9a, 0x2e, 0x92, 0x4a, 0x64, 0x5f, 0x93, 0x50, 0xb2, 0xa2, + 0x66, 0x59, 0x77, 0x5c, 0x6c, 0x1d, 0xd7, 0xd4, 0x10, 0x36, 0x71, 0xe6, 0x71, 0x25, 0x2b, 0x6a, + 0x5c, 0xec, 0x7b, 0x21, 0x53, 0x35, 0x9a, 0x24, 0xd8, 0x63, 0x78, 0x64, 0xed, 0x90, 0x94, 0x21, + 0x06, 0x73, 0x51, 0x78, 0x18, 0xef, 0x65, 0xb3, 0x32, 0xca, 0x10, 0x83, 0x31, 0x94, 0x87, 0x60, + 0x54, 0xad, 0xd5, 0x2c, 0xc2, 0x5c, 0x30, 0x62, 0x1b, 0x93, 0x11, 0x17, 0x4c, 0x11, 0xf3, 0x97, + 0x20, 0x25, 0xf4, 0x40, 0x96, 0x6a, 0xa2, 0x89, 0xb2, 0xc9, 0x76, 0xdb, 0xb1, 0x13, 0x69, 0x25, + 0xa5, 0x8b, 0xca, 0x7b, 0x21, 0xa3, 0xd9, 0x65, 0x2f, 0x39, 0x1f, 0x9b, 0x89, 0x9d, 0x48, 0x29, + 0x43, 0x9a, 0xed, 0x26, 0x36, 0xe5, 0xcf, 0xc7, 0x60, 0x24, 0x78, 0xb8, 0x80, 0x16, 0x21, 0x55, + 0x37, 0x2a, 0x2a, 0x35, 0x2d, 0x76, 0xb2, 0x75, 0x22, 0xe2, 0x3c, 0x62, 0x76, 0x85, 0xe3, 0x2b, + 0x2e, 0x65, 0xfe, 0x77, 0x25, 0x48, 0x09, 0x30, 0x9a, 0x84, 0x84, 0xa9, 0x3a, 0x7b, 0x94, 0x5d, + 0xb2, 0x18, 0xcb, 0x4a, 0x0a, 0x2d, 0x13, 0xb8, 0x6d, 0xaa, 0x3a, 0x35, 0x01, 0x0e, 0x27, 0x65, + 0x32, 0xae, 0x75, 0xac, 0x56, 0xe9, 0xae, 0xc7, 0x68, 0x34, 0xb0, 0xee, 0xd8, 0x62, 0x5c, 0x39, + 0x7c, 0x81, 0x83, 0xd1, 0x23, 0x30, 0xe6, 0x58, 0xaa, 0x56, 0x0f, 0xe0, 0x26, 0x28, 0x6e, 0x56, + 0x54, 0xb8, 0xc8, 0x05, 0x38, 0x26, 0xf8, 0x56, 0xb1, 0xa3, 0x56, 0xf6, 0x70, 0xd5, 0x23, 0x1a, + 0xa0, 0xd9, 0x8d, 0xbb, 0x38, 0xc2, 0x22, 0xaf, 0x17, 0xb4, 0xf2, 0x37, 0x25, 0x18, 0x13, 0xfb, + 0xb4, 0xaa, 0xab, 0xac, 0x55, 0x00, 0x55, 0xd7, 0x0d, 0xc7, 0xaf, 0xae, 0x56, 0x53, 0x6e, 0xa1, + 0x9b, 0x9d, 0x77, 0x89, 0x14, 0x1f, 0x83, 0x7c, 0x03, 0xc0, 0xab, 0xe9, 0xa8, 0xb6, 0x69, 0x18, + 0xe2, 0x27, 0x47, 0xf4, 0xf8, 0x91, 0xed, 0xec, 0x81, 0x81, 0xc8, 0x86, 0x0e, 0x4d, 0x40, 0x72, + 0x07, 0xd7, 0x34, 0x9d, 0xe7, 0x83, 0x59, 0x41, 0xe4, 0x5f, 0x12, 0x6e, 0xfe, 0xa5, 0xf8, 0x61, + 0x09, 0xc6, 0x2b, 0x46, 0x23, 0x2c, 0x6f, 0x31, 0x1b, 0x4a, 0x2f, 0xd8, 0x17, 0xa5, 0xb7, 0x3f, + 0x53, 0xd3, 0x9c, 0xbd, 0xe6, 0xce, 0x6c, 0xc5, 0x68, 0xcc, 0xd5, 0x8c, 0xba, 0xaa, 0xd7, 0xbc, + 0xf3, 0x53, 0xfa, 0xa3, 0xf2, 0x58, 0x0d, 0xeb, 0x8f, 0xd5, 0x0c, 0xdf, 0x69, 0xea, 0x79, 0xef, + 0xe7, 0x5f, 0x48, 0xd2, 0xcf, 0xc7, 0xe2, 0x4b, 0x1b, 0xc5, 0x2f, 0xc4, 0xf2, 0x4b, 0xac, 0xb9, + 0x0d, 0xa1, 0x1e, 0x05, 0xef, 0xd6, 0x71, 0x85, 0x74, 0x19, 0xbe, 0xf3, 0x08, 0x4c, 0xd4, 0x8c, + 0x9a, 0x41, 0x39, 0xce, 0x91, 0x5f, 0xfc, 0x44, 0x36, 0xed, 0x42, 0xf3, 0x91, 0xc7, 0xb7, 0x85, + 0x35, 0x18, 0xe7, 0xc8, 0x65, 0x7a, 0x24, 0xc4, 0x36, 0x36, 0xa8, 0x6b, 0x5a, 0x2d, 0xf7, 0x6b, + 0xdf, 0xa6, 0x0b, 0xba, 0x32, 0xc6, 0x49, 0x49, 0x1d, 0xdb, 0xfb, 0x14, 0x14, 0x38, 0x1a, 0xe0, + 0xc7, 0xa6, 0x2d, 0xb6, 0x22, 0x38, 0xfe, 0x36, 0xe7, 0x38, 0xee, 0xe3, 0xb8, 0xc9, 0x49, 0x0b, + 0x0b, 0x30, 0xdc, 0x0f, 0xaf, 0x7f, 0xc1, 0x79, 0x65, 0xb0, 0x9f, 0xc9, 0x12, 0x8c, 0x52, 0x26, + 0x95, 0xa6, 0xed, 0x18, 0x0d, 0xea, 0x13, 0xbb, 0xb3, 0xf9, 0x9d, 0x6f, 0xb3, 0x79, 0x34, 0x42, + 0xc8, 0x16, 0x5c, 0xaa, 0x42, 0x01, 0xe8, 0x29, 0x58, 0x15, 0x57, 0xea, 0x11, 0x1c, 0xbe, 0xca, + 0x05, 0x71, 0xf1, 0x0b, 0x57, 0x60, 0x82, 0xfc, 0xa6, 0x2e, 0xcb, 0x2f, 0x49, 0x74, 0x0e, 0x2e, + 0xf7, 0xcd, 0xf7, 0xb1, 0xa9, 0x3a, 0xee, 0x32, 0xf0, 0xc9, 0xe4, 0x1b, 0xc5, 0x1a, 0x76, 0x1c, + 0x6c, 0xd9, 0x65, 0xb5, 0xde, 0x4e, 0x3c, 0x5f, 0x12, 0x23, 0xf7, 0x89, 0xef, 0x06, 0x47, 0x71, + 0x89, 0x51, 0xce, 0xd7, 0xeb, 0x85, 0x6d, 0xb8, 0xab, 0x8d, 0x55, 0xf4, 0xc0, 0xf3, 0x55, 0xce, + 0x73, 0xa2, 0xc5, 0x32, 0x08, 0xdb, 0x0d, 0x10, 0x70, 0x77, 0x2c, 0x7b, 0xe0, 0xf9, 0x49, 0xce, + 0x13, 0x71, 0x5a, 0x31, 0xa4, 0x84, 0xe3, 0x25, 0x18, 0xbb, 0x8a, 0xad, 0x1d, 0xc3, 0xe6, 0x89, + 0xa3, 0x1e, 0xd8, 0x7d, 0x8a, 0xb3, 0x1b, 0xe5, 0x84, 0x34, 0x93, 0x44, 0x78, 0x9d, 0x83, 0xd4, + 0xae, 0x5a, 0xc1, 0x3d, 0xb0, 0xb8, 0xc1, 0x59, 0x0c, 0x12, 0x7c, 0x42, 0x3a, 0x0f, 0x99, 0x9a, + 0xc1, 0x57, 0xad, 0x68, 0xf2, 0x4f, 0x73, 0xf2, 0x21, 0x41, 0xc3, 0x59, 0x98, 0x86, 0xd9, 0xac, + 0x93, 0x25, 0x2d, 0x9a, 0xc5, 0xdf, 0x12, 0x2c, 0x04, 0x0d, 0x67, 0xd1, 0x87, 0x5a, 0x3f, 0x23, + 0x58, 0xd8, 0x3e, 0x7d, 0x3e, 0x0b, 0x43, 0x86, 0x5e, 0x3f, 0x30, 0xf4, 0x5e, 0x84, 0xf8, 0x2c, + 0xe7, 0x00, 0x9c, 0x84, 0x30, 0x38, 0x0f, 0xe9, 0x5e, 0x07, 0xe2, 0x6f, 0x7f, 0x57, 0x4c, 0x0f, + 0x31, 0x02, 0x4b, 0x30, 0x2a, 0x1c, 0x94, 0x66, 0xe8, 0x3d, 0xb0, 0xf8, 0x3b, 0x9c, 0xc5, 0x88, + 0x8f, 0x8c, 0x77, 0xc3, 0xc1, 0xb6, 0x53, 0xc3, 0xbd, 0x30, 0xf9, 0xbc, 0xe8, 0x06, 0x27, 0xe1, + 0xaa, 0xdc, 0xc1, 0x7a, 0x65, 0xaf, 0x37, 0x0e, 0xbf, 0x28, 0x54, 0x29, 0x68, 0x08, 0x8b, 0x05, + 0x18, 0x6e, 0xa8, 0x96, 0xbd, 0xa7, 0xd6, 0x7b, 0x1a, 0x8e, 0xbf, 0xcb, 0x79, 0x64, 0x5c, 0x22, + 0xae, 0x91, 0xa6, 0xde, 0x0f, 0x9b, 0x2f, 0x08, 0x8d, 0xf8, 0xc8, 0xf8, 0xd4, 0xb3, 0x1d, 0x9a, + 0x65, 0xeb, 0x87, 0xdb, 0x2f, 0x89, 0xa9, 0xc7, 0x68, 0x57, 0xfd, 0x1c, 0xcf, 0x43, 0xda, 0xd6, + 0x5e, 0xea, 0x89, 0xcd, 0x2f, 0x8b, 0x91, 0xa6, 0x04, 0x84, 0xf8, 0x6d, 0x70, 0xac, 0xed, 0x32, + 0xd1, 0x03, 0xb3, 0xbf, 0xc7, 0x99, 0x4d, 0xb6, 0x59, 0x2a, 0xb8, 0x4b, 0xe8, 0x97, 0xe5, 0xdf, + 0x17, 0x2e, 0x01, 0x87, 0x78, 0x6d, 0x90, 0x7d, 0x84, 0xad, 0xee, 0xf6, 0xa7, 0xb5, 0x5f, 0x11, + 0x5a, 0x63, 0xb4, 0x01, 0xad, 0x6d, 0xc1, 0x24, 0xe7, 0xd8, 0xdf, 0xb8, 0xfe, 0xaa, 0x70, 0xac, + 0x8c, 0x7a, 0x3b, 0x38, 0xba, 0xef, 0x80, 0xbc, 0xab, 0x4e, 0x11, 0xb0, 0xda, 0xe5, 0x86, 0x6a, + 0xf6, 0xc0, 0xf9, 0xd7, 0x38, 0x67, 0xe1, 0xf1, 0xdd, 0x88, 0xd7, 0x5e, 0x55, 0x4d, 0xc2, 0xfc, + 0xad, 0x90, 0x13, 0xcc, 0x9b, 0xba, 0x85, 0x2b, 0x46, 0x4d, 0xd7, 0x5e, 0xc2, 0xd5, 0x1e, 0x58, + 0xff, 0x7a, 0x68, 0xa8, 0xb6, 0x7d, 0xe4, 0x84, 0xf3, 0x32, 0x64, 0xdd, 0x58, 0xa5, 0xac, 0x35, + 0x4c, 0xc3, 0x72, 0x22, 0x38, 0x7e, 0x51, 0x8c, 0x94, 0x4b, 0xb7, 0x4c, 0xc9, 0x0a, 0x25, 0x18, + 0xa1, 0xc5, 0x5e, 0x4d, 0xf2, 0x4b, 0x9c, 0xd1, 0xb0, 0x47, 0xc5, 0x1d, 0x47, 0xc5, 0x68, 0x98, + 0xaa, 0xd5, 0x8b, 0xff, 0xfb, 0x07, 0xc2, 0x71, 0x70, 0x12, 0xee, 0x38, 0x9c, 0x03, 0x13, 0x93, + 0xd5, 0xbe, 0x07, 0x0e, 0x5f, 0x16, 0x8e, 0x43, 0xd0, 0x70, 0x16, 0x22, 0x60, 0xe8, 0x81, 0xc5, + 0x3f, 0x14, 0x2c, 0x04, 0x0d, 0x61, 0xf1, 0x9c, 0xb7, 0xd0, 0x5a, 0xb8, 0xa6, 0xd9, 0x8e, 0xc5, + 0xc2, 0xe4, 0xee, 0xac, 0xfe, 0xd1, 0x77, 0x83, 0x41, 0x98, 0xe2, 0x23, 0x25, 0x9e, 0x88, 0xa7, + 0x5d, 0xe9, 0x2e, 0x2a, 0x5a, 0xb0, 0xdf, 0x10, 0x9e, 0xc8, 0x47, 0x46, 0x64, 0xf3, 0x45, 0x88, + 0x44, 0xed, 0x15, 0xb2, 0x77, 0xe8, 0x81, 0xdd, 0x3f, 0x0e, 0x09, 0xb7, 0x29, 0x68, 0x09, 0x4f, + 0x5f, 0xfc, 0xd3, 0xd4, 0xf7, 0xf1, 0x41, 0x4f, 0xd6, 0xf9, 0x4f, 0x42, 0xf1, 0xcf, 0x36, 0xa3, + 0x64, 0x3e, 0x64, 0x34, 0x14, 0x4f, 0xa1, 0xa8, 0xfb, 0x43, 0xb9, 0x9f, 0xfc, 0x3e, 0xef, 0x6f, + 0x30, 0x9c, 0x2a, 0xac, 0x10, 0x23, 0x0f, 0x06, 0x3d, 0xd1, 0xcc, 0xde, 0xf7, 0x7d, 0xd7, 0xce, + 0x03, 0x31, 0x4f, 0xe1, 0x02, 0x0c, 0x07, 0x02, 0x9e, 0x68, 0x56, 0xef, 0xe7, 0xac, 0x32, 0xfe, + 0x78, 0xa7, 0x70, 0x1a, 0x12, 0x24, 0x78, 0x89, 0x26, 0xff, 0xff, 0x39, 0x39, 0x45, 0x2f, 0xbc, + 0x19, 0x52, 0x22, 0x68, 0x89, 0x26, 0xfd, 0x00, 0x27, 0x75, 0x49, 0x08, 0xb9, 0x08, 0x58, 0xa2, + 0xc9, 0xff, 0x9a, 0x20, 0x17, 0x24, 0x84, 0xbc, 0x77, 0x15, 0x7e, 0xe5, 0xa7, 0x12, 0x7c, 0xd1, + 0x11, 0xba, 0x3b, 0x0f, 0x83, 0x3c, 0x52, 0x89, 0xa6, 0xfe, 0x10, 0x6f, 0x5c, 0x50, 0x14, 0x9e, + 0x86, 0x64, 0x8f, 0x0a, 0xff, 0x69, 0x4e, 0xca, 0xf0, 0x0b, 0x0b, 0x30, 0xe4, 0x8b, 0x4e, 0xa2, + 0xc9, 0xff, 0x06, 0x27, 0xf7, 0x53, 0x11, 0xd1, 0x79, 0x74, 0x12, 0xcd, 0xe0, 0xc3, 0x42, 0x74, + 0x4e, 0x41, 0xd4, 0x26, 0x02, 0x93, 0x68, 0xea, 0x8f, 0x08, 0xad, 0x0b, 0x92, 0xc2, 0xb3, 0x90, + 0x76, 0x17, 0x9b, 0x68, 0xfa, 0x8f, 0x72, 0x7a, 0x8f, 0x86, 0x68, 0xc0, 0xb7, 0xd8, 0x45, 0xb3, + 0xf8, 0x19, 0xa1, 0x01, 0x1f, 0x15, 0x99, 0x46, 0xe1, 0x00, 0x26, 0x9a, 0xd3, 0xc7, 0xc4, 0x34, + 0x0a, 0xc5, 0x2f, 0x64, 0x34, 0xa9, 0xcf, 0x8f, 0x66, 0xf1, 0xb3, 0x62, 0x34, 0x29, 0x3e, 0x11, + 0x23, 0x1c, 0x11, 0x44, 0xf3, 0xf8, 0x9b, 0x42, 0x8c, 0x50, 0x40, 0x50, 0xd8, 0x00, 0xd4, 0x1a, + 0x0d, 0x44, 0xf3, 0xfb, 0x38, 0xe7, 0x37, 0xd6, 0x12, 0x0c, 0x14, 0x9e, 0x87, 0xc9, 0xf6, 0x91, + 0x40, 0x34, 0xd7, 0x4f, 0x7c, 0x3f, 0xb4, 0x77, 0xf3, 0x07, 0x02, 0x85, 0x2d, 0x6f, 0x49, 0xf1, + 0x47, 0x01, 0xd1, 0x6c, 0x5f, 0xfd, 0x7e, 0xd0, 0x71, 0xfb, 0x83, 0x80, 0xc2, 0x3c, 0x80, 0xb7, + 0x00, 0x47, 0xf3, 0xfa, 0x14, 0xe7, 0xe5, 0x23, 0x22, 0x53, 0x83, 0xaf, 0xbf, 0xd1, 0xf4, 0x37, + 0xc4, 0xd4, 0xe0, 0x14, 0x64, 0x6a, 0x88, 0xa5, 0x37, 0x9a, 0xfa, 0xd3, 0x62, 0x6a, 0x08, 0x12, + 0x62, 0xd9, 0xbe, 0xd5, 0x2d, 0x9a, 0xc3, 0x67, 0x85, 0x65, 0xfb, 0xa8, 0x0a, 0x6b, 0x30, 0xd6, + 0xb2, 0x20, 0x46, 0xb3, 0xfa, 0x79, 0xce, 0x2a, 0x1b, 0x5e, 0x0f, 0xfd, 0x8b, 0x17, 0x5f, 0x0c, + 0xa3, 0xb9, 0x7d, 0x2e, 0xb4, 0x78, 0xf1, 0xb5, 0xb0, 0x70, 0x1e, 0x52, 0x7a, 0xb3, 0x5e, 0x27, + 0x93, 0x07, 0x75, 0xbf, 0xf3, 0x97, 0xfb, 0x4f, 0x3f, 0xe0, 0xda, 0x11, 0x04, 0x85, 0xd3, 0x90, + 0xc4, 0x8d, 0x1d, 0x5c, 0x8d, 0xa2, 0xfc, 0xce, 0x0f, 0x84, 0xc3, 0x24, 0xd8, 0x85, 0x67, 0x01, + 0x58, 0x6a, 0x84, 0x1e, 0x0f, 0x46, 0xd0, 0xfe, 0xe7, 0x1f, 0xf0, 0xdb, 0x38, 0x1e, 0x89, 0xc7, + 0x80, 0xdd, 0xed, 0xe9, 0xce, 0xe0, 0xbb, 0x41, 0x06, 0x74, 0x44, 0xce, 0xc1, 0xe0, 0x0b, 0xb6, + 0xa1, 0x3b, 0x6a, 0x2d, 0x8a, 0xfa, 0xbf, 0x70, 0x6a, 0x81, 0x4f, 0x14, 0xd6, 0x30, 0x2c, 0xec, + 0xa8, 0x35, 0x3b, 0x8a, 0xf6, 0xbf, 0x72, 0x5a, 0x97, 0x80, 0x10, 0x57, 0x54, 0xdb, 0xe9, 0xa5, + 0xdf, 0x7f, 0x2a, 0x88, 0x05, 0x01, 0x11, 0x9a, 0xfc, 0xde, 0xc7, 0x07, 0x51, 0xb4, 0xdf, 0x13, + 0x42, 0x73, 0xfc, 0xc2, 0x9b, 0x21, 0x4d, 0x7e, 0xb2, 0x2b, 0x76, 0x11, 0xc4, 0x7f, 0xc6, 0x89, + 0x3d, 0x0a, 0xd2, 0xb2, 0xed, 0x54, 0x1d, 0x2d, 0x5a, 0xd9, 0xb7, 0xf8, 0x48, 0x0b, 0xfc, 0xc2, + 0x3c, 0x0c, 0xd9, 0x4e, 0xb5, 0xda, 0xe4, 0xf1, 0x69, 0x04, 0xf9, 0x7f, 0xfb, 0x81, 0x9b, 0xb2, + 0x70, 0x69, 0xc8, 0x68, 0x5f, 0xdb, 0x77, 0x4c, 0x83, 0x1e, 0x81, 0x44, 0x71, 0xf8, 0x3e, 0xe7, + 0xe0, 0x23, 0x29, 0x2c, 0x40, 0x86, 0xf4, 0xc5, 0xc2, 0x26, 0xa6, 0xe7, 0x55, 0x11, 0x2c, 0xfe, + 0x9c, 0x2b, 0x20, 0x40, 0x54, 0xfc, 0x89, 0xaf, 0xbe, 0x36, 0x25, 0x7d, 0xe3, 0xb5, 0x29, 0xe9, + 0x8f, 0x5f, 0x9b, 0x92, 0x3e, 0xf2, 0xad, 0xa9, 0x23, 0xdf, 0xf8, 0xd6, 0xd4, 0x91, 0xdf, 0xff, + 0xd6, 0xd4, 0x91, 0xf6, 0x69, 0x63, 0x58, 0x32, 0x96, 0x0c, 0x96, 0x30, 0x7e, 0xbb, 0x1c, 0x48, + 0x17, 0xd7, 0x0c, 0x2f, 0x5b, 0xeb, 0x6e, 0x72, 0xe0, 0xbd, 0x71, 0x38, 0x56, 0x31, 0xec, 0x86, + 0x61, 0x97, 0x59, 0xbe, 0x97, 0x15, 0x78, 0xc6, 0x37, 0xe3, 0xaf, 0xea, 0x21, 0xe9, 0x7b, 0x11, + 0x46, 0x68, 0xd7, 0x69, 0xba, 0x8b, 0x5a, 0x5b, 0xa4, 0x83, 0xf8, 0xda, 0xbf, 0x4e, 0xd2, 0x5e, + 0x0f, 0xbb, 0x84, 0xf4, 0x3c, 0x7f, 0x0b, 0x26, 0xb4, 0x86, 0x59, 0xc7, 0x34, 0xf1, 0x5f, 0x76, + 0xeb, 0xa2, 0xf9, 0x7d, 0x9d, 0xf3, 0x1b, 0xf7, 0xc8, 0x97, 0x05, 0x75, 0x61, 0x05, 0xc6, 0xd4, + 0x4a, 0x05, 0x9b, 0x01, 0x96, 0x11, 0xc3, 0x22, 0x04, 0xcc, 0x72, 0x4a, 0x97, 0x5b, 0xf1, 0xd9, + 0x4e, 0x43, 0xf3, 0xf6, 0x07, 0x7c, 0x9a, 0xb7, 0x70, 0x0d, 0xeb, 0x8f, 0xe9, 0xd8, 0xb9, 0x66, + 0x58, 0xfb, 0x5c, 0xbd, 0x8f, 0xb1, 0xa6, 0x06, 0xe8, 0x9f, 0x27, 0xe1, 0x23, 0x31, 0x98, 0x0e, + 0xeb, 0x96, 0x58, 0xb1, 0xed, 0xa8, 0x0d, 0xb3, 0xd3, 0x73, 0xa8, 0xf3, 0x90, 0xde, 0x12, 0x38, + 0x28, 0x07, 0x83, 0x36, 0xae, 0x18, 0x7a, 0xd5, 0xa6, 0x67, 0xcd, 0x71, 0x45, 0x14, 0xd1, 0x04, + 0x24, 0x75, 0x55, 0x37, 0x6c, 0x7e, 0x5b, 0x93, 0x15, 0x8a, 0x3f, 0x27, 0xf5, 0x67, 0x56, 0x23, + 0x6e, 0x53, 0xd4, 0xb6, 0x36, 0xa4, 0xb7, 0x3f, 0xd2, 0xed, 0x2c, 0x82, 0x0c, 0xbd, 0xed, 0x75, + 0xc1, 0x77, 0xf0, 0x30, 0x15, 0x3e, 0x78, 0x78, 0x1e, 0xd7, 0xeb, 0x97, 0x75, 0xe3, 0x9a, 0x4e, + 0x86, 0xdd, 0x76, 0x55, 0xf2, 0x85, 0x04, 0xdc, 0x43, 0xaf, 0xa1, 0x5b, 0x0d, 0x4d, 0x77, 0xe6, + 0x2a, 0xd6, 0x81, 0xe9, 0x50, 0x03, 0x36, 0x76, 0xb9, 0x42, 0xc6, 0xbc, 0xea, 0x59, 0x56, 0x9d, + 0x6f, 0x7b, 0x6c, 0x21, 0xef, 0x42, 0x72, 0x83, 0xd0, 0x11, 0x55, 0x38, 0x86, 0xa3, 0xd6, 0xb9, + 0x8a, 0x58, 0x81, 0x40, 0xd9, 0xd5, 0xf5, 0x18, 0x83, 0x6a, 0xe2, 0xd6, 0x7a, 0x1d, 0xab, 0xbb, + 0xec, 0xaa, 0x60, 0x9c, 0x9e, 0x14, 0xa6, 0x08, 0x80, 0xde, 0x0a, 0x9c, 0x80, 0xa4, 0xda, 0x64, + 0x87, 0x5c, 0xf1, 0x13, 0x19, 0x85, 0x15, 0xe4, 0xcb, 0x30, 0xc8, 0x13, 0xeb, 0x28, 0x0b, 0xf1, + 0x7d, 0x7c, 0x40, 0xdb, 0xc9, 0x28, 0xe4, 0x27, 0x9a, 0x85, 0x24, 0x15, 0x9e, 0xdf, 0x81, 0xce, + 0xcd, 0xb6, 0x48, 0x3f, 0x4b, 0x85, 0x54, 0x18, 0x9a, 0x7c, 0x09, 0x52, 0x8b, 0x46, 0x43, 0xd3, + 0x8d, 0x20, 0xb7, 0x34, 0xe3, 0x46, 0x65, 0x36, 0x9b, 0x0e, 0x3f, 0x77, 0x62, 0x05, 0x34, 0x09, + 0x03, 0xec, 0xea, 0x28, 0x3f, 0xa8, 0xe3, 0x25, 0x79, 0x01, 0x06, 0x29, 0xef, 0x75, 0x13, 0x21, + 0xfe, 0x96, 0x80, 0xdf, 0x51, 0xa5, 0x53, 0x94, 0xb3, 0x8f, 0x79, 0xc2, 0x22, 0x48, 0x54, 0x55, + 0x47, 0xe5, 0xfd, 0xa6, 0xbf, 0xe5, 0x67, 0x20, 0xc5, 0x99, 0xd8, 0xe8, 0x14, 0xc4, 0x0d, 0xd3, + 0xe6, 0x47, 0x6d, 0xf9, 0x4e, 0x5d, 0x59, 0x37, 0x8b, 0x89, 0xaf, 0xde, 0x9c, 0x3e, 0xa2, 0x10, + 0xe4, 0xa2, 0xd2, 0x71, 0xb2, 0x9c, 0xf5, 0x59, 0x92, 0x6f, 0xc8, 0x7d, 0x3f, 0xd9, 0x90, 0xb6, + 0x98, 0x83, 0x6b, 0x2c, 0x9f, 0x8d, 0xc1, 0x94, 0xaf, 0xf6, 0x2a, 0xb6, 0x48, 0x74, 0x39, 0x47, + 0xad, 0x90, 0x5b, 0x0b, 0xf2, 0x09, 0xc9, 0xeb, 0x3b, 0x98, 0xcb, 0x9b, 0x21, 0x3e, 0x6f, 0x9a, + 0x28, 0x0f, 0x29, 0x76, 0xa4, 0x66, 0x30, 0x7b, 0x49, 0x28, 0x6e, 0x99, 0xd4, 0xd9, 0xc6, 0xae, + 0x73, 0x4d, 0xb5, 0xdc, 0x47, 0x13, 0xa2, 0x2c, 0x9f, 0x83, 0xf4, 0x82, 0xa1, 0xdb, 0x58, 0xb7, + 0x9b, 0x74, 0xf2, 0xed, 0xd4, 0x8d, 0xca, 0x3e, 0xe7, 0xc0, 0x0a, 0x44, 0xe1, 0xaa, 0x69, 0x52, + 0xca, 0x84, 0x42, 0x7e, 0x16, 0x12, 0xaf, 0x7f, 0x66, 0x5a, 0x2a, 0x6e, 0x76, 0x54, 0xd1, 0xb9, + 0xfe, 0x55, 0xc4, 0x3b, 0xe9, 0xea, 0xe8, 0x0f, 0x25, 0x38, 0xde, 0x3a, 0xa1, 0xf6, 0xf1, 0x81, + 0xdd, 0xef, 0x7c, 0x3a, 0x0b, 0xe9, 0x0d, 0xfa, 0x72, 0xf1, 0x32, 0x3e, 0x40, 0x79, 0x18, 0xc4, + 0xd5, 0x53, 0xa7, 0x4f, 0x3f, 0x71, 0x8e, 0x59, 0xfb, 0xc5, 0x23, 0x8a, 0x00, 0x14, 0x52, 0xa4, + 0x57, 0xaf, 0x7f, 0x76, 0x5a, 0x2a, 0x26, 0x21, 0x6e, 0x37, 0x1b, 0x77, 0xd4, 0x06, 0x5e, 0x4d, + 0xc2, 0x8c, 0x9f, 0x92, 0x7a, 0xa0, 0xab, 0x6a, 0x5d, 0xab, 0xaa, 0xde, 0x9b, 0xd2, 0xac, 0xaf, + 0x8f, 0x14, 0xa3, 0x7d, 0x17, 0xf3, 0x5d, 0x35, 0x25, 0xff, 0xba, 0x04, 0x99, 0x2b, 0x82, 0xf3, + 0x26, 0x76, 0xd0, 0x79, 0x00, 0xb7, 0x25, 0x31, 0x2d, 0xee, 0x9e, 0x0d, 0xb7, 0x35, 0xeb, 0xd2, + 0x28, 0x3e, 0x74, 0xf4, 0x34, 0x35, 0x34, 0xd3, 0xb0, 0xf9, 0x8d, 0xfa, 0x08, 0x52, 0x17, 0x19, + 0x3d, 0x0a, 0x88, 0x7a, 0xb0, 0xf2, 0x55, 0xc3, 0xd1, 0xf4, 0x5a, 0xd9, 0x34, 0xae, 0xf1, 0xe7, + 0x47, 0x71, 0x25, 0x4b, 0x6b, 0xae, 0xd0, 0x8a, 0x0d, 0x02, 0x27, 0x42, 0xa7, 0x5d, 0x2e, 0x64, + 0xbd, 0x50, 0xab, 0x55, 0x0b, 0xdb, 0x36, 0x77, 0x52, 0xa2, 0x88, 0xce, 0xc3, 0xa0, 0xd9, 0xdc, + 0x29, 0x0b, 0x8f, 0x30, 0x74, 0xea, 0x78, 0xbb, 0xf9, 0x2d, 0xc6, 0x9f, 0xcf, 0xf0, 0x01, 0xb3, + 0xb9, 0x43, 0xac, 0xe1, 0x5e, 0xc8, 0xb4, 0x11, 0x66, 0xe8, 0xaa, 0x27, 0x07, 0x7d, 0x10, 0xcb, + 0x7b, 0x50, 0x36, 0x2d, 0xcd, 0xb0, 0x34, 0xe7, 0x80, 0x9e, 0x87, 0xc7, 0x95, 0xac, 0xa8, 0xd8, + 0xe0, 0x70, 0x79, 0x1f, 0x46, 0x37, 0xe9, 0x3a, 0xee, 0x49, 0x7e, 0xda, 0x93, 0x4f, 0x8a, 0x96, + 0xaf, 0xa3, 0x64, 0xb1, 0x16, 0xc9, 0x8a, 0xcf, 0x75, 0xb4, 0xce, 0xa7, 0xfb, 0xb7, 0x4e, 0x27, + 0xb0, 0x9a, 0xfd, 0xe9, 0xb1, 0xc0, 0xe4, 0xe3, 0xcb, 0xa3, 0xcf, 0x3d, 0xf5, 0x6a, 0x98, 0x51, + 0x61, 0x42, 0xbe, 0xfb, 0xa2, 0x99, 0x8f, 0x70, 0x93, 0xf9, 0xc8, 0x29, 0x24, 0x9f, 0x83, 0xe1, + 0x0d, 0xd5, 0x72, 0x36, 0xb1, 0x73, 0x11, 0xab, 0x55, 0x6c, 0x05, 0x57, 0xd5, 0x61, 0xb1, 0xaa, + 0x22, 0x48, 0xd0, 0xa5, 0x93, 0xad, 0x2a, 0xf4, 0xb7, 0xbc, 0x07, 0x09, 0x7a, 0x27, 0xc6, 0x5d, + 0x71, 0x39, 0x05, 0x5b, 0x71, 0x89, 0xaf, 0x3c, 0x70, 0xb0, 0xcd, 0x49, 0x58, 0x01, 0x3d, 0x25, + 0xd6, 0xcd, 0x78, 0xf7, 0x75, 0x93, 0x1b, 0x22, 0x5f, 0x3d, 0xeb, 0x30, 0x58, 0x24, 0xae, 0x76, + 0x79, 0xd1, 0x15, 0x44, 0xf2, 0x04, 0x41, 0xab, 0x30, 0x6a, 0xaa, 0x96, 0x43, 0x2f, 0x03, 0xef, + 0xd1, 0x5e, 0x70, 0x5b, 0x9f, 0x6e, 0x9d, 0x79, 0x81, 0xce, 0xf2, 0x56, 0x86, 0x4d, 0x3f, 0x50, + 0xfe, 0x93, 0x04, 0x0c, 0x70, 0x65, 0xbc, 0x19, 0x06, 0xb9, 0x5a, 0xb9, 0x75, 0xde, 0x33, 0xdb, + 0xba, 0xf0, 0xcc, 0xba, 0x0b, 0x04, 0xe7, 0x27, 0x68, 0xd0, 0x83, 0x90, 0xaa, 0xec, 0xa9, 0x9a, + 0x5e, 0xd6, 0xd8, 0xad, 0xd8, 0x74, 0x71, 0xe8, 0xb5, 0x9b, 0xd3, 0x83, 0x0b, 0x04, 0xb6, 0xbc, + 0xa8, 0x0c, 0xd2, 0xca, 0xe5, 0x2a, 0x59, 0xe9, 0xf7, 0xb0, 0x56, 0xdb, 0x73, 0xf8, 0x0c, 0xe3, + 0x25, 0x74, 0x16, 0x12, 0xc4, 0x20, 0xf8, 0x5b, 0x91, 0x7c, 0x4b, 0x60, 0xeb, 0x46, 0x71, 0xc5, + 0x14, 0x69, 0xf8, 0x23, 0x7f, 0x34, 0x2d, 0x29, 0x94, 0x02, 0x2d, 0xc0, 0x70, 0x5d, 0xb5, 0x9d, + 0x32, 0x5d, 0xa1, 0x48, 0xf3, 0x49, 0xca, 0xe2, 0x58, 0xab, 0x42, 0xb8, 0x62, 0xb9, 0xe8, 0x43, + 0x84, 0x8a, 0x81, 0xaa, 0xe8, 0x04, 0x64, 0x29, 0x93, 0x8a, 0xd1, 0x68, 0x68, 0x0e, 0x8b, 0x9d, + 0x06, 0xa8, 0xde, 0x47, 0x08, 0x7c, 0x81, 0x82, 0x69, 0x04, 0x75, 0x37, 0xa4, 0xe9, 0xe5, 0x74, + 0x8a, 0xc2, 0x2e, 0x62, 0xa5, 0x08, 0x80, 0x56, 0x3e, 0x04, 0xa3, 0x9e, 0x7f, 0x64, 0x28, 0x29, + 0xc6, 0xc5, 0x03, 0x53, 0xc4, 0xc7, 0x61, 0x42, 0xc7, 0xd7, 0xe9, 0xd5, 0xb0, 0x00, 0x76, 0x9a, + 0x62, 0x23, 0x52, 0x77, 0x25, 0x48, 0xf1, 0x00, 0x8c, 0x54, 0x84, 0xf2, 0x19, 0x2e, 0x50, 0xdc, + 0x61, 0x17, 0x4a, 0xd1, 0x8e, 0x41, 0x4a, 0x35, 0x4d, 0x86, 0x30, 0xc4, 0xfd, 0xa3, 0x69, 0xd2, + 0xaa, 0x93, 0x30, 0x46, 0xfb, 0x68, 0x61, 0xbb, 0x59, 0x77, 0x38, 0x93, 0x0c, 0xc5, 0x19, 0x25, + 0x15, 0x0a, 0x83, 0x53, 0xdc, 0xfb, 0x60, 0x18, 0x5f, 0xd5, 0xaa, 0x58, 0xaf, 0x60, 0x86, 0x37, + 0x4c, 0xf1, 0x32, 0x02, 0x48, 0x91, 0x1e, 0x06, 0xd7, 0xef, 0x95, 0x85, 0x4f, 0x1e, 0x61, 0xfc, + 0x04, 0x7c, 0x9e, 0x81, 0xe5, 0x1c, 0x24, 0x16, 0x55, 0x47, 0x25, 0x01, 0x84, 0x73, 0x9d, 0x2d, + 0x34, 0x19, 0x85, 0xfc, 0x94, 0x5f, 0x8f, 0x41, 0xe2, 0x8a, 0xe1, 0x60, 0xf4, 0xa4, 0x2f, 0xc0, + 0x1b, 0x69, 0x67, 0xcf, 0x9b, 0x5a, 0x4d, 0xc7, 0xd5, 0x55, 0xbb, 0xe6, 0x7b, 0x21, 0xea, 0x99, + 0x53, 0x2c, 0x60, 0x4e, 0x13, 0x90, 0xb4, 0x8c, 0xa6, 0x5e, 0x15, 0x77, 0x98, 0x68, 0x01, 0x95, + 0x20, 0xe5, 0x5a, 0x49, 0x22, 0xca, 0x4a, 0x46, 0x89, 0x95, 0x10, 0x1b, 0xe6, 0x00, 0x65, 0x70, + 0x87, 0x1b, 0x4b, 0x11, 0xd2, 0xae, 0xf3, 0xe2, 0xd6, 0xd6, 0x9b, 0xc1, 0x7a, 0x64, 0x64, 0x31, + 0x71, 0xc7, 0xde, 0x55, 0x1e, 0xb3, 0xb8, 0xac, 0x5b, 0xc1, 0xb5, 0x17, 0x30, 0x2b, 0xfe, 0x5a, + 0x75, 0x90, 0xf6, 0xcb, 0x33, 0x2b, 0xf6, 0x62, 0xf5, 0x38, 0xa4, 0x6d, 0xad, 0xa6, 0xab, 0x4e, + 0xd3, 0xc2, 0xdc, 0xf2, 0x3c, 0x80, 0xfc, 0x15, 0x09, 0x06, 0x98, 0x25, 0xfb, 0xf4, 0x26, 0xb5, + 0xd7, 0x5b, 0xac, 0x93, 0xde, 0xe2, 0x87, 0xd7, 0xdb, 0x3c, 0x80, 0x2b, 0x8c, 0xcd, 0x5f, 0x1b, + 0xb6, 0x89, 0x18, 0x98, 0x88, 0x9b, 0x5a, 0x8d, 0x4f, 0x54, 0x1f, 0x91, 0xfc, 0x87, 0x12, 0x09, + 0x52, 0x79, 0x3d, 0x9a, 0x87, 0x61, 0x21, 0x57, 0x79, 0xb7, 0xae, 0xd6, 0xb8, 0xed, 0xdc, 0xd3, + 0x51, 0xb8, 0x0b, 0x75, 0xb5, 0xa6, 0x0c, 0x71, 0x79, 0x48, 0xa1, 0xfd, 0x38, 0xc4, 0x3a, 0x8c, + 0x43, 0x60, 0xe0, 0xe3, 0x87, 0x1b, 0xf8, 0xc0, 0x10, 0x25, 0xc2, 0x43, 0xf4, 0xc5, 0x18, 0xdd, + 0xac, 0x98, 0x86, 0xad, 0xd6, 0x7f, 0x14, 0x33, 0xe2, 0x6e, 0x48, 0x9b, 0x46, 0xbd, 0xcc, 0x6a, + 0xd8, 0xdd, 0xbe, 0x94, 0x69, 0xd4, 0x95, 0x96, 0x61, 0x4f, 0xde, 0xa6, 0xe9, 0x32, 0x70, 0x1b, + 0xb4, 0x36, 0x18, 0xd6, 0x9a, 0x05, 0x19, 0xa6, 0x0a, 0xbe, 0x96, 0x3d, 0x4e, 0x74, 0x40, 0x17, + 0x47, 0xa9, 0x75, 0xed, 0x65, 0x62, 0x33, 0x4c, 0x85, 0xe3, 0x11, 0x0a, 0xe6, 0xfa, 0xdb, 0xed, + 0x72, 0xfd, 0x66, 0xa9, 0x70, 0x3c, 0xf9, 0xe7, 0x24, 0x80, 0x15, 0xa2, 0x59, 0xda, 0x5f, 0xb2, + 0x0a, 0xd9, 0x54, 0x84, 0x72, 0xa0, 0xe5, 0xa9, 0x4e, 0x83, 0xc6, 0xdb, 0xcf, 0xd8, 0x7e, 0xb9, + 0x17, 0x60, 0xd8, 0x33, 0x46, 0x1b, 0x0b, 0x61, 0xa6, 0xba, 0x44, 0xd5, 0x9b, 0xd8, 0x51, 0x32, + 0x57, 0x7d, 0x25, 0xf9, 0x9f, 0x49, 0x90, 0xa6, 0x32, 0xad, 0x62, 0x47, 0x0d, 0x8c, 0xa1, 0x74, + 0xf8, 0x31, 0xbc, 0x07, 0x80, 0xb1, 0xb1, 0xb5, 0x97, 0x30, 0xb7, 0xac, 0x34, 0x85, 0x6c, 0x6a, + 0x2f, 0x61, 0x74, 0xc6, 0x55, 0x78, 0xbc, 0xbb, 0xc2, 0x45, 0xd4, 0xcd, 0xd5, 0x7e, 0x17, 0x0c, + 0xd2, 0x8f, 0x6e, 0x5c, 0xb7, 0x79, 0x20, 0x3d, 0xa0, 0x37, 0x1b, 0x5b, 0xd7, 0x6d, 0xf9, 0x05, + 0x18, 0xdc, 0xba, 0xce, 0x72, 0x1f, 0x77, 0x43, 0xda, 0x32, 0x0c, 0xbe, 0x26, 0xb3, 0x58, 0x28, + 0x45, 0x00, 0x74, 0x09, 0x12, 0xfb, 0xfd, 0x98, 0xb7, 0xdf, 0xf7, 0x12, 0x16, 0xf1, 0x9e, 0x12, + 0x16, 0x27, 0xff, 0x8d, 0x04, 0x43, 0x3e, 0xff, 0x80, 0x9e, 0x80, 0xa3, 0xc5, 0x95, 0xf5, 0x85, + 0xcb, 0xe5, 0xe5, 0xc5, 0xf2, 0x85, 0x95, 0xf9, 0x25, 0xef, 0xf6, 0x7a, 0x7e, 0xf2, 0x95, 0x1b, + 0x33, 0xc8, 0x87, 0xbb, 0xad, 0xef, 0xeb, 0xc6, 0x35, 0x1d, 0xcd, 0xc1, 0x44, 0x90, 0x64, 0xbe, + 0xb8, 0x59, 0x5a, 0xdb, 0xca, 0x4a, 0xf9, 0xa3, 0xaf, 0xdc, 0x98, 0x19, 0xf3, 0x51, 0xcc, 0xef, + 0xd8, 0x58, 0x77, 0x5a, 0x09, 0x16, 0xd6, 0x57, 0x57, 0x97, 0xb7, 0xb2, 0xb1, 0x16, 0x02, 0xee, + 0xb0, 0x1f, 0x86, 0xb1, 0x20, 0xc1, 0xda, 0xf2, 0x4a, 0x36, 0x9e, 0x47, 0xaf, 0xdc, 0x98, 0x19, + 0xf1, 0x61, 0xaf, 0x69, 0xf5, 0x7c, 0xea, 0x83, 0x9f, 0x9b, 0x3a, 0xf2, 0x8b, 0xbf, 0x30, 0x25, + 0x91, 0x9e, 0x0d, 0x07, 0x7c, 0x04, 0x7a, 0x14, 0xee, 0xda, 0x5c, 0x5e, 0x5a, 0x2b, 0x2d, 0x96, + 0x57, 0x37, 0x97, 0xca, 0xec, 0xd9, 0xbe, 0xdb, 0xbb, 0xd1, 0x57, 0x6e, 0xcc, 0x0c, 0xf1, 0x2e, + 0x75, 0xc2, 0xde, 0x50, 0x4a, 0x57, 0xd6, 0xb7, 0x4a, 0x59, 0x89, 0x61, 0x6f, 0x58, 0xf8, 0xaa, + 0xe1, 0xb0, 0xaf, 0xf2, 0x3c, 0x0e, 0xc7, 0xda, 0x60, 0xbb, 0x1d, 0x1b, 0x7b, 0xe5, 0xc6, 0xcc, + 0xf0, 0x86, 0x85, 0xd9, 0xfc, 0xa1, 0x14, 0xb3, 0x90, 0x6b, 0xa5, 0x58, 0xdf, 0x58, 0xdf, 0x9c, + 0x5f, 0xc9, 0xce, 0xe4, 0xb3, 0xaf, 0xdc, 0x98, 0xc9, 0x08, 0x67, 0x48, 0xf0, 0xbd, 0x9e, 0xdd, + 0xc9, 0x1d, 0xcf, 0x5f, 0x8f, 0xc1, 0x54, 0x4b, 0xba, 0x98, 0x67, 0xd6, 0x3b, 0x65, 0x34, 0x0b, + 0x90, 0x5a, 0x14, 0x09, 0xfb, 0x7e, 0x13, 0x9a, 0x3f, 0xdb, 0x67, 0x42, 0x73, 0x58, 0xb4, 0x24, + 0xf2, 0x99, 0x27, 0xa3, 0xf3, 0x99, 0x42, 0xfe, 0x43, 0xa4, 0x33, 0xdf, 0x1f, 0x87, 0x29, 0x96, + 0xfa, 0x9d, 0xdb, 0x51, 0x6d, 0x3c, 0x77, 0xf5, 0x89, 0x1d, 0xec, 0xa8, 0x4f, 0xcc, 0x55, 0x0c, + 0x4d, 0xa8, 0x63, 0x9c, 0x67, 0xde, 0x49, 0xfd, 0x2c, 0xaf, 0xef, 0x90, 0x81, 0x59, 0x82, 0xc4, + 0x82, 0xa1, 0xe9, 0x44, 0x15, 0x55, 0xac, 0x1b, 0x0d, 0x9e, 0xce, 0x63, 0x05, 0x74, 0x1f, 0x0c, + 0xa8, 0x0d, 0xa3, 0xa9, 0x3b, 0x62, 0x0b, 0x41, 0x9c, 0xc5, 0x1f, 0xdc, 0x9c, 0x8e, 0x2f, 0xeb, + 0x8e, 0xc2, 0xab, 0x58, 0xc6, 0x49, 0xbe, 0x04, 0x83, 0x8b, 0xb8, 0x72, 0x18, 0x5e, 0x8b, 0xb8, + 0x12, 0xe2, 0xf5, 0x30, 0xa4, 0x96, 0x75, 0x87, 0x3d, 0x85, 0xbf, 0x07, 0xe2, 0x9a, 0xce, 0xa2, + 0xa2, 0x50, 0xfb, 0x04, 0x4e, 0x50, 0x17, 0x71, 0xc5, 0x45, 0xad, 0xe2, 0x4a, 0x18, 0x95, 0xb0, + 0x27, 0xf0, 0xe2, 0xe2, 0xef, 0xff, 0xfb, 0xa9, 0x23, 0x2f, 0xbf, 0x36, 0x75, 0xa4, 0xa3, 0xa9, + 0xfa, 0x4f, 0x39, 0xb8, 0x8a, 0x79, 0x92, 0xdd, 0xae, 0xee, 0x87, 0xac, 0xf2, 0xcf, 0x25, 0x38, + 0x16, 0xb6, 0x4a, 0x55, 0x3f, 0xe8, 0x60, 0x90, 0x1d, 0xb4, 0xff, 0x26, 0x88, 0xcf, 0xeb, 0x07, + 0x64, 0x8f, 0x40, 0x3f, 0xab, 0xd2, 0xb4, 0xea, 0x5c, 0x67, 0x83, 0xa4, 0xbc, 0x6d, 0xd1, 0x94, + 0xb2, 0xf8, 0x1a, 0x05, 0xdd, 0xca, 0xb2, 0xd3, 0xac, 0xc4, 0xf7, 0x3e, 0x3b, 0x7d, 0xa4, 0xb8, + 0x1f, 0xee, 0xc8, 0x57, 0x22, 0x6d, 0x35, 0x35, 0xaf, 0x1f, 0x08, 0x33, 0x4d, 0xd2, 0x0e, 0xf5, + 0x6b, 0x7e, 0xff, 0xe1, 0x31, 0xb8, 0x9f, 0xeb, 0xc6, 0x76, 0xd4, 0x7d, 0x4d, 0xaf, 0xb9, 0x16, + 0xc8, 0xcb, 0x5c, 0x05, 0x93, 0xdc, 0x08, 0x05, 0xb4, 0xab, 0x1d, 0xe6, 0x3b, 0x9f, 0x1c, 0xe5, + 0xbb, 0xa6, 0x3b, 0xa2, 0xd3, 0x18, 0x11, 0xbe, 0x23, 0x1f, 0x31, 0x99, 0xf2, 0x9d, 0x47, 0x59, + 0xfe, 0x90, 0x04, 0x23, 0x17, 0x35, 0xdb, 0x31, 0x2c, 0xad, 0xa2, 0xd6, 0xe9, 0x0b, 0x92, 0x33, + 0xbd, 0x46, 0x3a, 0xa1, 0x85, 0xf7, 0x59, 0x18, 0xb8, 0xaa, 0xd6, 0x59, 0x88, 0x11, 0xa7, 0x5f, + 0xbc, 0x68, 0xaf, 0x3e, 0x2f, 0xd0, 0x10, 0x0c, 0x18, 0x99, 0xfc, 0x2b, 0x31, 0x18, 0xa5, 0x4b, + 0x93, 0xcd, 0x3e, 0x71, 0xe4, 0x60, 0x12, 0x1e, 0x27, 0x2c, 0xd5, 0xe1, 0x29, 0xfa, 0xe2, 0x2c, + 0x9f, 0x11, 0x0f, 0x46, 0x5b, 0xf9, 0x2c, 0x99, 0x34, 0x94, 0x16, 0xbd, 0x13, 0x52, 0x0d, 0xf5, + 0x7a, 0x99, 0xf2, 0x61, 0x13, 0x77, 0xbe, 0x3f, 0x3e, 0xb7, 0x6e, 0x4e, 0x8f, 0x1e, 0xa8, 0x8d, + 0x7a, 0x41, 0x16, 0x7c, 0x64, 0x65, 0xb0, 0xa1, 0x5e, 0x27, 0x22, 0x22, 0x13, 0x46, 0x09, 0xb4, + 0xb2, 0xa7, 0xea, 0x35, 0xcc, 0x1a, 0xa1, 0x07, 0x0e, 0xc5, 0x8b, 0x7d, 0x37, 0x32, 0xe9, 0x35, + 0xe2, 0x63, 0x27, 0x2b, 0xc3, 0x0d, 0xf5, 0xfa, 0x02, 0x05, 0x90, 0x16, 0x0b, 0xa9, 0x8f, 0x7f, + 0x66, 0xfa, 0x08, 0xf5, 0x32, 0xdf, 0x94, 0x00, 0x3c, 0x8d, 0xa1, 0x77, 0x42, 0xb6, 0xe2, 0x96, + 0x28, 0xad, 0xcd, 0xc7, 0xf0, 0xa1, 0x4e, 0x63, 0x11, 0xd2, 0x37, 0x8b, 0x94, 0xbf, 0x71, 0x73, + 0x5a, 0x52, 0x46, 0x2b, 0xa1, 0xa1, 0x78, 0x07, 0x0c, 0x35, 0xcd, 0xaa, 0xea, 0xe0, 0x32, 0xcd, + 0xaa, 0xc4, 0x22, 0xa3, 0xee, 0x29, 0xc2, 0xeb, 0xd6, 0xcd, 0x69, 0xc4, 0xba, 0xe5, 0x23, 0x96, + 0x69, 0x2c, 0x0e, 0x0c, 0x42, 0x08, 0x7c, 0x7d, 0xfa, 0x9a, 0x04, 0x43, 0x8b, 0xbe, 0x9b, 0x5c, + 0x39, 0x18, 0x6c, 0x18, 0xba, 0xb6, 0xcf, 0xed, 0x31, 0xad, 0x88, 0x22, 0xca, 0x43, 0x8a, 0x3d, + 0xaa, 0x73, 0x0e, 0xc4, 0xc1, 0x83, 0x28, 0x13, 0xaa, 0x6b, 0x78, 0xc7, 0xd6, 0xc4, 0x68, 0x28, + 0xa2, 0x88, 0x2e, 0x40, 0xd6, 0xc6, 0x95, 0xa6, 0xa5, 0x39, 0x07, 0xe5, 0x8a, 0xa1, 0x3b, 0x6a, + 0xc5, 0x61, 0xcf, 0xb3, 0x8a, 0x77, 0xdf, 0xba, 0x39, 0x7d, 0x17, 0x93, 0x35, 0x8c, 0x21, 0x2b, + 0xa3, 0x02, 0xb4, 0xc0, 0x20, 0xa4, 0x85, 0x2a, 0x76, 0x54, 0xad, 0x6e, 0xe7, 0xd8, 0x91, 0xa8, + 0x28, 0xfa, 0xfa, 0xf2, 0xe9, 0x41, 0x7f, 0x9a, 0xf9, 0x02, 0x64, 0x0d, 0x13, 0x5b, 0x81, 0x6d, + 0xa1, 0x14, 0x6e, 0x39, 0x8c, 0x21, 0x2b, 0xa3, 0x02, 0x24, 0xb6, 0x8c, 0xbb, 0x64, 0x98, 0x45, + 0xda, 0xc6, 0x6c, 0xee, 0x78, 0xd9, 0xe9, 0x89, 0x96, 0xd1, 0x98, 0xd7, 0x0f, 0x8a, 0x0f, 0x78, + 0xdc, 0xc3, 0x74, 0xf2, 0xd7, 0xbf, 0xf4, 0xd8, 0xc0, 0x06, 0x4d, 0x0a, 0x93, 0x01, 0xe7, 0x95, + 0x1b, 0xb4, 0x8e, 0x6c, 0xfb, 0x5e, 0x50, 0xb5, 0xba, 0x78, 0x58, 0xac, 0xf0, 0x12, 0x2a, 0xc0, + 0x80, 0xed, 0xa8, 0x4e, 0xd3, 0xe6, 0x9f, 0xf1, 0x92, 0x3b, 0x19, 0x57, 0xd1, 0xd0, 0xab, 0x9b, + 0x14, 0x53, 0xe1, 0x14, 0xe8, 0x02, 0x0c, 0x38, 0xc6, 0x3e, 0xd6, 0xb9, 0xd2, 0xfa, 0x9a, 0xd1, + 0x74, 0xc5, 0x66, 0xd4, 0xc8, 0x81, 0x6c, 0x15, 0xd7, 0x71, 0x8d, 0x6d, 0x6b, 0xf6, 0x54, 0xb2, + 0xfb, 0xa7, 0x5f, 0xf3, 0x2a, 0x2e, 0xf7, 0x3d, 0xed, 0xb8, 0x6e, 0xc2, 0xfc, 0x64, 0x65, 0xd4, + 0x05, 0x6d, 0x52, 0x08, 0xba, 0x1c, 0xb8, 0x64, 0xc8, 0x3f, 0x79, 0x77, 0x5f, 0xa7, 0xee, 0xfb, + 0xac, 0x58, 0xe4, 0x07, 0xfd, 0x57, 0x14, 0x2f, 0x40, 0xb6, 0xa9, 0xef, 0x18, 0x3a, 0x7d, 0xfd, + 0xc7, 0xf7, 0xd7, 0x29, 0x12, 0xdd, 0xf9, 0xcd, 0x21, 0x8c, 0x21, 0x2b, 0xa3, 0x2e, 0xe8, 0x22, + 0xdb, 0x85, 0x57, 0x61, 0xc4, 0xc3, 0xa2, 0x53, 0x33, 0x1d, 0x39, 0x35, 0xef, 0xe5, 0x53, 0xf3, + 0x68, 0xb8, 0x15, 0x6f, 0x76, 0x0e, 0xbb, 0x40, 0x42, 0x86, 0x2e, 0x02, 0x78, 0x0e, 0x81, 0xe6, + 0x09, 0x87, 0x3a, 0x0f, 0xbc, 0xe7, 0x55, 0x44, 0xbe, 0xc5, 0xa3, 0x45, 0xef, 0x86, 0xf1, 0x86, + 0xa6, 0x97, 0x6d, 0x5c, 0xdf, 0x2d, 0x73, 0x05, 0x13, 0x96, 0xf4, 0xeb, 0x2d, 0xc5, 0x95, 0xfe, + 0xec, 0xe1, 0xd6, 0xcd, 0xe9, 0x3c, 0x77, 0x9a, 0xad, 0x2c, 0x65, 0x65, 0xac, 0xa1, 0xe9, 0x9b, + 0xb8, 0xbe, 0xbb, 0xe8, 0xc2, 0x0a, 0x99, 0x0f, 0x7e, 0x66, 0xfa, 0x08, 0x9f, 0xa0, 0x47, 0xe4, + 0x33, 0xf4, 0xec, 0x8a, 0x4f, 0x2c, 0x6c, 0xa3, 0xe3, 0x90, 0x56, 0x45, 0x81, 0x66, 0x14, 0xd3, + 0x8a, 0x07, 0x60, 0x13, 0xfb, 0xe5, 0x7f, 0x37, 0x23, 0xc9, 0xbf, 0x2c, 0xc1, 0xc0, 0xe2, 0x95, + 0x0d, 0x55, 0xb3, 0xd0, 0x32, 0x8c, 0x79, 0x96, 0x13, 0x9c, 0xd6, 0xc7, 0x6f, 0xdd, 0x9c, 0xce, + 0x85, 0x8d, 0xcb, 0x9d, 0xd7, 0x9e, 0x01, 0x8b, 0x89, 0xbd, 0xdc, 0x29, 0x71, 0x14, 0x60, 0xd5, + 0x82, 0x22, 0xb7, 0xa6, 0x95, 0x42, 0xdd, 0x2c, 0xc1, 0x20, 0x93, 0xd6, 0x46, 0x05, 0x48, 0x9a, + 0xe4, 0x07, 0x3f, 0x98, 0x9b, 0xea, 0x68, 0xbc, 0x14, 0xdf, 0x3d, 0x48, 0x20, 0x24, 0xf2, 0x47, + 0x63, 0x00, 0x8b, 0x57, 0xae, 0x6c, 0x59, 0x9a, 0x59, 0xc7, 0xce, 0xed, 0xec, 0xf9, 0x16, 0x1c, + 0xf5, 0x65, 0x29, 0xac, 0x4a, 0xa8, 0xf7, 0x33, 0xb7, 0x6e, 0x4e, 0x1f, 0x0f, 0xf7, 0xde, 0x87, + 0x26, 0x2b, 0xe3, 0x5e, 0xbe, 0xc2, 0xaa, 0xb4, 0xe5, 0x5a, 0xb5, 0x1d, 0x97, 0x6b, 0xbc, 0x33, + 0x57, 0x1f, 0x9a, 0x9f, 0xeb, 0xa2, 0xed, 0xb4, 0x57, 0xed, 0x26, 0x0c, 0x79, 0x2a, 0xb1, 0xd1, + 0x22, 0xa4, 0x1c, 0xfe, 0x9b, 0x6b, 0x58, 0xee, 0xac, 0x61, 0x41, 0xc6, 0xb5, 0xec, 0x52, 0xca, + 0x7f, 0x21, 0x01, 0x78, 0x36, 0xfb, 0xe3, 0x69, 0x62, 0xc4, 0x95, 0x73, 0xc7, 0x1b, 0x3f, 0x54, + 0x70, 0xc6, 0xa9, 0x43, 0xfa, 0xfc, 0xa9, 0x18, 0x8c, 0x6f, 0x0b, 0xcf, 0xf3, 0x63, 0xaf, 0x83, + 0x0d, 0x18, 0xc4, 0xba, 0x63, 0x69, 0x54, 0x09, 0x64, 0xb4, 0x1f, 0xef, 0x34, 0xda, 0x6d, 0xfa, + 0x44, 0x3f, 0x5f, 0x23, 0x0e, 0xbd, 0x38, 0x9b, 0x90, 0x36, 0x3e, 0x1c, 0x87, 0x5c, 0x27, 0x4a, + 0xb4, 0x00, 0xa3, 0x15, 0x0b, 0x53, 0x40, 0xd9, 0x9f, 0x79, 0x2f, 0xe6, 0xbd, 0x58, 0x32, 0x84, + 0x20, 0x2b, 0x23, 0x02, 0xc2, 0x57, 0x8f, 0x1a, 0x90, 0x40, 0x8f, 0x98, 0x1d, 0xc1, 0xea, 0x31, + 0xb2, 0x93, 0xf9, 0xf2, 0x21, 0x1a, 0x09, 0x32, 0x60, 0xeb, 0xc7, 0x88, 0x07, 0xa5, 0x0b, 0xc8, + 0x8b, 0x30, 0xaa, 0xe9, 0x9a, 0xa3, 0xa9, 0xf5, 0xf2, 0x8e, 0x5a, 0x57, 0xf5, 0xca, 0x61, 0xe2, + 0x64, 0xe6, 0xf2, 0x79, 0xb3, 0x21, 0x76, 0xb2, 0x32, 0xc2, 0x21, 0x45, 0x06, 0x40, 0x17, 0x61, + 0x50, 0x34, 0x95, 0x38, 0x54, 0xb4, 0x21, 0xc8, 0x7d, 0x21, 0xdd, 0x4f, 0xc7, 0x61, 0x4c, 0xc1, + 0xd5, 0xff, 0x37, 0x14, 0xfd, 0x0d, 0xc5, 0x2a, 0x00, 0x9b, 0xee, 0xc4, 0xc1, 0x1e, 0x62, 0x34, + 0x88, 0xc3, 0x48, 0x33, 0x0e, 0x8b, 0xb6, 0xe3, 0x1b, 0x8f, 0x9b, 0x31, 0xc8, 0xf8, 0xc7, 0xe3, + 0xaf, 0xe8, 0xaa, 0x84, 0x96, 0x3d, 0x4f, 0x94, 0xe0, 0x5f, 0xfd, 0xec, 0xe0, 0x89, 0x5a, 0xac, + 0xb7, 0xbb, 0x0b, 0xfa, 0xef, 0x31, 0x18, 0xd8, 0x50, 0x2d, 0xb5, 0x61, 0xa3, 0x4a, 0x4b, 0xa4, + 0x29, 0xd2, 0xff, 0x2d, 0x9f, 0x6c, 0xe6, 0x09, 0x8a, 0x88, 0x40, 0xf3, 0xe3, 0x6d, 0x02, 0xcd, + 0xb7, 0xc0, 0x08, 0xd9, 0x00, 0xfb, 0xae, 0x10, 0x11, 0x6d, 0x0f, 0x17, 0x8f, 0x79, 0x5c, 0x82, + 0xf5, 0x6c, 0x7f, 0x7c, 0xc5, 0x7f, 0x87, 0x68, 0x88, 0x60, 0x78, 0x8e, 0x99, 0x90, 0x4f, 0x7a, + 0x1b, 0x51, 0x5f, 0xa5, 0xac, 0x40, 0x43, 0xbd, 0x5e, 0x62, 0x05, 0xb4, 0x02, 0x68, 0xcf, 0xcd, + 0x85, 0x94, 0x3d, 0x75, 0x12, 0xfa, 0x7b, 0x6e, 0xdd, 0x9c, 0x3e, 0xc6, 0xe8, 0x5b, 0x71, 0x64, + 0x65, 0xcc, 0x03, 0x0a, 0x6e, 0x4f, 0x01, 0x90, 0x7e, 0x95, 0x59, 0x22, 0x91, 0x6d, 0x77, 0x8e, + 0xde, 0xba, 0x39, 0x3d, 0xc6, 0xb8, 0x78, 0x75, 0xb2, 0x92, 0x26, 0x85, 0x45, 0xf2, 0xdb, 0x67, + 0xd9, 0x9f, 0x93, 0x00, 0x79, 0x2e, 0x5f, 0xc1, 0xb6, 0x49, 0xf6, 0x67, 0x24, 0x10, 0xf7, 0x45, + 0xcd, 0x52, 0xf7, 0x40, 0xdc, 0xa3, 0x17, 0x81, 0xb8, 0x6f, 0xa6, 0x9c, 0xf3, 0xdc, 0x63, 0x8c, + 0x8f, 0x63, 0x9b, 0xac, 0xeb, 0xec, 0x82, 0xa1, 0x09, 0xea, 0x16, 0x7f, 0x78, 0x44, 0xfe, 0x97, + 0x12, 0x1c, 0x6b, 0xb1, 0x28, 0x57, 0xd8, 0xff, 0x0f, 0x90, 0xe5, 0xab, 0xe4, 0x5f, 0x70, 0x63, + 0x42, 0xf7, 0x6d, 0xa0, 0x63, 0x56, 0x8b, 0xdf, 0xbd, 0x7d, 0x1e, 0x9e, 0xa5, 0x6d, 0x7f, 0x53, + 0x82, 0x09, 0x7f, 0xf3, 0x6e, 0x47, 0xd6, 0x20, 0xe3, 0x6f, 0x9d, 0x77, 0xe1, 0xfe, 0x5e, 0xba, + 0xc0, 0xa5, 0x0f, 0xd0, 0xa3, 0xe7, 0xbc, 0xe9, 0xca, 0xb2, 0x65, 0x4f, 0xf4, 0xac, 0x0d, 0x21, + 0x53, 0x78, 0xda, 0x26, 0xe8, 0x78, 0xfc, 0x6f, 0x09, 0x12, 0x1b, 0x86, 0x51, 0x47, 0x06, 0x8c, + 0xe9, 0x86, 0x53, 0x26, 0x96, 0x85, 0xab, 0x65, 0xbe, 0xe9, 0x66, 0x7e, 0x70, 0xa1, 0x3f, 0x25, + 0x7d, 0xe7, 0xe6, 0x74, 0x2b, 0x2b, 0x65, 0x54, 0x37, 0x9c, 0x22, 0x85, 0x6c, 0xb1, 0x2d, 0xf9, + 0xbb, 0x61, 0x38, 0xd8, 0x18, 0xf3, 0x92, 0xcf, 0xf7, 0xdd, 0x58, 0x90, 0xcd, 0xad, 0x9b, 0xd3, + 0x13, 0xde, 0x8c, 0x71, 0xc1, 0xb2, 0x92, 0xd9, 0xf1, 0xb5, 0xce, 0xae, 0x57, 0x7e, 0xef, 0x33, + 0xd3, 0xd2, 0xc9, 0x2f, 0x4b, 0x00, 0x5e, 0xe6, 0x01, 0x3d, 0x0a, 0x77, 0x15, 0xd7, 0xd7, 0x16, + 0xcb, 0x9b, 0x5b, 0xf3, 0x5b, 0xdb, 0x9b, 0xe5, 0xed, 0xb5, 0xcd, 0x8d, 0xd2, 0xc2, 0xf2, 0x85, + 0xe5, 0xd2, 0xa2, 0x77, 0x3c, 0x65, 0x9b, 0xb8, 0xa2, 0xed, 0x6a, 0xb8, 0x8a, 0x1e, 0x84, 0x89, + 0x20, 0x36, 0x29, 0x95, 0x16, 0xb3, 0x52, 0x3e, 0xf3, 0xca, 0x8d, 0x99, 0x14, 0x8b, 0xc5, 0x70, + 0x15, 0x9d, 0x80, 0xa3, 0xad, 0x78, 0xcb, 0x6b, 0x4b, 0xd9, 0x58, 0x7e, 0xf8, 0x95, 0x1b, 0x33, + 0x69, 0x37, 0x68, 0x43, 0x32, 0x20, 0x3f, 0x26, 0xe7, 0x17, 0xcf, 0xc3, 0x2b, 0x37, 0x66, 0x06, + 0x98, 0x02, 0xf3, 0x89, 0x0f, 0x7e, 0x6e, 0xea, 0x48, 0xf1, 0x42, 0xc7, 0xac, 0xfe, 0xa3, 0x5d, + 0x75, 0x77, 0xdd, 0x4d, 0x63, 0x07, 0xf3, 0xfb, 0x7f, 0x36, 0xd8, 0x31, 0xcf, 0x5d, 0xc3, 0x3a, + 0xb6, 0x35, 0xfb, 0x50, 0x79, 0xee, 0x9e, 0x72, 0xe7, 0xf2, 0xef, 0x25, 0x21, 0xb3, 0xc4, 0x5a, + 0x21, 0x03, 0x81, 0xd1, 0x9b, 0x60, 0xc0, 0xa4, 0xcb, 0x88, 0x7b, 0x8c, 0xdd, 0xc1, 0xe0, 0xd9, + 0x62, 0xe3, 0xde, 0xa5, 0x64, 0x4b, 0x8f, 0xcd, 0x2f, 0x53, 0xb1, 0x3b, 0x9e, 0xde, 0xad, 0xc5, + 0x4c, 0x5f, 0xf9, 0x1e, 0x16, 0xb3, 0xf0, 0xd4, 0x4a, 0x98, 0x9f, 0xcc, 0xee, 0x65, 0x6d, 0x11, + 0x08, 0xbb, 0x9d, 0xf9, 0x7e, 0x09, 0x8e, 0x52, 0x2c, 0x6f, 0x21, 0xa6, 0x98, 0x22, 0xd8, 0x3f, + 0xd9, 0xa9, 0x0b, 0x2b, 0xaa, 0xed, 0xdd, 0xb5, 0x62, 0xf7, 0x29, 0xef, 0xe7, 0x0b, 0xe1, 0x71, + 0x5f, 0xe3, 0x61, 0xb6, 0xb2, 0x32, 0x5e, 0x6f, 0xa1, 0xb4, 0xd1, 0x52, 0xe0, 0x42, 0x6d, 0xa2, + 0xbf, 0xe4, 0xba, 0xff, 0x72, 0xed, 0x25, 0x18, 0xf2, 0x7c, 0x89, 0xcd, 0xff, 0x93, 0x44, 0xef, + 0x6b, 0x87, 0x9f, 0x18, 0x7d, 0x40, 0x82, 0xa3, 0xde, 0x6a, 0xee, 0x67, 0xcb, 0xfe, 0xe3, 0xc6, + 0x23, 0x7d, 0x6c, 0x84, 0xc2, 0xca, 0x69, 0xcb, 0x57, 0x56, 0x26, 0x9a, 0xad, 0xa4, 0x64, 0x0b, + 0x36, 0xec, 0xf7, 0xac, 0x76, 0x4e, 0x7c, 0x7c, 0xae, 0x77, 0xd7, 0x1c, 0x64, 0xc0, 0xfe, 0x0b, + 0x80, 0x69, 0x58, 0x0e, 0xae, 0xd2, 0x84, 0x5c, 0x4a, 0x71, 0xcb, 0xf2, 0x1a, 0xa0, 0xd6, 0xc1, + 0x0d, 0x5f, 0x20, 0x4e, 0x7b, 0x17, 0x88, 0x27, 0x20, 0xe9, 0xbf, 0x62, 0xcb, 0x0a, 0x85, 0xd4, + 0x07, 0xf9, 0xf2, 0x79, 0xdb, 0xe7, 0xfc, 0x3f, 0x8f, 0xc1, 0x49, 0xff, 0x69, 0xd0, 0x8b, 0x4d, + 0x6c, 0x1d, 0xb8, 0x53, 0xd4, 0x54, 0x6b, 0x9a, 0xee, 0x3f, 0x75, 0x3e, 0xe6, 0x5f, 0xf0, 0x29, + 0xae, 0xd0, 0x93, 0xac, 0xc3, 0xd0, 0x86, 0x5a, 0xc3, 0x0a, 0x7e, 0xb1, 0x89, 0x6d, 0xa7, 0xcd, + 0x23, 0x8e, 0x49, 0x18, 0x30, 0x76, 0x77, 0xc5, 0x95, 0x92, 0x84, 0xc2, 0x4b, 0xa4, 0xcb, 0x75, + 0xad, 0xa1, 0xb1, 0xdb, 0x98, 0x09, 0x85, 0x15, 0xd0, 0x34, 0x0c, 0x55, 0x8c, 0xa6, 0xce, 0x67, + 0x5c, 0x2e, 0x21, 0x3e, 0xe9, 0xd0, 0xd4, 0xd9, 0x8c, 0x93, 0x9f, 0x85, 0x0c, 0x6b, 0x8f, 0xaf, + 0xb8, 0xc7, 0x20, 0x45, 0xaf, 0x33, 0x7a, 0xad, 0x0e, 0x92, 0xf2, 0x65, 0xf6, 0xe0, 0x83, 0x71, + 0x61, 0x0d, 0xb3, 0x42, 0xb1, 0xd8, 0x51, 0x95, 0x27, 0xa2, 0x5d, 0x03, 0x53, 0x94, 0xab, 0xc6, + 0xdf, 0x4e, 0xc2, 0x51, 0x7e, 0x68, 0xa6, 0x9a, 0xda, 0xdc, 0x9e, 0xe3, 0x88, 0x97, 0x47, 0xc0, + 0x43, 0x5d, 0xd5, 0xd4, 0xe4, 0x03, 0x48, 0x5c, 0x74, 0x1c, 0x13, 0x9d, 0x84, 0xa4, 0xd5, 0xac, + 0x63, 0x91, 0xf1, 0x71, 0xb3, 0xf0, 0xaa, 0xa9, 0xcd, 0x12, 0x04, 0xa5, 0x59, 0xc7, 0x0a, 0x43, + 0x41, 0x25, 0x98, 0xde, 0x6d, 0xd6, 0xeb, 0x07, 0xe5, 0x2a, 0xa6, 0xff, 0x65, 0xc7, 0xfd, 0xa0, + 0x3d, 0xbe, 0x6e, 0xaa, 0xe2, 0xab, 0x78, 0x44, 0x37, 0xc7, 0x29, 0xda, 0x22, 0xc5, 0x12, 0x1f, + 0xb3, 0x2f, 0x09, 0x1c, 0xf9, 0x0f, 0x62, 0x90, 0x12, 0xac, 0xe9, 0x0b, 0x0c, 0x5c, 0xc7, 0x15, + 0xc7, 0x10, 0x67, 0x24, 0x6e, 0x19, 0x21, 0x88, 0xd7, 0xf8, 0x10, 0xa5, 0x2f, 0x1e, 0x51, 0x48, + 0x81, 0xc0, 0xdc, 0x77, 0x31, 0x04, 0x66, 0x36, 0xc9, 0xa8, 0x25, 0x4c, 0x43, 0x6c, 0xcd, 0x2e, + 0x1e, 0x51, 0x68, 0x09, 0xe5, 0x60, 0x80, 0xcc, 0x0c, 0x87, 0x7d, 0x6a, 0x90, 0xc0, 0x79, 0x19, + 0x4d, 0x42, 0xd2, 0x54, 0x9d, 0x0a, 0xbb, 0xd2, 0x4a, 0x2a, 0x58, 0x11, 0x3d, 0x0d, 0x03, 0xec, + 0x89, 0x67, 0xf8, 0x5f, 0x58, 0x10, 0x65, 0xb0, 0x6f, 0x69, 0x11, 0xb9, 0x37, 0x54, 0xc7, 0xc1, + 0x96, 0x4e, 0x18, 0x32, 0x74, 0x84, 0x20, 0xb1, 0x63, 0x54, 0x0f, 0xf8, 0xbf, 0xd5, 0xa0, 0xbf, + 0xf9, 0x07, 0xff, 0xa9, 0x3d, 0x94, 0x69, 0x25, 0xfb, 0x6f, 0x42, 0x19, 0x01, 0x2c, 0x12, 0xa4, + 0x12, 0x8c, 0xab, 0xd5, 0xaa, 0x46, 0xac, 0x9a, 0xec, 0x40, 0x35, 0xea, 0x21, 0x6c, 0xfa, 0xbf, + 0xa2, 0x3a, 0x8d, 0x05, 0xf2, 0x08, 0x8a, 0x1c, 0xbf, 0x98, 0x86, 0x41, 0x93, 0x09, 0x25, 0x9f, + 0x87, 0xb1, 0x16, 0x49, 0x89, 0x7c, 0xfb, 0x9a, 0x5e, 0x15, 0x8f, 0x85, 0xc8, 0x6f, 0x02, 0xa3, + 0xdf, 0xc3, 0x63, 0xa7, 0x4f, 0xf4, 0x77, 0xf1, 0xbd, 0x9d, 0xef, 0x5e, 0x8c, 0xf8, 0xce, 0xb3, + 0x55, 0x53, 0x2b, 0xa6, 0x29, 0x7f, 0x7e, 0x96, 0x3d, 0xcf, 0x2b, 0xd8, 0x75, 0x8b, 0x59, 0xc3, + 0xaa, 0x91, 0x55, 0x5a, 0xac, 0xbe, 0xa4, 0x4a, 0x35, 0x35, 0x9b, 0x9a, 0xa3, 0xf7, 0x7d, 0x3e, + 0xfb, 0xbc, 0xef, 0x37, 0xbd, 0x89, 0x91, 0x58, 0x9a, 0xdf, 0x58, 0x76, 0xed, 0xf8, 0xb7, 0x62, + 0x70, 0xdc, 0x67, 0xc7, 0x3e, 0xe4, 0x56, 0x73, 0xce, 0xb7, 0xb7, 0xf8, 0x1e, 0x1e, 0x3a, 0x5e, + 0x86, 0x04, 0xc1, 0x47, 0x11, 0x9f, 0xe3, 0xcf, 0xfd, 0xea, 0xd7, 0xff, 0xa9, 0x1c, 0x3c, 0xa7, + 0x0a, 0x8c, 0x0a, 0x65, 0x52, 0xfc, 0x40, 0xef, 0xfa, 0xcb, 0x7a, 0x9f, 0x26, 0xb4, 0x6f, 0x9f, + 0x1a, 0xc3, 0x3a, 0xfc, 0xf6, 0x69, 0x90, 0x3b, 0x84, 0x3c, 0xcc, 0x63, 0x76, 0x0f, 0xa2, 0xfa, + 0x70, 0xc7, 0x9d, 0xde, 0xdf, 0x74, 0x1b, 0xc1, 0x1e, 0xc3, 0xb1, 0xeb, 0x30, 0xf9, 0x1c, 0x69, + 0xdb, 0xdb, 0x26, 0x0b, 0xc7, 0x3e, 0xe9, 0x9e, 0xe6, 0x49, 0xfc, 0x5f, 0x75, 0x89, 0x93, 0x3a, + 0xf0, 0xe4, 0xe3, 0x1b, 0xc4, 0x07, 0x67, 0x3b, 0xae, 0x17, 0xb3, 0xbe, 0xc5, 0x42, 0xf1, 0x51, + 0xca, 0xbf, 0x24, 0xc1, 0x5d, 0x2d, 0x4d, 0x73, 0x1f, 0xbf, 0xd4, 0xe6, 0xa9, 0xd0, 0xa1, 0x22, + 0x9b, 0xa5, 0x36, 0xc2, 0x3e, 0x14, 0x29, 0x2c, 0x93, 0x22, 0x20, 0xed, 0x33, 0x70, 0x34, 0x28, + 0xac, 0x50, 0xd3, 0x03, 0x30, 0x12, 0xcc, 0x08, 0x73, 0x75, 0x0d, 0x07, 0x72, 0xc2, 0x72, 0x39, + 0xac, 0x67, 0xb7, 0xaf, 0x25, 0x48, 0xbb, 0xa8, 0x3c, 0x04, 0xee, 0xb9, 0xab, 0x1e, 0xa5, 0xfc, + 0x51, 0x09, 0x66, 0x82, 0x2d, 0xf8, 0x82, 0xa1, 0xfe, 0x84, 0xbd, 0x6d, 0x43, 0xfc, 0xba, 0x04, + 0xf7, 0x76, 0x91, 0x89, 0x2b, 0xe0, 0x25, 0x98, 0xf0, 0x65, 0x02, 0x84, 0x0b, 0x17, 0xc3, 0x7e, + 0x32, 0x3a, 0x0c, 0x75, 0x37, 0xbe, 0x77, 0x13, 0xa5, 0x7c, 0xe1, 0x8f, 0xa6, 0xc7, 0x5b, 0xeb, + 0x6c, 0x65, 0xbc, 0x75, 0xf7, 0x7e, 0x1b, 0xed, 0xe3, 0x55, 0x09, 0x1e, 0x0e, 0x76, 0xb5, 0x4d, + 0x3c, 0xfb, 0x46, 0x8d, 0xc3, 0xbf, 0x95, 0xe0, 0x64, 0x2f, 0xc2, 0xf1, 0x01, 0xd9, 0x81, 0x71, + 0x2f, 0xd2, 0x0e, 0x8f, 0x47, 0x5f, 0xf1, 0x3b, 0xb3, 0x52, 0xe4, 0x72, 0xbb, 0x03, 0x8a, 0x37, + 0xf9, 0xc4, 0xf2, 0x0f, 0xb9, 0xab, 0xe4, 0x60, 0x36, 0x57, 0x28, 0x39, 0x90, 0xcf, 0x6d, 0x33, + 0x16, 0xb1, 0x36, 0x63, 0xe1, 0x85, 0xe6, 0xf2, 0x55, 0xee, 0xb7, 0xda, 0xe4, 0xe0, 0xde, 0x01, + 0xe3, 0x6d, 0x4c, 0x99, 0xcf, 0xea, 0x3e, 0x2c, 0x59, 0x41, 0xad, 0xc6, 0x2a, 0x1f, 0xc0, 0x34, + 0x6d, 0xb7, 0x8d, 0xa2, 0xef, 0x74, 0x97, 0x1b, 0xdc, 0xb7, 0xb4, 0x6d, 0x9a, 0xf7, 0x7d, 0x19, + 0x06, 0xd8, 0x38, 0xf3, 0xee, 0x1e, 0xc2, 0x50, 0x38, 0x03, 0xf9, 0x93, 0xc2, 0x97, 0x2d, 0x0a, + 0xb1, 0xdb, 0xcf, 0xa1, 0x5e, 0xfa, 0x7a, 0x9b, 0xe6, 0x90, 0x4f, 0x19, 0xdf, 0x14, 0x5e, 0xad, + 0xbd, 0x74, 0x5c, 0x1d, 0x95, 0xdb, 0xe6, 0xd5, 0x98, 0x6e, 0xee, 0xac, 0xfb, 0xfa, 0x05, 0xe1, + 0xbe, 0xdc, 0x3e, 0x45, 0xb8, 0xaf, 0x37, 0x46, 0xf5, 0xae, 0x23, 0x8b, 0x10, 0xf3, 0x2f, 0xa3, + 0x23, 0xfb, 0x9e, 0x04, 0xc7, 0x68, 0xdf, 0xfc, 0x89, 0x88, 0x7e, 0x55, 0xfe, 0x28, 0x20, 0xdb, + 0xaa, 0x94, 0xdb, 0xce, 0xee, 0xac, 0x6d, 0x55, 0xae, 0x04, 0xd6, 0x97, 0x47, 0x01, 0x55, 0x03, + 0xe9, 0x26, 0x8a, 0xcd, 0xee, 0xc5, 0x65, 0xab, 0xbe, 0x6c, 0x46, 0x9b, 0xe1, 0x4c, 0xdc, 0x86, + 0xe1, 0xfc, 0x86, 0x04, 0xf9, 0x76, 0x5d, 0xe6, 0xc3, 0xa7, 0xc1, 0x64, 0xe0, 0x90, 0x20, 0x3c, + 0x82, 0x8f, 0xf6, 0x92, 0xca, 0x09, 0x4d, 0xa3, 0xa3, 0x16, 0xbe, 0xd3, 0x71, 0xc0, 0x74, 0xd0, + 0x42, 0x5b, 0x23, 0xeb, 0x37, 0x6c, 0xfa, 0x7c, 0xa9, 0xc5, 0xaf, 0xfe, 0xa5, 0x88, 0xbd, 0xaf, + 0xc3, 0x54, 0x07, 0xa9, 0xef, 0xf4, 0xba, 0xb7, 0xd7, 0x71, 0x30, 0x6f, 0x77, 0xf8, 0xfe, 0x14, + 0x9f, 0x09, 0xc1, 0x3b, 0xd7, 0xbe, 0xbd, 0x58, 0xbb, 0x27, 0x94, 0xf2, 0xdb, 0xe0, 0xee, 0xb6, + 0x54, 0x5c, 0xb6, 0x02, 0x24, 0xf6, 0x34, 0xdb, 0xe1, 0x62, 0x3d, 0xd8, 0x49, 0xac, 0x10, 0x35, + 0xa5, 0x91, 0x11, 0x64, 0x29, 0xeb, 0x0d, 0xc3, 0xa8, 0x73, 0x31, 0xe4, 0xcb, 0x30, 0xe6, 0x83, + 0xf1, 0x46, 0xce, 0x40, 0xc2, 0x34, 0xf8, 0xe7, 0x3f, 0x86, 0x4e, 0x1d, 0xef, 0x98, 0xbd, 0x37, + 0x8c, 0x3a, 0xef, 0x36, 0xc5, 0x97, 0x27, 0x00, 0x31, 0x66, 0x34, 0x91, 0x2f, 0x9a, 0xd8, 0x84, + 0xf1, 0x00, 0x94, 0x37, 0xf2, 0x43, 0x1d, 0x12, 0x9c, 0xfa, 0xce, 0x51, 0x48, 0x52, 0xae, 0xe8, + 0x13, 0x12, 0x80, 0xef, 0x44, 0x78, 0xb6, 0x13, 0x9b, 0xf6, 0x7b, 0xe2, 0xfc, 0x5c, 0xcf, 0xf8, + 0x3c, 0x66, 0x3b, 0xf9, 0xde, 0x7f, 0xf5, 0xed, 0x8f, 0xc5, 0xee, 0x47, 0xf2, 0x5c, 0x87, 0xdd, + 0xb8, 0x6f, 0xbe, 0x7c, 0x3e, 0xf0, 0xed, 0x89, 0xc7, 0x7a, 0x6b, 0x4a, 0x48, 0x36, 0xdb, 0x2b, + 0x3a, 0x17, 0xec, 0x3c, 0x15, 0xec, 0x34, 0x7a, 0x32, 0x5a, 0xb0, 0xb9, 0x77, 0x05, 0x27, 0xcd, + 0x7b, 0xd0, 0xef, 0x49, 0x30, 0xd1, 0x6e, 0x4b, 0x87, 0xce, 0xf6, 0x26, 0x45, 0x6b, 0x48, 0x91, + 0x3f, 0x77, 0x08, 0x4a, 0xde, 0x95, 0x25, 0xda, 0x95, 0x79, 0xf4, 0xec, 0x21, 0xba, 0x32, 0xe7, + 0xcf, 0xef, 0xff, 0x4f, 0x09, 0xee, 0xe9, 0xba, 0x43, 0x42, 0xf3, 0xbd, 0x49, 0xd9, 0x25, 0x76, + 0xca, 0x17, 0x7f, 0x18, 0x16, 0xbc, 0xc7, 0xcf, 0xd1, 0x1e, 0x5f, 0x46, 0xcb, 0x87, 0xe9, 0x71, + 0xdb, 0x43, 0x14, 0xf4, 0x3b, 0xc1, 0x9b, 0x85, 0xdd, 0xcd, 0xa9, 0x65, 0xe3, 0x11, 0x31, 0x31, + 0x5a, 0x83, 0x5a, 0xf9, 0xad, 0xb4, 0x0b, 0x0a, 0xda, 0xf8, 0x21, 0x07, 0x6d, 0xee, 0x5d, 0x41, + 0xc7, 0xff, 0x1e, 0xf4, 0x3f, 0xa4, 0xf6, 0x17, 0x05, 0x9f, 0xee, 0x2a, 0x62, 0xe7, 0x4d, 0x55, + 0xfe, 0x6c, 0xff, 0x84, 0xbc, 0x93, 0x0d, 0xda, 0xc9, 0x1a, 0xc2, 0xb7, 0xbb, 0x93, 0x6d, 0x07, + 0x11, 0x7d, 0x4d, 0x82, 0x89, 0x76, 0x7b, 0x92, 0x88, 0x69, 0xd9, 0x65, 0x93, 0x15, 0x31, 0x2d, + 0xbb, 0x6d, 0x80, 0xe4, 0x37, 0xd1, 0xce, 0x9f, 0x41, 0x4f, 0x75, 0xea, 0x7c, 0xd7, 0x51, 0x24, + 0x73, 0xb1, 0x6b, 0x90, 0x1f, 0x31, 0x17, 0x7b, 0xd9, 0xc7, 0x44, 0xcc, 0xc5, 0x9e, 0xf6, 0x18, + 0xd1, 0x73, 0xd1, 0xed, 0x59, 0x8f, 0xc3, 0x68, 0xa3, 0xdf, 0x92, 0x60, 0x38, 0x10, 0x11, 0xa3, + 0x27, 0xba, 0x0a, 0xda, 0x6e, 0xc3, 0x90, 0x3f, 0xd5, 0x0f, 0x09, 0xef, 0xcb, 0x32, 0xed, 0xcb, + 0x02, 0x9a, 0x3f, 0x4c, 0x5f, 0x82, 0x67, 0xa5, 0xdf, 0x90, 0x60, 0xbc, 0x4d, 0x94, 0x19, 0x31, + 0x0b, 0x3b, 0x07, 0xcd, 0xf9, 0xb3, 0xfd, 0x13, 0xf2, 0x5e, 0x5d, 0xa0, 0xbd, 0x7a, 0x0b, 0x7a, + 0xe6, 0x30, 0xbd, 0xf2, 0xad, 0xcf, 0x37, 0xbd, 0x7b, 0x57, 0xbe, 0x76, 0xd0, 0x99, 0x3e, 0x05, + 0x13, 0x1d, 0x7a, 0xba, 0x6f, 0x3a, 0xde, 0x9f, 0xe7, 0x69, 0x7f, 0x9e, 0x43, 0xeb, 0x3f, 0x5c, + 0x7f, 0x5a, 0x97, 0xf5, 0x2f, 0xb6, 0xbe, 0xf9, 0xeb, 0x6e, 0x45, 0x6d, 0x83, 0xd5, 0xfc, 0x93, + 0x7d, 0xd1, 0xf0, 0x4e, 0x9d, 0xa5, 0x9d, 0x3a, 0x85, 0x1e, 0xef, 0xd4, 0x29, 0xdf, 0xe5, 0x3a, + 0x4d, 0xdf, 0x35, 0xe6, 0xde, 0xc5, 0x42, 0xe0, 0xf7, 0xa0, 0x9f, 0x14, 0x17, 0x9b, 0x4e, 0x74, + 0x6d, 0xd7, 0x17, 0xc7, 0xe6, 0x1f, 0xee, 0x01, 0x93, 0xcb, 0x75, 0x3f, 0x95, 0x6b, 0x0a, 0x1d, + 0xef, 0x24, 0x17, 0x89, 0x65, 0xd1, 0x87, 0x24, 0xf7, 0x2e, 0xe4, 0xc9, 0xee, 0xbc, 0xfd, 0xc1, + 0x6e, 0xfe, 0x91, 0x9e, 0x70, 0xb9, 0x24, 0x0f, 0x52, 0x49, 0x66, 0xd0, 0x54, 0x47, 0x49, 0x58, + 0xe8, 0x7b, 0xbb, 0x6f, 0x0e, 0xfc, 0xaf, 0x49, 0x98, 0xee, 0xd0, 0xa2, 0x73, 0xfd, 0x76, 0x3f, + 0x88, 0x8d, 0x7a, 0xb1, 0x1a, 0xf9, 0x24, 0xb6, 0xa7, 0x53, 0xaf, 0x6e, 0x0f, 0x5f, 0x7f, 0x33, + 0x01, 0x68, 0xd5, 0xae, 0x2d, 0x58, 0x98, 0xfd, 0x1b, 0x3b, 0x3e, 0xcb, 0x43, 0x2f, 0xbc, 0xa4, + 0x1f, 0xea, 0x85, 0xd7, 0x6a, 0xe0, 0xcd, 0x54, 0xac, 0xbf, 0x97, 0x98, 0x3d, 0x3f, 0x9c, 0x8a, + 0xff, 0x48, 0x1e, 0x4e, 0xb5, 0xbf, 0x57, 0x9d, 0xb8, 0x7d, 0x0f, 0x30, 0x92, 0x87, 0x7a, 0x80, + 0x71, 0x16, 0x06, 0xf8, 0x0b, 0xc8, 0x81, 0x2e, 0x2f, 0x20, 0xc1, 0xf7, 0xcc, 0x91, 0xe3, 0xa3, + 0xd3, 0xe2, 0x59, 0xfa, 0x60, 0x6f, 0x77, 0x5f, 0xf9, 0xbb, 0x75, 0x2f, 0x69, 0x70, 0x1c, 0xf2, + 0xad, 0x06, 0xe4, 0x4e, 0xe3, 0x8f, 0xc5, 0x21, 0xbb, 0x6a, 0xd7, 0x4a, 0x55, 0xcd, 0xb9, 0x43, + 0xd6, 0xf5, 0x6c, 0xe7, 0x67, 0x2c, 0xe8, 0xd6, 0xcd, 0xe9, 0x11, 0xa6, 0xc5, 0x2e, 0xba, 0x6b, + 0xc0, 0x68, 0xe8, 0xb9, 0x30, 0xb7, 0xa5, 0xc5, 0xc3, 0xbc, 0x5a, 0x0e, 0xb1, 0x92, 0xe9, 0xab, + 0x03, 0x9f, 0x45, 0xa3, 0xeb, 0xed, 0xcd, 0x97, 0x99, 0xd0, 0xc5, 0x3b, 0xf9, 0xe6, 0xcf, 0x1b, + 0xb3, 0x3c, 0xe4, 0xc2, 0x83, 0xe2, 0x8e, 0xd8, 0x9f, 0x48, 0x30, 0xb4, 0x6a, 0x8b, 0xe0, 0x0f, + 0xff, 0x98, 0xbe, 0x38, 0x7a, 0xda, 0xfd, 0x06, 0x45, 0xbc, 0x37, 0xbb, 0x15, 0xdf, 0xa5, 0xf0, + 0x94, 0x70, 0x14, 0xc6, 0x7d, 0xfd, 0x74, 0xfb, 0xff, 0xbb, 0x31, 0xea, 0x11, 0x8b, 0xb8, 0xa6, + 0xe9, 0x6e, 0xdc, 0x88, 0xff, 0xaa, 0xbe, 0xa7, 0xf0, 0xf4, 0x9c, 0x38, 0xac, 0x9e, 0xf7, 0xa9, + 0x83, 0x08, 0xe9, 0xd3, 0x4d, 0x75, 0xad, 0xb6, 0xbe, 0xf6, 0x91, 0xfa, 0xf8, 0x90, 0x55, 0xe8, + 0x4d, 0x8f, 0xfc, 0xba, 0x04, 0xc3, 0xab, 0x76, 0x6d, 0x5b, 0xaf, 0xfe, 0x5f, 0x6f, 0xbf, 0xbb, + 0x70, 0x34, 0xd0, 0xd3, 0x3b, 0xa4, 0xd2, 0x53, 0xaf, 0x26, 0x20, 0xbe, 0x6a, 0xd7, 0xd0, 0x8b, + 0x30, 0x1a, 0x0e, 0x13, 0x3a, 0x46, 0x7f, 0xad, 0x2b, 0x42, 0xe7, 0x1d, 0x5a, 0xe7, 0xd5, 0x03, + 0xed, 0xc3, 0x70, 0x70, 0xe5, 0x38, 0xd1, 0x85, 0x49, 0x00, 0x33, 0xff, 0x78, 0xaf, 0x98, 0x6e, + 0x63, 0xef, 0x84, 0x94, 0xeb, 0xf4, 0xee, 0xeb, 0x42, 0x2d, 0x90, 0x3a, 0xc7, 0xb3, 0x6d, 0xdc, + 0x0a, 0xd1, 0x5e, 0xd8, 0xa5, 0x74, 0xd3, 0x5e, 0x08, 0xb7, 0xab, 0xf6, 0x3a, 0x4d, 0xad, 0x1d, + 0x00, 0xdf, 0x3c, 0x78, 0xa0, 0x0b, 0x07, 0x0f, 0x2d, 0xff, 0x58, 0x4f, 0x68, 0xee, 0x31, 0xd3, + 0x6d, 0x0e, 0xbf, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x31, 0xf4, 0xff, 0xb5, 0x06, 0x94, + 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -2348,10 +2375,15 @@ func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } - if len(m.ConsensusPubkey) > 0 { - i -= len(m.ConsensusPubkey) - copy(dAtA[i:], m.ConsensusPubkey) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ConsensusPubkey))) + if m.ConsensusPubkey != nil { + { + size, err := m.ConsensusPubkey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x12 } @@ -2690,12 +2722,12 @@ func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error } i-- dAtA[i] = 0x1a - n7, err7 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) - if err7 != nil { - return 0, err7 + n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + if err8 != nil { + return 0, err8 } - i -= n7 - i = encodeVarintStaking(dAtA, i, uint64(n7)) + i -= n8 + i = encodeVarintStaking(dAtA, i, uint64(n8)) i-- dAtA[i] = 0x12 if m.CreationHeight != 0 { @@ -2746,12 +2778,12 @@ func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) - if err8 != nil { - return 0, err8 + n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + if err9 != nil { + return 0, err9 } - i -= n8 - i = encodeVarintStaking(dAtA, i, uint64(n8)) + i -= n9 + i = encodeVarintStaking(dAtA, i, uint64(n9)) i-- dAtA[i] = 0x12 if m.CreationHeight != 0 { @@ -2862,12 +2894,12 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x10 } - n9, err9 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime):]) - if err9 != nil { - return 0, err9 + n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime):]) + if err10 != nil { + return 0, err10 } - i -= n9 - i = encodeVarintStaking(dAtA, i, uint64(n9)) + i -= n10 + i = encodeVarintStaking(dAtA, i, uint64(n10)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -3144,8 +3176,8 @@ func (m *Validator) Size() (n int) { if l > 0 { n += 1 + l + sovStaking(uint64(l)) } - l = len(m.ConsensusPubkey) - if l > 0 { + if m.ConsensusPubkey != nil { + l = m.ConsensusPubkey.Size() n += 1 + l + sovStaking(uint64(l)) } if m.Jailed { @@ -4136,7 +4168,7 @@ func (m *Validator) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConsensusPubkey", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowStaking @@ -4146,23 +4178,27 @@ func (m *Validator) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthStaking } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthStaking } if postIndex > l { return io.ErrUnexpectedEOF } - m.ConsensusPubkey = string(dAtA[iNdEx:postIndex]) + if m.ConsensusPubkey == nil { + m.ConsensusPubkey = &types1.Any{} + } + if err := m.ConsensusPubkey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 0 { diff --git a/x/staking/types/tx.pb.go b/x/staking/types/tx.pb.go index f49c42ecdb..431e43a5b7 100644 --- a/x/staking/types/tx.pb.go +++ b/x/staking/types/tx.pb.go @@ -14,6 +14,7 @@ import ( proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "github.com/golang/protobuf/ptypes/timestamp" + _ "github.com/regen-network/cosmos-proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -466,59 +467,61 @@ func init() { func init() { proto.RegisterFile("cosmos/staking/v1beta1/tx.proto", fileDescriptor_0926ef28816b35ab) } var fileDescriptor_0926ef28816b35ab = []byte{ - // 829 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x96, 0xcb, 0x4e, 0xdb, 0x4a, - 0x1c, 0xc6, 0xe3, 0x24, 0xe4, 0x70, 0x06, 0x71, 0x33, 0x17, 0x05, 0x0b, 0xc5, 0xc8, 0x9c, 0x0b, - 0x3a, 0x07, 0xec, 0x03, 0x47, 0x55, 0x25, 0x36, 0x15, 0x21, 0xad, 0x8a, 0xda, 0x6c, 0x0c, 0xed, - 0xa2, 0xaa, 0x14, 0x39, 0xf6, 0xc4, 0xb5, 0x62, 0x7b, 0x82, 0x67, 0x82, 0x88, 0xd4, 0x07, 0xe8, - 0x12, 0xa9, 0xbb, 0xae, 0x78, 0x87, 0xbe, 0x04, 0xab, 0x8a, 0x65, 0xd5, 0x45, 0x5a, 0x81, 0x54, - 0xb1, 0xce, 0x13, 0x54, 0x1e, 0xdb, 0x13, 0xc7, 0xb9, 0x28, 0x42, 0xcd, 0xa6, 0x2b, 0xc8, 0xf8, - 0x37, 0xdf, 0x78, 0xbe, 0xff, 0x37, 0xff, 0x31, 0x10, 0x75, 0x84, 0x1d, 0x84, 0x15, 0x4c, 0xb4, - 0xba, 0xe5, 0x9a, 0xca, 0xd9, 0x6e, 0x15, 0x12, 0x6d, 0x57, 0x21, 0xe7, 0x72, 0xc3, 0x43, 0x04, - 0xf1, 0xab, 0x01, 0x20, 0x87, 0x80, 0x1c, 0x02, 0xc2, 0xb2, 0x89, 0x4c, 0x44, 0x11, 0xc5, 0xff, - 0x2f, 0xa0, 0x85, 0x42, 0x28, 0x57, 0xd5, 0x30, 0x64, 0x5a, 0x3a, 0xb2, 0xdc, 0xf0, 0xb9, 0x68, - 0x22, 0x64, 0xda, 0x50, 0xa1, 0xbf, 0xaa, 0xcd, 0x9a, 0x42, 0x2c, 0x07, 0x62, 0xa2, 0x39, 0x8d, - 0x10, 0xf8, 0x63, 0xc8, 0xfb, 0x44, 0xcb, 0x07, 0xd4, 0x5a, 0x52, 0x46, 0x73, 0x5b, 0xc1, 0x23, - 0xe9, 0x63, 0x16, 0xf0, 0x65, 0x6c, 0x1e, 0x7a, 0x50, 0x23, 0xf0, 0xa5, 0x66, 0x5b, 0x86, 0x46, - 0x90, 0xc7, 0x3f, 0x03, 0x33, 0x06, 0xc4, 0xba, 0x67, 0x35, 0x88, 0x85, 0xdc, 0x3c, 0xb7, 0xc1, - 0x6d, 0xcd, 0xec, 0x6d, 0xca, 0x83, 0x37, 0x27, 0x97, 0xba, 0x68, 0x31, 0x7b, 0xd5, 0x16, 0x53, - 0x6a, 0x7c, 0x36, 0x5f, 0x06, 0x40, 0x47, 0x8e, 0x63, 0x61, 0xec, 0x6b, 0xa5, 0xa9, 0xd6, 0xdf, - 0xc3, 0xb4, 0x0e, 0x19, 0xa9, 0x6a, 0x04, 0xe2, 0x50, 0x2f, 0x26, 0xc0, 0xbf, 0x05, 0x4b, 0x8e, - 0xe5, 0x56, 0x30, 0xb4, 0x6b, 0x15, 0x03, 0xda, 0xd0, 0xd4, 0xe8, 0x3b, 0x66, 0x36, 0xb8, 0xad, - 0xdf, 0x8b, 0xcf, 0x7d, 0xfc, 0x4b, 0x5b, 0xfc, 0xcb, 0xb4, 0xc8, 0x9b, 0x66, 0x55, 0xd6, 0x91, - 0xa3, 0x84, 0x1e, 0x05, 0x7f, 0x76, 0xb0, 0x51, 0x57, 0x48, 0xab, 0x01, 0xb1, 0x7c, 0xe4, 0x92, - 0x4e, 0x5b, 0x14, 0x5a, 0x9a, 0x63, 0xef, 0x4b, 0x03, 0x24, 0x25, 0x75, 0xd1, 0xb1, 0xdc, 0x63, - 0x68, 0xd7, 0x4a, 0x6c, 0x8c, 0x3f, 0x02, 0x8b, 0x21, 0x81, 0xbc, 0x8a, 0x66, 0x18, 0x1e, 0xc4, - 0x38, 0x9f, 0xa5, 0x6b, 0xaf, 0x77, 0xda, 0x62, 0x3e, 0x50, 0xeb, 0x43, 0x24, 0x75, 0x81, 0x8d, - 0x1d, 0x04, 0x43, 0xbe, 0xd4, 0x59, 0xe4, 0x38, 0x93, 0x9a, 0x4a, 0x4a, 0xf5, 0x21, 0x92, 0xba, - 0xc0, 0xc6, 0x22, 0xa9, 0x6d, 0x90, 0x6b, 0x34, 0xab, 0x75, 0xd8, 0xca, 0xe7, 0xa8, 0xbd, 0xcb, - 0x72, 0x50, 0x72, 0x39, 0x2a, 0xb9, 0x7c, 0xe0, 0xb6, 0xd4, 0x90, 0xe1, 0x1f, 0x80, 0xa9, 0x33, - 0xcd, 0x6e, 0xc2, 0xfc, 0x6f, 0x14, 0x5e, 0x8b, 0x6a, 0xe1, 0xc7, 0x30, 0x56, 0x08, 0x2b, 0xaa, - 0x66, 0x40, 0xef, 0x4f, 0xbf, 0xbb, 0x14, 0x53, 0x77, 0x97, 0x62, 0x4a, 0x5a, 0x07, 0x42, 0x7f, - 0x68, 0x54, 0x88, 0x1b, 0xc8, 0xc5, 0x50, 0x7a, 0x9f, 0x01, 0x0b, 0x65, 0x6c, 0x3e, 0x36, 0x2c, - 0x32, 0xa1, 0x44, 0x3d, 0x1a, 0xe4, 0x5c, 0x9a, 0x3a, 0xc7, 0x77, 0xda, 0xe2, 0x5c, 0xe0, 0xdc, - 0x08, 0xbf, 0x1c, 0x30, 0xdf, 0x4d, 0x54, 0xc5, 0xd3, 0x08, 0x0c, 0xf3, 0x53, 0x1a, 0x33, 0x3b, - 0x25, 0xa8, 0x77, 0xda, 0xe2, 0x6a, 0xb0, 0x50, 0x42, 0x4a, 0x52, 0xe7, 0xf4, 0x9e, 0x14, 0xf3, - 0xe7, 0x83, 0x23, 0x1b, 0xc4, 0xe6, 0xe9, 0x04, 0xe3, 0x1a, 0xab, 0x99, 0x00, 0xf2, 0xc9, 0xa2, - 0xb0, 0x8a, 0x7d, 0xe7, 0xc0, 0x4c, 0x19, 0x9b, 0xe1, 0x3c, 0x38, 0x38, 0xe4, 0xdc, 0xcf, 0x0b, - 0x79, 0xfa, 0x5e, 0x21, 0x7f, 0x08, 0x72, 0x9a, 0x83, 0x9a, 0x2e, 0xa1, 0xb5, 0x1a, 0x23, 0xb7, - 0x21, 0x1e, 0x33, 0x61, 0x05, 0x2c, 0xc5, 0xf6, 0xc9, 0xf6, 0xff, 0x29, 0x4d, 0xbb, 0x60, 0x11, - 0x9a, 0x96, 0xab, 0x42, 0x63, 0x02, 0x36, 0x9c, 0x80, 0x95, 0xee, 0x1e, 0xb1, 0xa7, 0x27, 0xac, - 0xd8, 0xe8, 0xb4, 0xc5, 0xf5, 0xa4, 0x15, 0x31, 0x4c, 0x52, 0x97, 0xd8, 0xf8, 0xb1, 0xa7, 0x0f, - 0x54, 0x35, 0x30, 0x61, 0xaa, 0x99, 0xe1, 0xaa, 0x31, 0x2c, 0xae, 0x5a, 0xc2, 0xa4, 0xdf, 0xe7, - 0xec, 0x7d, 0x7d, 0xae, 0xd3, 0x06, 0x91, 0xf0, 0x33, 0xb2, 0x9b, 0x2f, 0xd3, 0xd3, 0xd7, 0xb0, - 0xa1, 0x1f, 0xd1, 0x8a, 0x7f, 0xa7, 0x85, 0xfd, 0x40, 0xe8, 0x6b, 0x5b, 0x27, 0xd1, 0x85, 0x57, - 0x9c, 0xf6, 0x97, 0xba, 0xf8, 0x2a, 0x72, 0xf4, 0x74, 0x85, 0x93, 0xfd, 0xc7, 0xd2, 0x1d, 0x07, - 0x66, 0xcb, 0xd8, 0x7c, 0xe1, 0x1a, 0xbf, 0x7c, 0x7e, 0x6b, 0x60, 0xa5, 0x67, 0xa7, 0x13, 0xb2, - 0x74, 0xef, 0x43, 0x16, 0x64, 0xca, 0xd8, 0xe4, 0x4f, 0xc1, 0x7c, 0xf2, 0xd3, 0xe0, 0x9f, 0x61, - 0x3d, 0xbb, 0xff, 0x46, 0x10, 0xf6, 0xc6, 0x67, 0xd9, 0x4e, 0xea, 0x60, 0xb6, 0xf7, 0xe6, 0xd8, - 0x1a, 0x21, 0xd2, 0x43, 0x0a, 0xff, 0x8d, 0x4b, 0xb2, 0xc5, 0x5e, 0x83, 0x69, 0xd6, 0xf4, 0x36, - 0x47, 0xcc, 0x8e, 0x20, 0xe1, 0xdf, 0x31, 0x20, 0xa6, 0x7e, 0x0a, 0xe6, 0x93, 0x2d, 0x65, 0x94, - 0x7b, 0x09, 0x76, 0xa4, 0x7b, 0xc3, 0x8e, 0x56, 0x15, 0x80, 0xd8, 0x39, 0xf8, 0x73, 0x84, 0x42, - 0x17, 0x13, 0x76, 0xc6, 0xc2, 0xa2, 0x35, 0x8a, 0x4f, 0xae, 0x6e, 0x0a, 0xdc, 0xf5, 0x4d, 0x81, - 0xfb, 0x76, 0x53, 0xe0, 0x2e, 0x6e, 0x0b, 0xa9, 0xeb, 0xdb, 0x42, 0xea, 0xf3, 0x6d, 0x21, 0xf5, - 0x6a, 0x7b, 0xe4, 0x35, 0x76, 0xce, 0x3e, 0x53, 0xe9, 0x85, 0x56, 0xcd, 0xd1, 0x48, 0xfe, 0xff, - 0x23, 0x00, 0x00, 0xff, 0xff, 0x9f, 0x9d, 0x50, 0xee, 0x55, 0x0b, 0x00, 0x00, + // 850 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x96, 0xcb, 0x6e, 0xd3, 0x4c, + 0x1c, 0xc5, 0xe3, 0x24, 0xcd, 0xd7, 0x6f, 0xaa, 0xde, 0xdc, 0x8b, 0x52, 0xab, 0x8a, 0x2b, 0x97, + 0x4b, 0x05, 0xd4, 0xa1, 0x45, 0x08, 0xd4, 0x0d, 0x6a, 0x1a, 0x10, 0x55, 0x89, 0x84, 0xdc, 0xc2, + 0x02, 0x21, 0x45, 0xbe, 0x4c, 0x8c, 0x15, 0xdb, 0x93, 0x7a, 0x26, 0x55, 0x23, 0xf1, 0x00, 0x2c, + 0x2b, 0xb1, 0x63, 0xd5, 0x87, 0x60, 0xcf, 0xb6, 0x62, 0x81, 0xba, 0x44, 0x2c, 0x02, 0x6a, 0x25, + 0xd4, 0x75, 0x9e, 0x00, 0xd9, 0x1e, 0x3b, 0x8e, 0x73, 0x51, 0x54, 0x91, 0x0d, 0xab, 0x36, 0x33, + 0xbf, 0x39, 0x33, 0x73, 0xfe, 0x67, 0x66, 0x0c, 0x78, 0x15, 0x61, 0x0b, 0xe1, 0x3c, 0x26, 0x72, + 0xd5, 0xb0, 0xf5, 0xfc, 0xd1, 0x86, 0x02, 0x89, 0xbc, 0x91, 0x27, 0xc7, 0x62, 0xcd, 0x41, 0x04, + 0xb1, 0x8b, 0x3e, 0x20, 0x52, 0x40, 0xa4, 0x00, 0x37, 0xaf, 0x23, 0x1d, 0x79, 0x48, 0xde, 0xfd, + 0xcf, 0xa7, 0xb9, 0x25, 0x9f, 0x2e, 0xfb, 0x1d, 0x74, 0xa8, 0xdf, 0x95, 0xa3, 0x33, 0x29, 0x32, + 0x86, 0xe1, 0x34, 0x2a, 0x32, 0x6c, 0xda, 0xcf, 0xeb, 0x08, 0xe9, 0x26, 0xcc, 0x7b, 0xbf, 0x94, + 0x7a, 0x25, 0x4f, 0x0c, 0x0b, 0x62, 0x22, 0x5b, 0x35, 0x0a, 0xdc, 0xe8, 0xb3, 0xd4, 0x60, 0x65, + 0x74, 0x05, 0x71, 0x19, 0xd9, 0x6e, 0xf8, 0x5d, 0xc2, 0x97, 0x34, 0x60, 0x4b, 0x58, 0xdf, 0x71, + 0xa0, 0x4c, 0xe0, 0x6b, 0xd9, 0x34, 0x34, 0x99, 0x20, 0x87, 0xdd, 0x03, 0x13, 0x1a, 0xc4, 0xaa, + 0x63, 0xd4, 0x88, 0x81, 0xec, 0x2c, 0xb3, 0xc2, 0xac, 0x4d, 0x6c, 0xae, 0x8a, 0xbd, 0xf7, 0x2d, + 0x16, 0xdb, 0x68, 0x21, 0x7d, 0xd6, 0xe4, 0x13, 0x52, 0x74, 0x34, 0x5b, 0x02, 0x40, 0x45, 0x96, + 0x65, 0x60, 0xec, 0x6a, 0x25, 0x3d, 0xad, 0xdb, 0xfd, 0xb4, 0x76, 0x42, 0x52, 0x92, 0x09, 0xc4, + 0x54, 0x2f, 0x22, 0xc0, 0xbe, 0x07, 0x73, 0x96, 0x61, 0x97, 0x31, 0x34, 0x2b, 0x65, 0x0d, 0x9a, + 0x50, 0x97, 0xbd, 0x35, 0xa6, 0x56, 0x98, 0xb5, 0xff, 0x0b, 0x2f, 0x5c, 0xfc, 0x47, 0x93, 0xbf, + 0xa5, 0x1b, 0xe4, 0x5d, 0x5d, 0x11, 0x55, 0x64, 0x51, 0xcb, 0xe9, 0x9f, 0x75, 0xac, 0x55, 0xf3, + 0xa4, 0x51, 0x83, 0x58, 0xdc, 0xb5, 0x49, 0xab, 0xc9, 0x73, 0x0d, 0xd9, 0x32, 0xb7, 0x84, 0x1e, + 0x92, 0x82, 0x34, 0x6b, 0x19, 0xf6, 0x3e, 0x34, 0x2b, 0xc5, 0xb0, 0x8d, 0xdd, 0x05, 0xb3, 0x94, + 0x40, 0x4e, 0x59, 0xd6, 0x34, 0x07, 0x62, 0x9c, 0x4d, 0x7b, 0x73, 0x2f, 0xb7, 0x9a, 0x7c, 0xd6, + 0x57, 0xeb, 0x42, 0x04, 0x69, 0x26, 0x6c, 0xdb, 0xf6, 0x9b, 0x5c, 0xa9, 0xa3, 0xc0, 0xf1, 0x50, + 0x6a, 0x2c, 0x2e, 0xd5, 0x85, 0x08, 0xd2, 0x4c, 0xd8, 0x16, 0x48, 0x3d, 0x06, 0x99, 0x5a, 0x5d, + 0xa9, 0xc2, 0x46, 0x36, 0xe3, 0xd9, 0x3b, 0x2f, 0xfa, 0x25, 0x17, 0x83, 0x92, 0x8b, 0xdb, 0x76, + 0xa3, 0x00, 0xbe, 0x7e, 0x5e, 0xcf, 0xbc, 0xac, 0x2b, 0x7b, 0xb0, 0x21, 0x51, 0x9e, 0x7d, 0x08, + 0xc6, 0x8e, 0x64, 0xb3, 0x0e, 0xb3, 0xff, 0x79, 0x03, 0x97, 0x82, 0xba, 0xb8, 0x91, 0x8c, 0x14, + 0xc5, 0x08, 0x2a, 0xeb, 0xd3, 0x5b, 0xe3, 0x1f, 0x4e, 0xf9, 0xc4, 0xd5, 0x29, 0x9f, 0x10, 0x96, + 0x01, 0xd7, 0x1d, 0x20, 0x09, 0xe2, 0x1a, 0xb2, 0x31, 0x14, 0x3e, 0xa6, 0xc0, 0x4c, 0x09, 0xeb, + 0x4f, 0x35, 0x83, 0x8c, 0x28, 0x5d, 0x4f, 0x7a, 0xb9, 0x98, 0xf4, 0x5c, 0x64, 0x5b, 0x4d, 0x7e, + 0xca, 0x77, 0x71, 0x80, 0x77, 0x16, 0x98, 0x6e, 0xa7, 0xab, 0xec, 0xc8, 0x04, 0xd2, 0x2c, 0x15, + 0x87, 0xcc, 0x51, 0x11, 0xaa, 0xad, 0x26, 0xbf, 0xe8, 0x4f, 0x14, 0x93, 0x12, 0xa4, 0x29, 0xb5, + 0x23, 0xd1, 0xec, 0x71, 0xef, 0xf8, 0xfa, 0x11, 0x7a, 0x3e, 0xc2, 0xe8, 0x46, 0x6a, 0xc6, 0x81, + 0x6c, 0xbc, 0x28, 0x61, 0xc5, 0x7e, 0x33, 0x60, 0xa2, 0x84, 0x75, 0x3a, 0x0e, 0xf6, 0x0e, 0x3c, + 0xf3, 0xf7, 0x02, 0x9f, 0xbc, 0x56, 0xe0, 0x1f, 0x81, 0x8c, 0x6c, 0xa1, 0xba, 0x4d, 0xbc, 0x5a, + 0x0d, 0x91, 0x5b, 0x8a, 0x47, 0x4c, 0x58, 0x00, 0x73, 0x91, 0x7d, 0x86, 0xfb, 0xff, 0x96, 0xf4, + 0x6e, 0xc4, 0x02, 0xd4, 0x0d, 0x5b, 0x82, 0xda, 0x08, 0x6c, 0x38, 0x00, 0x0b, 0xed, 0x3d, 0x62, + 0x47, 0x8d, 0x59, 0xb1, 0xd2, 0x6a, 0xf2, 0xcb, 0x71, 0x2b, 0x22, 0x98, 0x20, 0xcd, 0x85, 0xed, + 0xfb, 0x8e, 0xda, 0x53, 0x55, 0xc3, 0x24, 0x54, 0x4d, 0xf5, 0x57, 0x8d, 0x60, 0x51, 0xd5, 0x22, + 0x26, 0xdd, 0x3e, 0xa7, 0xaf, 0xeb, 0x73, 0xd5, 0xbb, 0x20, 0x62, 0x7e, 0x06, 0x76, 0xb3, 0x25, + 0xef, 0xf4, 0xd5, 0x4c, 0xe8, 0x46, 0xb4, 0xec, 0xbe, 0x6f, 0xf4, 0x3e, 0xe0, 0xba, 0xae, 0xb0, + 0x83, 0xe0, 0xf1, 0x2b, 0x8c, 0xbb, 0x53, 0x9d, 0xfc, 0xe4, 0x19, 0xef, 0x74, 0xd1, 0xc1, 0x6e, + 0xb7, 0x70, 0xc5, 0x80, 0xc9, 0x12, 0xd6, 0x5f, 0xd9, 0xda, 0x3f, 0x9f, 0xdf, 0x0a, 0x58, 0xe8, + 0xd8, 0xe9, 0x88, 0x2c, 0xdd, 0xfc, 0x94, 0x06, 0xa9, 0x12, 0xd6, 0xd9, 0x43, 0x30, 0x1d, 0xff, + 0x4c, 0xb8, 0xd3, 0xef, 0xce, 0xee, 0x7e, 0x11, 0xb8, 0xcd, 0xe1, 0xd9, 0x70, 0x27, 0x55, 0x30, + 0xd9, 0xf9, 0x72, 0xac, 0x0d, 0x10, 0xe9, 0x20, 0xb9, 0xfb, 0xc3, 0x92, 0xe1, 0x64, 0x6f, 0xc1, + 0x78, 0x78, 0xe9, 0xad, 0x0e, 0x18, 0x1d, 0x40, 0xdc, 0xdd, 0x21, 0xa0, 0x50, 0xfd, 0x10, 0x4c, + 0xc7, 0xaf, 0x94, 0x41, 0xee, 0xc5, 0xd8, 0x81, 0xee, 0xf5, 0x3b, 0x5a, 0x0a, 0x00, 0x91, 0x73, + 0x70, 0x73, 0x80, 0x42, 0x1b, 0xe3, 0xd6, 0x87, 0xc2, 0x82, 0x39, 0x0a, 0xcf, 0xce, 0x2e, 0x72, + 0xcc, 0xf9, 0x45, 0x8e, 0xf9, 0x75, 0x91, 0x63, 0x4e, 0x2e, 0x73, 0x89, 0xf3, 0xcb, 0x5c, 0xe2, + 0xfb, 0x65, 0x2e, 0xf1, 0xe6, 0xde, 0xc0, 0x67, 0xec, 0x38, 0xfc, 0x64, 0xf5, 0x1e, 0x34, 0x25, + 0xe3, 0x45, 0xf2, 0xc1, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3e, 0xb3, 0xef, 0xab, 0x7c, 0x0b, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index 3bac25fe79..8b5cfcdf14 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -14,6 +14,7 @@ import ( "gopkg.in/yaml.v2" "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -39,15 +40,15 @@ var _ ValidatorI = Validator{} // NewValidator constructs a new Validator //nolint:interfacer -func NewValidator(operator sdk.ValAddress, pubKey crypto.PubKey, description Description) Validator { - var pkStr string - if pubKey != nil { - pkStr = sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, pubKey) +func NewValidator(operator sdk.ValAddress, pubKey crypto.PubKey, description Description) (Validator, error) { + pkAny, err := codectypes.PackAny(pubKey) + if err != nil { + return Validator{}, err } return Validator{ OperatorAddress: operator.String(), - ConsensusPubkey: pkStr, + ConsensusPubkey: pkAny, Jailed: false, Status: Unbonded, Tokens: sdk.ZeroInt(), @@ -57,7 +58,7 @@ func NewValidator(operator sdk.ValAddress, pubKey crypto.PubKey, description Des UnbondingTime: time.Unix(0, 0).UTC(), Commission: NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), MinSelfDelegation: sdk.OneInt(), - } + }, nil } // String implements the Stringer interface for a Validator object. @@ -87,13 +88,17 @@ func (v Validators) ToSDKValidators() (validators []ValidatorI) { } // ToTmValidators casts all validators to the corresponding tendermint type. -func (v Validators) ToTmValidators() []*tmtypes.Validator { +func (v Validators) ToTmValidators() ([]*tmtypes.Validator, error) { validators := make([]*tmtypes.Validator, len(v)) + var err error for i, val := range v { - validators[i] = val.ToTmValidator() + validators[i], err = val.ToTmValidator() + if err != nil { + return nil, err + } } - return validators + return validators, nil } // Sort Validators sorts validator array in ascending operator address order @@ -118,9 +123,19 @@ func (v Validators) Swap(i, j int) { v[j] = it } +// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces +func (v Validators) UnpackInterfaces(c codectypes.AnyUnpacker) error { + for i := range v { + if err := v[i].UnpackInterfaces(c); err != nil { + return err + } + } + return nil +} + // return the redelegation -func MustMarshalValidator(cdc codec.BinaryMarshaler, validator Validator) []byte { - return cdc.MustMarshalBinaryBare(&validator) +func MustMarshalValidator(cdc codec.BinaryMarshaler, validator *Validator) []byte { + return cdc.MustMarshalBinaryBare(validator) } // unmarshal a redelegation from a store value @@ -233,7 +248,11 @@ func (d Description) EnsureLength() (Description, error) { // ABCIValidatorUpdate returns an abci.ValidatorUpdate from a staking validator type // with the full validator power func (v Validator) ABCIValidatorUpdate() abci.ValidatorUpdate { - pk, err := encoding.PubKeyToProto(v.GetConsPubKey()) + consPk, err := v.TmConsPubKey() + if err != nil { + panic(err) + } + pk, err := encoding.PubKeyToProto(consPk) if err != nil { panic(err) } @@ -247,7 +266,11 @@ func (v Validator) ABCIValidatorUpdate() abci.ValidatorUpdate { // ABCIValidatorUpdateZero returns an abci.ValidatorUpdate from a staking validator type // with zero power used for validator updates. func (v Validator) ABCIValidatorUpdateZero() abci.ValidatorUpdate { - pk, err := encoding.PubKeyToProto(v.GetConsPubKey()) + consPk, err := v.TmConsPubKey() + if err != nil { + panic(err) + } + pk, err := encoding.PubKeyToProto(consPk) if err != nil { panic(err) } @@ -259,8 +282,12 @@ func (v Validator) ABCIValidatorUpdateZero() abci.ValidatorUpdate { } // ToTmValidator casts an SDK validator to a tendermint type Validator. -func (v Validator) ToTmValidator() *tmtypes.Validator { - return tmtypes.NewValidator(v.GetConsPubKey(), v.ConsensusPower()) +func (v Validator) ToTmValidator() (*tmtypes.Validator, error) { + consPk, err := v.TmConsPubKey() + if err != nil { + return nil, err + } + return tmtypes.NewValidator(consPk, v.ConsensusPower()), nil } // SetInitialCommission attempts to set a validator's initial commission. An @@ -415,14 +442,24 @@ func (v Validator) RemoveDelShares(delShares sdk.Dec) (Validator, sdk.Int) { // MinEqual defines a more minimum set of equality conditions when comparing two // validators. -func (v Validator) MinEqual(other Validator) bool { - return v.ConsensusPubkey == other.ConsensusPubkey && - (v.OperatorAddress == other.OperatorAddress) && +func (v *Validator) MinEqual(other *Validator) bool { + return v.OperatorAddress == other.OperatorAddress && v.Status == other.Status && v.Tokens.Equal(other.Tokens) && v.DelegatorShares.Equal(other.DelegatorShares) && - v.Description == other.Description && - v.Commission.Equal(other.Commission) + v.Description.Equal(other.Description) && + v.Commission.Equal(other.Commission) && + v.Jailed == other.Jailed && + v.MinSelfDelegation.Equal(other.MinSelfDelegation) && + v.ConsensusPubkey.Equal(other.ConsensusPubkey) + +} + +// Equal checks if the receiver equals the parameter +func (v *Validator) Equal(v2 *Validator) bool { + return v.MinEqual(v2) && + v.UnbondingHeight == v2.UnbondingHeight && + v.UnbondingTime.Equal(v2.UnbondingTime) } func (v Validator) IsJailed() bool { return v.Jailed } @@ -438,24 +475,43 @@ func (v Validator) GetOperator() sdk.ValAddress { } return addr } -func (v Validator) GetConsPubKey() crypto.PubKey { + +// TmConsPubKey casts Validator.ConsensusPubkey to crypto.PubKey +func (v Validator) TmConsPubKey() (crypto.PubKey, error) { + pk, ok := v.ConsensusPubkey.GetCachedValue().(cryptotypes.PubKey) + if !ok { + return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "Expecting crypto.PubKey, got %T", pk) + } + // The way things are refactored now, v.ConsensusPubkey is sometimes a TM // ed25519 pubkey, sometimes our own ed25519 pubkey. This is very ugly and // inconsistent. // Luckily, here we coerce it into a TM ed25519 pubkey always, as this // pubkey will be passed into TM (eg calling encoding.PubKeyToProto). - pk := sdk.MustGetPubKeyFromBech32(sdk.Bech32PubKeyTypeConsPub, v.ConsensusPubkey) - if intoTmPk, ok := pk.(cryptotypes.IntoTmPubKey); ok { - return intoTmPk.AsTmPubKey() + return intoTmPk.AsTmPubKey(), nil } - - return pk + return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidPubKey, "Logic error: ConsensusPubkey must be an SDK key and SDK PubKey types must be convertible to tendermint PubKey; got: %T", pk) } -func (v Validator) GetConsAddr() sdk.ConsAddress { return sdk.ConsAddress(v.GetConsPubKey().Address()) } + +// GetConsAddr extracts Consensus key address +func (v Validator) GetConsAddr() (sdk.ConsAddress, error) { + pk, err := v.TmConsPubKey() + if err != nil { + return sdk.ConsAddress{}, err + } + return sdk.ConsAddress(pk.Address()), nil +} + func (v Validator) GetTokens() sdk.Int { return v.Tokens } func (v Validator) GetBondedTokens() sdk.Int { return v.BondedTokens() } func (v Validator) GetConsensusPower() int64 { return v.ConsensusPower() } func (v Validator) GetCommission() sdk.Dec { return v.Commission.Rate } func (v Validator) GetMinSelfDelegation() sdk.Int { return v.MinSelfDelegation } func (v Validator) GetDelegatorShares() sdk.Dec { return v.DelegatorShares } + +// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces +func (v Validator) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + var pk crypto.PubKey + return unpacker.UnpackAny(v.ConsensusPubkey, &pk) +} diff --git a/x/staking/types/validator_test.go b/x/staking/types/validator_test.go index 00ad07ba58..2e9d961169 100644 --- a/x/staking/types/validator_test.go +++ b/x/staking/types/validator_test.go @@ -2,12 +2,12 @@ package types import ( "math/rand" - "reflect" "sort" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/encoding" tmtypes "github.com/tendermint/tendermint/types" @@ -18,16 +18,12 @@ import ( ) func TestValidatorTestEquivalent(t *testing.T) { - val1 := NewValidator(valAddr1, pk1, Description{}) - val2 := NewValidator(valAddr1, pk1, Description{}) + val1 := newValidator(t, valAddr1, pk1) + val2 := newValidator(t, valAddr1, pk1) + require.Equal(t, val1.String(), val2.String()) - ok := val1.String() == val2.String() - require.True(t, ok) - - val2 = NewValidator(valAddr2, pk2, Description{}) - - ok = val1.String() == val2.String() - require.False(t, ok) + val2 = newValidator(t, valAddr2, pk2) + require.NotEqual(t, val1.String(), val2.String()) } func TestUpdateDescription(t *testing.T) { @@ -60,33 +56,29 @@ func TestUpdateDescription(t *testing.T) { } func TestABCIValidatorUpdate(t *testing.T) { - validator := NewValidator(valAddr1, pk1, Description{}) - + validator := newValidator(t, valAddr1, pk1) abciVal := validator.ABCIValidatorUpdate() - pk, err := encoding.PubKeyToProto(validator.GetConsPubKey()) + consPk, err := validator.TmConsPubKey() + require.NoError(t, err) + pk, err := encoding.PubKeyToProto(consPk) require.NoError(t, err) require.Equal(t, pk, abciVal.PubKey) require.Equal(t, validator.BondedTokens().Int64(), abciVal.Power) } func TestABCIValidatorUpdateZero(t *testing.T) { - validator := NewValidator(valAddr1, pk1, Description{}) - + validator := newValidator(t, valAddr1, pk1) abciVal := validator.ABCIValidatorUpdateZero() - pk, err := encoding.PubKeyToProto(validator.GetConsPubKey()) + consPk, err := validator.TmConsPubKey() + require.NoError(t, err) + pk, err := encoding.PubKeyToProto(consPk) require.NoError(t, err) require.Equal(t, pk, abciVal.PubKey) require.Equal(t, int64(0), abciVal.Power) } func TestShareTokens(t *testing.T) { - validator := Validator{ - OperatorAddress: valAddr1.String(), - ConsensusPubkey: sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, pk1), - Status: Bonded, - Tokens: sdk.NewInt(100), - DelegatorShares: sdk.NewDec(100), - } + validator := mkValidator(100, sdk.NewDec(100)) assert.True(sdk.DecEq(t, sdk.NewDec(50), validator.TokensFromShares(sdk.NewDec(50)))) validator.Tokens = sdk.NewInt(50) @@ -95,16 +87,7 @@ func TestShareTokens(t *testing.T) { } func TestRemoveTokens(t *testing.T) { - valPubKey := pk1 - valAddr := sdk.ValAddress(valPubKey.Address().Bytes()) - - validator := Validator{ - OperatorAddress: valAddr.String(), - ConsensusPubkey: sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, valPubKey), - Status: Bonded, - Tokens: sdk.NewInt(100), - DelegatorShares: sdk.NewDec(100), - } + validator := mkValidator(100, sdk.NewDec(100)) // remove tokens and test check everything validator = validator.RemoveTokens(sdk.NewInt(10)) @@ -120,7 +103,7 @@ func TestRemoveTokens(t *testing.T) { } func TestAddTokensValidatorBonded(t *testing.T) { - validator := NewValidator(sdk.ValAddress(pk1.Address().Bytes()), pk1, Description{}) + validator := newValidator(t, valAddr1, pk1) validator = validator.UpdateStatus(Bonded) validator, delShares := validator.AddTokensFromDel(sdk.NewInt(10)) @@ -130,7 +113,7 @@ func TestAddTokensValidatorBonded(t *testing.T) { } func TestAddTokensValidatorUnbonding(t *testing.T) { - validator := NewValidator(sdk.ValAddress(pk1.Address().Bytes()), pk1, Description{}) + validator := newValidator(t, valAddr1, pk1) validator = validator.UpdateStatus(Unbonding) validator, delShares := validator.AddTokensFromDel(sdk.NewInt(10)) @@ -142,7 +125,7 @@ func TestAddTokensValidatorUnbonding(t *testing.T) { func TestAddTokensValidatorUnbonded(t *testing.T) { - validator := NewValidator(sdk.ValAddress(pk1.Address().Bytes()), pk1, Description{}) + validator := newValidator(t, valAddr1, pk1) validator = validator.UpdateStatus(Unbonded) validator, delShares := validator.AddTokensFromDel(sdk.NewInt(10)) @@ -155,8 +138,8 @@ func TestAddTokensValidatorUnbonded(t *testing.T) { // TODO refactor to make simpler like the AddToken tests above func TestRemoveDelShares(t *testing.T) { valA := Validator{ - OperatorAddress: sdk.ValAddress(pk1.Address().Bytes()).String(), - ConsensusPubkey: sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, pk1), + OperatorAddress: valAddr1.String(), + ConsensusPubkey: pk1Any, Status: Bonded, Tokens: sdk.NewInt(100), DelegatorShares: sdk.NewDec(100), @@ -169,24 +152,14 @@ func TestRemoveDelShares(t *testing.T) { require.Equal(t, int64(90), valB.BondedTokens().Int64()) // specific case from random tests - poolTokens := sdk.NewInt(5102) - delShares := sdk.NewDec(115) - validator := Validator{ - OperatorAddress: sdk.ValAddress(pk1.Address().Bytes()).String(), - ConsensusPubkey: sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, pk1), - Status: Bonded, - Tokens: poolTokens, - DelegatorShares: delShares, - } - - shares := sdk.NewDec(29) - _, tokens := validator.RemoveDelShares(shares) + validator := mkValidator(5102, sdk.NewDec(115)) + _, tokens := validator.RemoveDelShares(sdk.NewDec(29)) require.True(sdk.IntEq(t, sdk.NewInt(1286), tokens)) } func TestAddTokensFromDel(t *testing.T) { - validator := NewValidator(sdk.ValAddress(pk1.Address().Bytes()), pk1, Description{}) + validator := newValidator(t, valAddr1, pk1) validator, shares := validator.AddTokensFromDel(sdk.NewInt(6)) require.True(sdk.DecEq(t, sdk.NewDec(6), shares)) @@ -200,7 +173,7 @@ func TestAddTokensFromDel(t *testing.T) { } func TestUpdateStatus(t *testing.T) { - validator := NewValidator(sdk.ValAddress(pk1.Address().Bytes()), pk1, Description{}) + validator := newValidator(t, valAddr1, pk1) validator, _ = validator.AddTokensFromDel(sdk.NewInt(100)) require.Equal(t, Unbonded, validator.Status) require.Equal(t, int64(100), validator.Tokens.Int64()) @@ -220,14 +193,7 @@ func TestUpdateStatus(t *testing.T) { func TestPossibleOverflow(t *testing.T) { delShares := sdk.NewDec(391432570689183511).Quo(sdk.NewDec(40113011844664)) - validator := Validator{ - OperatorAddress: sdk.ValAddress(pk1.Address().Bytes()).String(), - ConsensusPubkey: sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, pk1), - Status: Bonded, - Tokens: sdk.NewInt(2159), - DelegatorShares: delShares, - } - + validator := mkValidator(2159, delShares) newValidator, _ := validator.AddTokensFromDel(sdk.NewInt(71)) require.False(t, newValidator.DelegatorShares.IsNegative()) @@ -235,19 +201,19 @@ func TestPossibleOverflow(t *testing.T) { } func TestValidatorMarshalUnmarshalJSON(t *testing.T) { - validator := NewValidator(valAddr1, pk1, Description{}) + validator := newValidator(t, valAddr1, pk1) js, err := legacy.Cdc.MarshalJSON(validator) require.NoError(t, err) require.NotEmpty(t, js) - require.Contains(t, string(js), "\"consensus_pubkey\":\"cosmosvalconspu") + require.Contains(t, string(js), "\"consensus_pubkey\":{\"type\":\"cosmos/PubKeyEd25519\"") got := &Validator{} err = legacy.Cdc.UnmarshalJSON(js, got) assert.NoError(t, err) - assert.Equal(t, validator, *got) + assert.True(t, validator.Equal(got)) } func TestValidatorSetInitialCommission(t *testing.T) { - val := NewValidator(valAddr1, pk1, Description{}) + val := newValidator(t, valAddr1, pk1) testCases := []struct { validator Validator commission Commission @@ -288,7 +254,7 @@ func TestValidatorsSortDeterminism(t *testing.T) { // Create random validator slice for i := range vals { pk := ed25519.GenPrivKey().PubKey() - vals[i] = NewValidator(sdk.ValAddress(pk.Address()), pk, Description{}) + vals[i] = newValidator(t, sdk.ValAddress(pk.Address()), pk) } // Save sorted copy @@ -304,7 +270,7 @@ func TestValidatorsSortDeterminism(t *testing.T) { }) Validators(vals).Sort() - require.True(t, reflect.DeepEqual(sortedVals, vals), "Validator sort returned different slices") + require.Equal(t, sortedVals, vals, "Validator sort returned different slices") } } @@ -314,14 +280,15 @@ func TestValidatorToTm(t *testing.T) { for i := range vals { pk := ed25519.GenPrivKey().PubKey() - val := NewValidator(sdk.ValAddress(pk.Address()), pk, Description{}) + val := newValidator(t, sdk.ValAddress(pk.Address()), pk) val.Status = Bonded val.Tokens = sdk.NewInt(rand.Int63()) vals[i] = val expected[i] = tmtypes.NewValidator(pk.(cryptotypes.IntoTmPubKey).AsTmPubKey(), val.ConsensusPower()) } - - require.Equal(t, expected, vals.ToTmValidators()) + vs, err := vals.ToTmValidators() + require.NoError(t, err) + require.Equal(t, expected, vs) } func TestBondStatus(t *testing.T) { @@ -334,3 +301,20 @@ func TestBondStatus(t *testing.T) { require.Equal(t, BondStatusBonded, Bonded.String()) require.Equal(t, BondStatusUnbonding, Unbonding.String()) } + +func mkValidator(tokens int64, shares sdk.Dec) Validator { + return Validator{ + OperatorAddress: valAddr1.String(), + ConsensusPubkey: pk1Any, + Status: Bonded, + Tokens: sdk.NewInt(tokens), + DelegatorShares: shares, + } +} + +// Creates a new validators and asserts the error check. +func newValidator(t *testing.T, operator sdk.ValAddress, pubKey crypto.PubKey) Validator { + v, err := NewValidator(operator, pubKey, Description{}) + require.NoError(t, err) + return v +} diff --git a/x/upgrade/abci_test.go b/x/upgrade/abci_test.go index 26c534a4d2..48ad99301e 100644 --- a/x/upgrade/abci_test.go +++ b/x/upgrade/abci_test.go @@ -236,17 +236,17 @@ func TestPlanStringer(t *testing.T) { require.Equal(t, `Upgrade Plan Name: test Time: 2020-01-01T00:00:00Z - Info: + Info: . Upgraded IBC Client: no upgraded client provided`, types.Plan{Name: "test", Time: ti}.String()) require.Equal(t, `Upgrade Plan Name: test Height: 100 - Info: + Info: . Upgraded IBC Client: no upgraded client provided`, types.Plan{Name: "test", Height: 100}.String()) require.Equal(t, fmt.Sprintf(`Upgrade Plan Name: test Height: 100 - Info: + Info: . Upgraded IBC Client: %s`, clientState), types.Plan{Name: "test", Height: 100, UpgradedClientState: cs}.String()) } diff --git a/x/upgrade/types/plan.go b/x/upgrade/types/plan.go index c930c2539c..e853ac6797 100644 --- a/x/upgrade/types/plan.go +++ b/x/upgrade/types/plan.go @@ -28,7 +28,7 @@ func (p Plan) String() string { return fmt.Sprintf(`Upgrade Plan Name: %s %s - Info: %s + Info: %s. Upgraded IBC Client: %s`, p.Name, dueUp, p.Info, upgradedClientStr) } diff --git a/x/upgrade/types/plan_test.go b/x/upgrade/types/plan_test.go index ffa2734cbf..881a1a3229 100644 --- a/x/upgrade/types/plan_test.go +++ b/x/upgrade/types/plan_test.go @@ -38,7 +38,7 @@ func TestPlanString(t *testing.T) { Info: "https://foo.bar", Time: mustParseTime("2019-07-08T11:33:55Z"), }, - expect: "Upgrade Plan\n Name: due_time\n Time: 2019-07-08T11:33:55Z\n Info: https://foo.bar\n Upgraded IBC Client: no upgraded client provided", + expect: "Upgrade Plan\n Name: due_time\n Time: 2019-07-08T11:33:55Z\n Info: https://foo.bar.\n Upgraded IBC Client: no upgraded client provided", }, "with height": { p: Plan{ @@ -46,7 +46,7 @@ func TestPlanString(t *testing.T) { Info: "https://foo.bar/baz", Height: 7890, }, - expect: "Upgrade Plan\n Name: by height\n Height: 7890\n Info: https://foo.bar/baz\n Upgraded IBC Client: no upgraded client provided", + expect: "Upgrade Plan\n Name: by height\n Height: 7890\n Info: https://foo.bar/baz.\n Upgraded IBC Client: no upgraded client provided", }, "with IBC client": { p: Plan{ @@ -55,14 +55,14 @@ func TestPlanString(t *testing.T) { Height: 7890, UpgradedClientState: cs, }, - expect: fmt.Sprintf("Upgrade Plan\n Name: by height\n Height: 7890\n Info: https://foo.bar/baz\n Upgraded IBC Client: %s", &ibctmtypes.ClientState{}), + expect: fmt.Sprintf("Upgrade Plan\n Name: by height\n Height: 7890\n Info: https://foo.bar/baz.\n Upgraded IBC Client: %s", &ibctmtypes.ClientState{}), }, "neither": { p: Plan{ Name: "almost-empty", }, - expect: "Upgrade Plan\n Name: almost-empty\n Height: 0\n Info: \n Upgraded IBC Client: no upgraded client provided", + expect: "Upgrade Plan\n Name: almost-empty\n Height: 0\n Info: .\n Upgraded IBC Client: no upgraded client provided", }, }