diff --git a/.gitignore b/.gitignore index 1ce4f5cfa123..1adf64472c42 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ dist tools-stamp buf-stamp artifacts +tools/ # Data - ideally these don't exist baseapp/data/* diff --git a/.golangci.yml b/.golangci.yml index 08df5b3583e6..a2155d717662 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -19,7 +19,7 @@ linters: - misspell - nakedret - nolintlint - - staticcheck + # - staticcheck disabling due to the sheer number of "this package has been moved to it's own module" errors TODO: reenable - stylecheck - typecheck - unconvert diff --git a/CHANGELOG.md b/CHANGELOG.md index 5df103bc33e4..55d39bcd17b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,7 +37,48 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] -## [v0.46.11](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.11) - 2022-03-03 +## [v0.46.13](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.13) - 2023-06-08 + +## Features + +* (snapshots) [#16060](https://github.com/cosmos/cosmos-sdk/pull/16060) Support saving and restoring snapshot locally. +* (baseapp) [#16290](https://github.com/cosmos/cosmos-sdk/pull/16290) Add circuit breaker setter in baseapp. +* (x/group) [#16191](https://github.com/cosmos/cosmos-sdk/pull/16191) Add EventProposalPruned event to group module whenever a proposal is pruned. + +### Improvements + +* (deps) [#15973](https://github.com/cosmos/cosmos-sdk/pull/15973) Bump CometBFT to [v0.34.28](https://github.com/cometbft/cometbft/blob/v0.34.28/CHANGELOG.md#v03428). +* (store) [#15683](https://github.com/cosmos/cosmos-sdk/pull/15683) `rootmulti.Store.CacheMultiStoreWithVersion` now can handle loading archival states that don't persist any of the module stores the current state has. +* (simapp) [#15903](https://github.com/cosmos/cosmos-sdk/pull/15903) Add `AppStateFnWithExtendedCbs` with moduleStateCb callback function to allow access moduleState. Note, this function is present in `simtestutil` from `v0.47.2+`. +* (gov) [#15979](https://github.com/cosmos/cosmos-sdk/pull/15979) Improve gov error message when failing to convert v1 proposal to v1beta1. +* (server) [#16061](https://github.com/cosmos/cosmos-sdk/pull/16061) Add Comet bootstrap command. +* (store) [#16067](https://github.com/cosmos/cosmos-sdk/pull/16067) Add local snapshots management commands. +* (baseapp) [#16193](https://github.com/cosmos/cosmos-sdk/pull/16193) Add `Close` method to `BaseApp` for custom app to cleanup resource in graceful shutdown. + +### Bug Fixes + +* Fix [barberry](https://forum.cosmos.network/t/cosmos-sdk-security-advisory-barberry/10825) security vulnerability. +* (cli) [#16312](https://github.com/cosmos/cosmos-sdk/pull/16312) Allow any addresses in `client.ValidatePromptAddress`. +* (store/iavl) [#15717](https://github.com/cosmos/cosmos-sdk/pull/15717) Upstream error on empty version (this change was present on all version but v0.46). + +## [v0.46.12](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.12) - 2023-04-04 + +### Features + +* (x/groups) [#14879](https://github.com/cosmos/cosmos-sdk/pull/14879) Add `Query/Groups` query to get all the groups. + +### Improvements + +* (simapp) [#15305](https://github.com/cosmos/cosmos-sdk/pull/15305) Add `AppStateFnWithExtendedCb` with callback function to extend rawState and `AppStateRandomizedFnWithState` with extra genesisState argument which is the genesis state of the app. +* (x/distribution) [#15462](https://github.com/cosmos/cosmos-sdk/pull/15462) Add delegator address to the event for withdrawing delegation rewards +* [#14019](https://github.com/cosmos/cosmos-sdk/issues/14019) Remove the interface casting to allow other implementations of a `CommitMultiStore`. + +### Bug Fixes + +* (x/auth/vesting) [#15383](https://github.com/cosmos/cosmos-sdk/pull/15383) Add extra checks when creating a periodic vesting account. +* (x/gov) [#13051](https://github.com/cosmos/cosmos-sdk/pull/13051) In SubmitPropsal, when a legacy msg fails it's handler call, wrap the error as ErrInvalidProposalContent (instead of ErrNoProposalHandlerExists). + +## [v0.46.11](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.11) - 2023-03-03 ### Improvements @@ -49,13 +90,13 @@ Ref: https://keepachangelog.com/en/1.0.0/ * [#15243](https://github.com/cosmos/cosmos-sdk/pull/15243) `LatestBlockResponse` & `BlockByHeightResponse` types' field `sdk_block` was incorrectly cast `proposer_address` bytes to validator operator address, now to consensus address. -## [v0.46.10](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.10) - 2022-02-16 +## [v0.46.10](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.10) - 2023-02-16 ### Improvements * (cli) [#14953](https://github.com/cosmos/cosmos-sdk/pull/14953) Enable profiling block replay during abci handshake with `--cpu-profile`. -## [v0.46.9](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.9) - 2022-02-07 +## [v0.46.9](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.9) - 2023-02-07 ### Improvements @@ -232,7 +273,7 @@ replace github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8 ### API Breaking Changes -* (cli) [#13089](https://github.com/cosmos/cosmos-sdk/pull/13089) Fix rollback command don't actually delete multistore versions, added method `RollbackToVersion` to interface `CommitMultiStore` and added method `CommitMultiStore` to `Application` interface. +* (cli) [#13089](https://github.com/cosmos/cosmos-sdk/pull/13089) Fix rollback command don't actually delete multistore versions, added method `RollbackToVersion` to interface `CommitMultiStore` and added method `CommitMultiStore` to `Application` interface. * (cli) [#13089](https://github.com/cosmos/cosmos-sdk/pull/13089) `NewRollbackCmd` now takes an `appCreator types.AppCreator`. ### Features @@ -251,7 +292,7 @@ replace github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8 * (x/group) [#13214](https://github.com/cosmos/cosmos-sdk/pull/13214) Add `withdraw-proposal` command to group module's CLI transaction commands. * (x/auth) [#13048](https://github.com/cosmos/cosmos-sdk/pull/13048) Add handling of AccountNumberStoreKeyPrefix to the simulation decoder. * (simapp) [#13108](https://github.com/cosmos/cosmos-sdk/pull/13108) Call `SetIAVLCacheSize` with the configured value in simapp. -* [#13318](https://github.com/cosmos/cosmos-sdk/pull/13318) Keep the balance query endpoint compatible with legacy blocks. +* [#13318](https://github.com/cosmos/cosmos-sdk/pull/13318) Keep the balance query endpoint compatible with legacy blocks. * [#13321](https://github.com/cosmos/cosmos-sdk/pull/13321) Add flag to disable fast node migration and usage. ### Bug Fixes @@ -260,15 +301,15 @@ replace github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8 * (x/auth) [#13200](https://github.com/cosmos/cosmos-sdk/pull/13200) Fix wrong sequences in `sign-batch`. * (export) [#13029](https://github.com/cosmos/cosmos-sdk/pull/13029) Fix exporting the blockParams regression. * [#13046](https://github.com/cosmos/cosmos-sdk/pull/13046) Fix missing return statement in BaseApp.Query. -* (store) [#13336](https://github.com/cosmos/cosmos-sdk/pull/13336) Call streaming listeners for deliver tx event, it was removed accidentally, backport #13334. -* (grpc) [#13417](https://github.com/cosmos/cosmos-sdk/pull/13417) fix grpc query panic that could crash the node (backport #13352). +* (store) [#13336](https://github.com/cosmos/cosmos-sdk/pull/13336) Call streaming listeners for deliver tx event, it was removed accidentally, backport #13334. +* (grpc) [#13417](https://github.com/cosmos/cosmos-sdk/pull/13417) fix grpc query panic that could crash the node (backport #13352). * (grpc) [#13418](https://github.com/cosmos/cosmos-sdk/pull/13418) Add close for grpc only mode. ## [v0.46.1](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.1) - 2022-08-24 ### Improvements -* [#12953](https://github.com/cosmos/cosmos-sdk/pull/12953) Change the default priority mechanism to be based on gas price. +* [#12953](https://github.com/cosmos/cosmos-sdk/pull/12953) Change the default priority mechanism to be based on gas price. * [#12981](https://github.com/cosmos/cosmos-sdk/pull/12981) Return proper error when parsing telemetry configuration. * [#12969](https://github.com/cosmos/cosmos-sdk/pull/12969) Bump Tendermint to `v0.34.21` and IAVL to `v0.19.1`. * [#12885](https://github.com/cosmos/cosmos-sdk/pull/12885) Amortize cost of processing cache KV store. @@ -281,7 +322,7 @@ replace github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8 ### Bug Fixes * (x/group) [#12888](https://github.com/cosmos/cosmos-sdk/pull/12888) Fix event propagation to the current context of `x/group` message execution `[]sdk.Result`. -* (x/upgrade) [#12906](https://github.com/cosmos/cosmos-sdk/pull/12906) Fix upgrade failure by moving downgrade verification logic after store migration. +* (x/upgrade) [#12906](https://github.com/cosmos/cosmos-sdk/pull/12906) Fix upgrade failure by moving downgrade verification logic after store migration. * (store) [#12945](https://github.com/cosmos/cosmos-sdk/pull/12945) Fix nil end semantics in store/cachekv/iterator when iterating a dirty cache. ## [v0.46.0](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.0) - 2022-07-26 @@ -473,7 +514,7 @@ replace github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8 * (x/auth) [\#11482](https://github.com/cosmos/cosmos-sdk/pull/11482) Improve panic message when attempting to register a method handler for a message that does not implement sdk.Msg * (x/staking) [\#11596](https://github.com/cosmos/cosmos-sdk/pull/11596) Add (re)delegation getters * (errors) [\#11960](https://github.com/cosmos/cosmos-sdk/pull/11960) Removed 'redacted' error message from defaultErrEncoder -* (ante) [#12013](https://github.com/cosmos/cosmos-sdk/pull/12013) Index ante events for failed tx. +* (ante) [#12013](https://github.com/cosmos/cosmos-sdk/pull/12013) Index ante events for failed tx. * [#12668](https://github.com/cosmos/cosmos-sdk/pull/12668) Add `authz_msg_index` event attribute to message events emitted when executing via `MsgExec` through `x/authz`. * [#12626](https://github.com/cosmos/cosmos-sdk/pull/12626) Upgrade IAVL to v0.19.0 with fast index and error propagation. NOTE: first start will take a while to propagate into new model. * [#12649](https://github.com/cosmos/cosmos-sdk/pull/12649) Bump tendermint to v0.34.20. @@ -576,7 +617,7 @@ replace github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8 * (x/upgrade) [\#10189](https://github.com/cosmos/cosmos-sdk/issues/10189) Removed potential sources of non-determinism in upgrades * [\#10422](https://github.com/cosmos/cosmos-sdk/pull/10422) and [\#10529](https://github.com/cosmos/cosmos-sdk/pull/10529) Add `MinCommissionRate` param to `x/staking` module. * (x/gov) [#10763](https://github.com/cosmos/cosmos-sdk/pull/10763) modify the fields in `TallyParams` to use `string` instead of `bytes` -* [#10770](https://github.com/cosmos/cosmos-sdk/pull/10770) revert tx when block gas limit exceeded +* [#10770](https://github.com/cosmos/cosmos-sdk/pull/10770) revert tx when block gas limit exceeded * (x/gov) [\#10868](https://github.com/cosmos/cosmos-sdk/pull/10868) Bump gov to v1beta2. Both v1beta1 and v1beta2 queries and Msgs are accepted. * [\#11011](https://github.com/cosmos/cosmos-sdk/pull/11011) Remove burning of deposits when qourum is not reached on a governance proposal and when the deposit is not fully met. * [\#11019](https://github.com/cosmos/cosmos-sdk/pull/11019) Add `MsgCreatePermanentLockedAccount` and CLI method for creating permanent locked account diff --git a/Makefile b/Makefile index 1da985ede0a4..08750a539aa3 100644 --- a/Makefile +++ b/Makefile @@ -15,9 +15,6 @@ DOCKER := $(shell which docker) DOCKER_BUF := $(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace bufbuild/buf:1.7.0 PROJECT_NAME = $(shell git remote get-url origin | xargs basename -s .git) DOCS_DOMAIN=docs.cosmos.network -# RocksDB is a native dependency, so we don't assume the library is installed. -# Instead, it must be explicitly enabled and we warn when it is not. -ENABLE_ROCKSDB ?= false export GO111MODULE = on @@ -63,33 +60,23 @@ ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=sim \ -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ -X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \ -X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags_comma_sep)" \ - -X github.com/tendermint/tendermint/version.TMCoreSemVer=$(TMVERSION) - -ifeq ($(ENABLE_ROCKSDB),true) - BUILD_TAGS += rocksdb_build - test_tags += rocksdb_build -else - $(warning RocksDB support is disabled; to build and test with RocksDB support, set ENABLE_ROCKSDB=true) -endif + -X github.com/tendermint/tendermint/version.TMCoreSemVer=$(TMVERSION) # DB backend selection ifeq (cleveldb,$(findstring cleveldb,$(COSMOS_BUILD_OPTIONS))) build_tags += gcc endif ifeq (badgerdb,$(findstring badgerdb,$(COSMOS_BUILD_OPTIONS))) - BUILD_TAGS += badgerdb + build_tags += badgerdb endif # handle rocksdb ifeq (rocksdb,$(findstring rocksdb,$(COSMOS_BUILD_OPTIONS))) - ifneq ($(ENABLE_ROCKSDB),true) - $(error Cannot use RocksDB backend unless ENABLE_ROCKSDB=true) - endif CGO_ENABLED=1 - BUILD_TAGS += rocksdb + build_tags += rocksdb endif # handle boltdb ifeq (boltdb,$(findstring boltdb,$(COSMOS_BUILD_OPTIONS))) - BUILD_TAGS += boltdb + build_tags += boltdb endif ifeq (,$(findstring nostrip,$(COSMOS_BUILD_OPTIONS))) @@ -403,6 +390,7 @@ proto-gen: @echo "Generating Protobuf files" @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoGen}$$"; then docker start -a $(containerProtoGen); else docker run --name $(containerProtoGen) -v $(CURDIR):/workspace --workdir /workspace $(protoImageName) \ sh ./scripts/protocgen.sh; fi + @go mod tidy # This generates the SDK's custom wrapper for google.protobuf.Any. It should only be run manually when needed proto-gen-any: @@ -420,14 +408,13 @@ proto-format: @if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerProtoFmt}$$"; then docker start -a $(containerProtoFmt); else docker run --name $(containerProtoFmt) -v $(CURDIR):/workspace --workdir /workspace tendermintdev/docker-build-proto \ find ./ -not -path "./third_party/*" -name "*.proto" -exec clang-format -i {} \; ; fi - proto-lint: @$(DOCKER_BUF) lint --error-format=json proto-check-breaking: @$(DOCKER_BUF) breaking --against $(HTTPS_GIT)#branch=main -TM_URL = https://raw.githubusercontent.com/cometbft/cometbft/v0.34.27/proto/tendermint +TM_URL = https://raw.githubusercontent.com/cometbft/cometbft/v0.34.28/proto/tendermint TM_CRYPTO_TYPES = proto/tendermint/crypto TM_ABCI_TYPES = proto/tendermint/abci diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 408f5ab5eab8..27610b6ec13a 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,24 +1,21 @@ -# Cosmos SDK v0.46.11 Release Notes +# Cosmos SDK v0.46.13 Release Notes -The SDK sets its minimum version to Go 1.19. This is not because the SDK uses new Go 1.19 functionalities, but to signal that we recommend chains to upgrade to Go 1.19 — Go 1.18 is not supported by the Go Team anymore. -Note, that SDK recommends chains to use the same Go version across all of their network. -We recommend, as well, chains to perform a **coordinated upgrade** when migrating from Go 1.18 to Go 1.19. +This release includes few improvements and bug fixes. +Notably, the [barberry security fix](https://forum.cosmos.network/t/cosmos-sdk-security-advisory-barberry/10825). All chains using Cosmos SDK v0.46.0 and above must upgrade to `v0.46.13` **immediately**. A chain is safe as soon as **33%+1** of the voting power has upgraded. Coordinate with your validators to upgrade as soon as possible. -A critical vulnerability has been fixed in the group module. For safety, `v0.46.5` and `v0.46.6` are retracted, even though chains not using the group module are not affected. When using the group module, please upgrade immediately to `v0.46.7`. +Additionally, it includes new commands for snapshots management and bootstrapping from a local snapshot (add `snapshot.Cmd(appCreator)` to the chain root command for using it). -An issue has been discovered in the gov module's votes migration. It does not impact proposals and votes tallying, but the gRPC queries on votes are incorrect. This issue is fixed in `v0.46.7`, however: -- if your chain is already on v0.46 using `<= v0.46.6`, a **coordinated upgrade** to v0.46.7 is required. You can use the helper function `govv046.Migrate_V046_6_To_V046_7` for migrating a chain **already on v0.46 with versions <=v0.46.6** to the latest v0.46.7 correct state. -- if your chain is on a previous version <= v0.45, then simply use v0.46.7 when upgrading to v0.46. +Did you know Cosmos SDK Twilight (a.k.a v0.47) has been released? Upgrade easily by reading the [upgrading guide](https://github.com/cosmos/cosmos-sdk/blob/release/v0.47.x/UPGRADING.md#v047x). -**NOTE**: The changes mentioned in `v0.46.3` are no longer required. The following replace directive can be removed from the chains. +Ensure you have the following replaces in the `go.mod` of your application: ```go -# Can be deleted from go.mod -replace github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 +// use cometbft +replace github.com/tendermint/tendermint => github.com/cometbft/cometbft v0.34.28 +// replace broken goleveldb +replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ``` -Instead, `github.com/confio/ics23/go` must be **bumped to `v0.9.0`**. - Please see the [CHANGELOG](https://github.com/cosmos/cosmos-sdk/blob/release/v0.46.x/CHANGELOG.md) for an exhaustive list of changes. -Full Commit History: https://github.com/cosmos/cosmos-sdk/compare/v0.46.6...v0.46.7 +**Full Commit History**: https://github.com/cosmos/cosmos-sdk/compare/v0.46.12...v0.46.13 diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 7c37cda765e4..5ae369b415e6 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -1,6 +1,7 @@ package baseapp import ( + "errors" "fmt" "strings" @@ -14,7 +15,6 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/snapshots" "github.com/cosmos/cosmos-sdk/store" - "github.com/cosmos/cosmos-sdk/store/rootmulti" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -229,6 +229,15 @@ func (app *BaseApp) SetMsgServiceRouter(msgServiceRouter *MsgServiceRouter) { app.msgServiceRouter = msgServiceRouter } +// SetCircuitBreaker sets the circuit breaker for the BaseApp. +// The circuit breaker is checked on every message execution to verify if a transaction should be executed or not. +func (app *BaseApp) SetCircuitBreaker(cb CircuitBreaker) { + if app.msgServiceRouter == nil { + panic("cannot set circuit breaker with no msg service router set") + } + app.msgServiceRouter.SetCircuit(cb) +} + // MountStores mounts all IAVL or DB stores to the provided keys in the BaseApp // multistore. func (app *BaseApp) MountStores(keys ...storetypes.StoreKey) { @@ -352,11 +361,11 @@ func (app *BaseApp) Init() error { app.setCheckState(tmproto.Header{}) app.Seal() - rms, ok := app.cms.(*rootmulti.Store) - if !ok { - return fmt.Errorf("invalid commit multi-store; expected %T, got: %T", &rootmulti.Store{}, app.cms) + if app.cms == nil { + return errors.New("commit multi-store must not be nil") } - return rms.GetPruning().Validate() + + return app.cms.GetPruning().Validate() } func (app *BaseApp) setMinGasPrices(gasPrices sdk.DecCoins) { @@ -852,3 +861,8 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s func makeABCIData(msgResponses []*codectypes.Any) ([]byte, error) { return proto.Marshal(&sdk.TxMsgData{MsgResponses: msgResponses}) } + +// Close is called in start cmd to gracefully cleanup resources. +func (app *BaseApp) Close() error { + return nil +} diff --git a/baseapp/circuit.go b/baseapp/circuit.go new file mode 100644 index 000000000000..3db0bc1bdcda --- /dev/null +++ b/baseapp/circuit.go @@ -0,0 +1,8 @@ +package baseapp + +import "context" + +// CircuitBreaker is an interface that defines the methods for a circuit breaker. +type CircuitBreaker interface { + IsAllowed(ctx context.Context, typeURL string) (bool, error) +} diff --git a/baseapp/msg_service_router.go b/baseapp/msg_service_router.go index b42fc282ec31..b70864ddd287 100644 --- a/baseapp/msg_service_router.go +++ b/baseapp/msg_service_router.go @@ -17,6 +17,7 @@ import ( type MsgServiceRouter struct { interfaceRegistry codectypes.InterfaceRegistry routes map[string]MsgServiceHandler + circuitBreaker CircuitBreaker } var _ gogogrpc.Server = &MsgServiceRouter{} @@ -31,6 +32,10 @@ func NewMsgServiceRouter() *MsgServiceRouter { // MsgServiceHandler defines a function type which handles Msg service message. type MsgServiceHandler = func(ctx sdk.Context, req sdk.Msg) (*sdk.Result, error) +func (msr *MsgServiceRouter) SetCircuit(cb CircuitBreaker) { + msr.circuitBreaker = cb +} + // Handler returns the MsgServiceHandler for a given msg or nil if not found. func (msr *MsgServiceRouter) Handler(msg sdk.Msg) MsgServiceHandler { return msr.routes[sdk.MsgTypeURL(msg)] @@ -121,6 +126,20 @@ func (msr *MsgServiceRouter) RegisterService(sd *grpc.ServiceDesc, handler inter return nil, err } } + + if msr.circuitBreaker != nil { + msgURL := sdk.MsgTypeURL(req) + + isAllowed, err := msr.circuitBreaker.IsAllowed(ctx, msgURL) + if err != nil { + return nil, err + } + + if !isAllowed { + return nil, fmt.Errorf("circuit breaker disables execution of this message: %s", msgURL) + } + } + // Call the method handler from the service description with the handler object. // We don't do any decoding here because the decoding was already done. res, err := methodHandler(handler, sdk.WrapSDKContext(ctx), noopDecoder, interceptor) diff --git a/client/prompts.go b/client/prompt_validation.go similarity index 81% rename from client/prompts.go rename to client/prompt_validation.go index 050d806c49a8..d3e3e2321726 100644 --- a/client/prompts.go +++ b/client/prompt_validation.go @@ -29,11 +29,22 @@ func ValidatePromptURL(input string) error { // ValidatePromptAddress validates that the input is a valid Bech32 address. func ValidatePromptAddress(input string) error { - if _, err := sdk.AccAddressFromBech32(input); err != nil { - return fmt.Errorf("invalid address: %w", err) + _, err := sdk.AccAddressFromBech32(input) + if err == nil { + return nil } - return nil + _, err = sdk.ValAddressFromBech32(input) + if err == nil { + return nil + } + + _, err = sdk.ConsAddressFromBech32(input) + if err == nil { + return nil + } + + return fmt.Errorf("invalid address: %w", err) } // ValidatePromptYesNo validates that the input is valid sdk.COins diff --git a/client/prompt_validation_test.go b/client/prompt_validation_test.go new file mode 100644 index 000000000000..eba30c21c441 --- /dev/null +++ b/client/prompt_validation_test.go @@ -0,0 +1,38 @@ +package client_test + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/stretchr/testify/require" +) + +func TestValidatePromptNotEmpty(t *testing.T) { + require := require.New(t) + + require.NoError(client.ValidatePromptNotEmpty("foo")) + require.ErrorContains(client.ValidatePromptNotEmpty(""), "input cannot be empty") +} + +func TestValidatePromptURL(t *testing.T) { + require := require.New(t) + + require.NoError(client.ValidatePromptURL("https://example.com")) + require.ErrorContains(client.ValidatePromptURL("foo"), "invalid URL") +} + +func TestValidatePromptAddress(t *testing.T) { + require := require.New(t) + + require.NoError(client.ValidatePromptAddress("cosmos1huydeevpz37sd9snkgul6070mstupukw00xkw9")) + require.NoError(client.ValidatePromptAddress("cosmosvaloper1sjllsnramtg3ewxqwwrwjxfgc4n4ef9u2lcnj0")) + require.NoError(client.ValidatePromptAddress("cosmosvalcons1ntk8eualewuprz0gamh8hnvcem2nrcdsgz563h")) + require.ErrorContains(client.ValidatePromptAddress("foo"), "invalid address") +} + +func TestValidatePromptCoins(t *testing.T) { + require := require.New(t) + + require.NoError(client.ValidatePromptCoins("100stake")) + require.ErrorContains(client.ValidatePromptCoins("foo"), "invalid coins") +} diff --git a/client/snapshot/cmd.go b/client/snapshot/cmd.go new file mode 100644 index 000000000000..14388bc8d05e --- /dev/null +++ b/client/snapshot/cmd.go @@ -0,0 +1,23 @@ +package snapshot + +import ( + servertypes "github.com/cosmos/cosmos-sdk/server/types" + "github.com/spf13/cobra" +) + +// Cmd returns the snapshots group command +func Cmd(appCreator servertypes.AppCreator) *cobra.Command { + cmd := &cobra.Command{ + Use: "snapshots", + Short: "Manage local snapshots", + } + cmd.AddCommand( + ListSnapshotsCmd, + RestoreSnapshotCmd(appCreator), + ExportSnapshotCmd(appCreator), + DumpArchiveCmd(), + LoadArchiveCmd(), + DeleteSnapshotCmd(), + ) + return cmd +} diff --git a/client/snapshot/delete.go b/client/snapshot/delete.go new file mode 100644 index 000000000000..0259032e1134 --- /dev/null +++ b/client/snapshot/delete.go @@ -0,0 +1,35 @@ +package snapshot + +import ( + "strconv" + + "github.com/cosmos/cosmos-sdk/server" + "github.com/spf13/cobra" +) + +func DeleteSnapshotCmd() *cobra.Command { + return &cobra.Command{ + Use: "delete ", + Short: "Delete a local snapshot", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := server.GetServerContextFromCmd(cmd) + + height, err := strconv.ParseUint(args[0], 10, 64) + if err != nil { + return err + } + format, err := strconv.ParseUint(args[1], 10, 32) + if err != nil { + return err + } + + snapshotStore, err := server.GetSnapshotStore(ctx.Viper) + if err != nil { + return err + } + + return snapshotStore.Delete(height, uint32(format)) + }, + } +} diff --git a/client/snapshot/dump.go b/client/snapshot/dump.go new file mode 100644 index 000000000000..72dadbc57254 --- /dev/null +++ b/client/snapshot/dump.go @@ -0,0 +1,125 @@ +package snapshot + +import ( + "archive/tar" + "compress/gzip" + "errors" + "fmt" + "io" + "os" + "strconv" + + "github.com/cosmos/cosmos-sdk/server" + "github.com/spf13/cobra" +) + +// DumpArchiveCmd returns a command to dump the snapshot as portable archive format +func DumpArchiveCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "dump ", + Short: "Dump the snapshot as portable archive format", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := server.GetServerContextFromCmd(cmd) + snapshotStore, err := server.GetSnapshotStore(ctx.Viper) + if err != nil { + return err + } + + output, err := cmd.Flags().GetString("output") + if err != nil { + return err + } + + height, err := strconv.ParseUint(args[0], 10, 64) + if err != nil { + return err + } + format, err := strconv.ParseUint(args[1], 10, 32) + if err != nil { + return err + } + + if output == "" { + output = fmt.Sprintf("%d-%d.tar.gz", height, format) + } + + snapshot, err := snapshotStore.Get(height, uint32(format)) + if err != nil { + return err + } + + if snapshot == nil { + return errors.New("snapshot doesn't exist") + } + + bz, err := snapshot.Marshal() + if err != nil { + return err + } + + fp, err := os.Create(output) + if err != nil { + return err + } + defer fp.Close() + + // since the chunk files are already compressed, we just use fastest compression here + gzipWriter, err := gzip.NewWriterLevel(fp, gzip.BestSpeed) + if err != nil { + return err + } + tarWriter := tar.NewWriter(gzipWriter) + if err := tarWriter.WriteHeader(&tar.Header{ + Name: SnapshotFileName, + Mode: 0o644, + Size: int64(len(bz)), + }); err != nil { + return fmt.Errorf("failed to write snapshot header to tar: %w", err) + } + if _, err := tarWriter.Write(bz); err != nil { + return fmt.Errorf("failed to write snapshot to tar: %w", err) + } + + for i := uint32(0); i < snapshot.Chunks; i++ { + path := snapshotStore.PathChunk(height, uint32(format), i) + file, err := os.Open(path) + if err != nil { + return fmt.Errorf("failed to open chunk file %s: %w", path, err) + } + defer file.Close() + + st, err := file.Stat() + if err != nil { + return fmt.Errorf("failed to stat chunk file %s: %w", path, err) + } + + if err := tarWriter.WriteHeader(&tar.Header{ + Name: strconv.FormatUint(uint64(i), 10), + Mode: 0o644, + Size: st.Size(), + }); err != nil { + return fmt.Errorf("failed to write chunk header to tar: %w", err) + } + + if _, err := io.Copy(tarWriter, file); err != nil { + return fmt.Errorf("failed to write chunk to tar: %w", err) + } + } + + if err := tarWriter.Close(); err != nil { + return fmt.Errorf("failed to close tar writer: %w", err) + } + + if err := gzipWriter.Close(); err != nil { + return fmt.Errorf("failed to close gzip writer: %w", err) + } + + return fp.Close() + }, + } + + cmd.Flags().StringP("output", "o", "", "output file") + + return cmd +} diff --git a/client/snapshot/export.go b/client/snapshot/export.go new file mode 100644 index 000000000000..cb6ebc1417a4 --- /dev/null +++ b/client/snapshot/export.go @@ -0,0 +1,51 @@ +package snapshot + +import ( + "github.com/cosmos/cosmos-sdk/server" + servertypes "github.com/cosmos/cosmos-sdk/server/types" + "github.com/spf13/cobra" +) + +// ExportSnapshotCmd returns a command to take a snapshot of the application state +func ExportSnapshotCmd(appCreator servertypes.AppCreator) *cobra.Command { + cmd := &cobra.Command{ + Use: "export", + Short: "Export app state to snapshot store", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + ctx := server.GetServerContextFromCmd(cmd) + + height, err := cmd.Flags().GetInt64("height") + if err != nil { + return err + } + + home := ctx.Config.RootDir + db, err := openDB(home, server.GetAppDBBackend(ctx.Viper)) + if err != nil { + return err + } + + app := appCreator(ctx.Logger, db, nil, ctx.Viper) + + if height == 0 { + height = app.CommitMultiStore().LastCommitID().Version + } + + cmd.Printf("Exporting snapshot for height %d\n", height) + + sm := app.SnapshotManager() + snapshot, err := sm.Create(uint64(height)) + if err != nil { + return err + } + + cmd.Printf("Snapshot created at height %d, format %d, chunks %d\n", snapshot.Height, snapshot.Format, snapshot.Chunks) + return nil + }, + } + + cmd.Flags().Int64("height", 0, "Height to export, default to latest state height") + + return cmd +} diff --git a/client/snapshot/list.go b/client/snapshot/list.go new file mode 100644 index 000000000000..78612bf916ee --- /dev/null +++ b/client/snapshot/list.go @@ -0,0 +1,30 @@ +package snapshot + +import ( + "fmt" + + "github.com/cosmos/cosmos-sdk/server" + "github.com/spf13/cobra" +) + +// ListSnapshotsCmd returns the command to list local snapshots +var ListSnapshotsCmd = &cobra.Command{ + Use: "list", + Short: "List local snapshots", + RunE: func(cmd *cobra.Command, args []string) error { + ctx := server.GetServerContextFromCmd(cmd) + snapshotStore, err := server.GetSnapshotStore(ctx.Viper) + if err != nil { + return err + } + snapshots, err := snapshotStore.List() + if err != nil { + return fmt.Errorf("failed to list snapshots: %w", err) + } + for _, snapshot := range snapshots { + cmd.Println("height:", snapshot.Height, "format:", snapshot.Format, "chunks:", snapshot.Chunks) + } + + return nil + }, +} diff --git a/client/snapshot/load.go b/client/snapshot/load.go new file mode 100644 index 000000000000..7834aa21e2e7 --- /dev/null +++ b/client/snapshot/load.go @@ -0,0 +1,113 @@ +package snapshot + +import ( + "archive/tar" + "bytes" + "compress/gzip" + "fmt" + "io" + "os" + "reflect" + "strconv" + + "github.com/cosmos/cosmos-sdk/server" + "github.com/spf13/cobra" + + snapshottypes "github.com/cosmos/cosmos-sdk/snapshots/types" +) + +const SnapshotFileName = "_snapshot" + +// LoadArchiveCmd load a portable archive format snapshot into snapshot store +func LoadArchiveCmd() *cobra.Command { + return &cobra.Command{ + Use: "load ", + Short: "Load a snapshot archive file (.tar.gz) into snapshot store", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := server.GetServerContextFromCmd(cmd) + snapshotStore, err := server.GetSnapshotStore(ctx.Viper) + if err != nil { + return err + } + + path := args[0] + fp, err := os.Open(path) + if err != nil { + return fmt.Errorf("failed to open archive file: %w", err) + } + reader, err := gzip.NewReader(fp) + if err != nil { + return fmt.Errorf("failed to create gzip reader: %w", err) + } + + var snapshot snapshottypes.Snapshot + tr := tar.NewReader(reader) + if err != nil { + return fmt.Errorf("failed to create tar reader: %w", err) + } + + hdr, err := tr.Next() + if err != nil { + return fmt.Errorf("failed to read snapshot file header: %w", err) + } + if hdr.Name != SnapshotFileName { + return fmt.Errorf("invalid archive, expect file: snapshot, got: %s", hdr.Name) + } + bz, err := io.ReadAll(tr) + if err != nil { + return fmt.Errorf("failed to read snapshot file: %w", err) + } + if err := snapshot.Unmarshal(bz); err != nil { + return fmt.Errorf("failed to unmarshal snapshot: %w", err) + } + + // make sure the channel is unbuffered, because the tar reader can't do concurrency + chunks := make(chan io.ReadCloser) + quitChan := make(chan *snapshottypes.Snapshot) + go func() { + defer close(quitChan) + + savedSnapshot, err := snapshotStore.Save(snapshot.Height, snapshot.Format, chunks) + if err != nil { + cmd.Println("failed to save snapshot", err) + return + } + quitChan <- savedSnapshot + }() + + for i := uint32(0); i < snapshot.Chunks; i++ { + hdr, err = tr.Next() + if err != nil { + if err == io.EOF { + break + } + return err + } + + if hdr.Name != strconv.FormatInt(int64(i), 10) { + return fmt.Errorf("invalid archive, expect file: %d, got: %s", i, hdr.Name) + } + + bz, err := io.ReadAll(tr) + if err != nil { + return fmt.Errorf("failed to read chunk file: %w", err) + } + chunks <- io.NopCloser(bytes.NewReader(bz)) + } + close(chunks) + + savedSnapshot := <-quitChan + if savedSnapshot == nil { + return fmt.Errorf("failed to save snapshot") + } + + if !reflect.DeepEqual(&snapshot, savedSnapshot) { + _ = snapshotStore.Delete(snapshot.Height, snapshot.Format) + return fmt.Errorf("invalid archive, the saved snapshot is not equal to the original one") + } + + return nil + }, + } +} diff --git a/client/snapshot/restore.go b/client/snapshot/restore.go new file mode 100644 index 000000000000..7ab46dfe6b9e --- /dev/null +++ b/client/snapshot/restore.go @@ -0,0 +1,50 @@ +package snapshot + +import ( + "path/filepath" + "strconv" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/server" + servertypes "github.com/cosmos/cosmos-sdk/server/types" + dbm "github.com/tendermint/tm-db" +) + +// RestoreSnapshotCmd returns a command to restore a snapshot +func RestoreSnapshotCmd(appCreator servertypes.AppCreator) *cobra.Command { + cmd := &cobra.Command{ + Use: "restore ", + Short: "Restore app state from local snapshot", + Long: "Restore app state from local snapshot", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := server.GetServerContextFromCmd(cmd) + + height, err := strconv.ParseUint(args[0], 10, 64) + if err != nil { + return err + } + format, err := strconv.ParseUint(args[1], 10, 32) + if err != nil { + return err + } + + home := ctx.Config.RootDir + db, err := openDB(home, server.GetAppDBBackend(ctx.Viper)) + if err != nil { + return err + } + app := appCreator(ctx.Logger, db, nil, ctx.Viper) + + sm := app.SnapshotManager() + return sm.RestoreLocalSnapshot(height, uint32(format)) + }, + } + return cmd +} + +func openDB(rootDir string, backendType dbm.BackendType) (dbm.DB, error) { + dataDir := filepath.Join(rootDir, "data") + return dbm.NewDB("application", backendType, dataDir) +} diff --git a/contrib/rosetta/rosetta-ci/data.tar.gz b/contrib/rosetta/rosetta-ci/data.tar.gz index 7ed311434592..ad152760a2e7 100644 Binary files a/contrib/rosetta/rosetta-ci/data.tar.gz and b/contrib/rosetta/rosetta-ci/data.tar.gz differ diff --git a/crypto/codec/proto.go b/crypto/codec/proto.go index 1340dab03de5..45cd5b4c35df 100644 --- a/crypto/codec/proto.go +++ b/crypto/codec/proto.go @@ -20,6 +20,6 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { var priv *cryptotypes.PrivKey registry.RegisterInterface("cosmos.crypto.PrivKey", priv) registry.RegisterImplementations(priv, &secp256k1.PrivKey{}) - registry.RegisterImplementations(priv, &ed25519.PrivKey{}) //nolint + registry.RegisterImplementations(priv, &ed25519.PrivKey{}) secp256r1.RegisterInterfaces(registry) } diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 57edfc9cc14c..5456c1eb95f8 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -30,10 +30,6 @@ module.exports = { index: "cosmos_network_vue" }, versions: [ - { - "label": "v0.44", - "key": "v0.44" - }, { "label": "v0.45", "key": "v0.45" @@ -42,6 +38,10 @@ module.exports = { "label": "v0.46", "key": "v0.46" }, + { + "label": "v0.47", + "key": "v0.47" + }, { "label": "main", "key": "main" diff --git a/docs/CosmWasm/README.md b/docs/CosmWasm/README.md index 409f31ebda4c..b6a14810b38c 100644 --- a/docs/CosmWasm/README.md +++ b/docs/CosmWasm/README.md @@ -10,4 +10,4 @@ parent: >CosmWasm is written as a module that can plug into the Cosmos SDK. This means that anyone currently building a blockchain using the Cosmos SDK can quickly and easily add CosmWasm smart contracting support to their chain, without adjusting existing logic. -Read more about writing smart contracts with CosmWasm at their [documentation site](https://docs.cosmwasm.com/docs/1.0/), or visit [the repository](https://github.com/CosmWasm/cosmwasm). +Read more about writing smart contracts with CosmWasm at their [documentation site](https://book.cosmwasm.com/), or visit [the repository](https://github.com/CosmWasm/cosmwasm). diff --git a/docs/run-node/run-node.md b/docs/run-node/run-node.md index 2233f63aa128..19f2aa6bcf90 100644 --- a/docs/run-node/run-node.md +++ b/docs/run-node/run-node.md @@ -125,6 +125,43 @@ The previous command allow you to run a single node. This is enough for the next The naive way would be to run the same commands again in separate terminal windows. This is possible, however in the Cosmos SDK, we leverage the power of [Docker Compose](https://docs.docker.com/compose/) to run a localnet. If you need inspiration on how to set up your own localnet with Docker Compose, you can have a look at the Cosmos SDK's [`docker-compose.yml`](https://github.com/cosmos/cosmos-sdk/blob/v0.46.0-rc1/docker-compose.yml). -## Next {hide} +## State Sync -Read about the [Interacting with your Node](./interact-node.md) {hide} +State sync is the act in which a node syncs the latest or close to the latest state of a blockchain. This is useful for users who don't want to sync all the blocks in history. Read more in [CometBFT documentation](https://docs.cometbft.com/v0.34/core/state-sync). + +State sync works thanks to snapshots. Read how the SDK handles snapshots [here](https://github.com/cosmos/cosmos-sdk/blob/825245d/store/snapshots/README.md). + +### Local State Sync + +Local state sync work similar to normal state sync except that it works off a local snapshot of state instead of one provided via the p2p network. The steps to start local state sync are similar to normal state sync with a few different designs. + +1. As mentioned in https://docs.cometbft.com/v0.34/core/state-sync, one must set a height and hash in the config.toml along with a few rpc servers (the afromentioned link has instructions on how to do this). +2. Run ` ` to restore a local snapshot (note: first load it from a file with the *load* command). +3. Bootsrapping Comet state in order to start the node after the snapshot has been ingested. This can be done with the bootstrap command ` tendermint bootstrap-state` + +### Snapshots Commands + +The Cosmos SDK provides commands for managing snapshots. +These commands can be added in an app with the following snippet in `cmd//root.go`: + +```go +import ( + "github.com/cosmos/cosmos-sdk/client/snapshot" +) + +func initRootCmd(/* ... */) { + // ... + rootCmd.AddCommand( + snapshot.Cmd(appCreator), + ) +} +``` + +Then following commands are available at ` snapshots [command]`: + +* **list**: list local snapshots +* **load**: Load a snapshot archive file into snapshot store +* **restore**: Restore app state from local snapshot +* **export**: Export app state to snapshot store +* **dump**: Dump the snapshot as portable archive format +* **delete**: Delete a local snapshot diff --git a/go.mod b/go.mod index e3a1b8be0038..c06a457788ce 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ module github.com/cosmos/cosmos-sdk require ( cosmossdk.io/errors v1.0.0-beta.7 - cosmossdk.io/math v1.0.0-beta.3 + cosmossdk.io/math v1.0.0-rc.0 github.com/99designs/keyring v1.2.1 github.com/armon/go-metrics v0.4.1 github.com/bgentry/speakeasy v0.1.0 @@ -17,14 +17,14 @@ require ( github.com/cosmos/cosmos-proto v1.0.0-alpha7 github.com/cosmos/cosmos-sdk/db v1.0.0-beta.1 github.com/cosmos/go-bip39 v1.0.0 - github.com/cosmos/gogoproto v1.4.2 - github.com/cosmos/iavl v0.19.5 + github.com/cosmos/gogoproto v1.4.10 + github.com/cosmos/iavl v0.19.6 github.com/cosmos/ledger-cosmos-go v0.12.2 github.com/ethereum/go-ethereum v1.10.17 github.com/gogo/gateway v1.1.0 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 - github.com/golang/protobuf v1.5.2 + github.com/golang/protobuf v1.5.3 github.com/google/uuid v1.3.0 github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 @@ -34,43 +34,43 @@ require ( github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 github.com/improbable-eng/grpc-web v0.15.0 - github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b + github.com/jhump/protoreflect v1.15.1 github.com/magiconair/properties v1.8.6 github.com/manifoldco/promptui v0.9.0 - github.com/mattn/go-isatty v0.0.16 + github.com/mattn/go-isatty v0.0.18 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.14.0 - github.com/prometheus/common v0.37.0 + github.com/prometheus/common v0.42.0 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 - github.com/rs/zerolog v1.27.0 + github.com/rs/zerolog v1.29.1 github.com/spf13/cast v1.5.0 github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.13.0 - github.com/stretchr/testify v1.8.1 + github.com/stretchr/testify v1.8.2 github.com/tendermint/go-amino v0.16.0 - github.com/tendermint/tendermint v0.34.24 + github.com/tendermint/tendermint v0.34.28 github.com/tendermint/tm-db v0.6.7 github.com/tidwall/btree v1.5.0 - golang.org/x/crypto v0.5.0 - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e - google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6 - google.golang.org/grpc v1.52.0 - google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 + golang.org/x/crypto v0.7.0 + golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0 + google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 + google.golang.org/grpc v1.55.0 + google.golang.org/protobuf v1.30.0 pgregory.net/rapid v0.4.7 sigs.k8s.io/yaml v1.3.0 ) require ( - cloud.google.com/go v0.105.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.7.0 // indirect - cloud.google.com/go/storage v1.27.0 // indirect + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute v1.18.0 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/iam v0.12.0 // indirect + cloud.google.com/go/storage v1.28.1 // indirect filippo.io/edwards25519 v1.0.0-rc.1 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect - github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect + github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/Workiva/go-datastructures v1.0.53 // indirect github.com/aws/aws-sdk-go v1.40.45 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -78,13 +78,13 @@ require ( github.com/celestiaorg/nmt v0.16.0 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cometbft/cometbft-db v0.7.0 // indirect github.com/cosmos/gorocksdb v1.2.0 // indirect github.com/creachadair/taskgroup v0.3.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect @@ -93,19 +93,19 @@ require ( github.com/dustin/go-humanize v1.0.0 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/golang/glog v1.0.0 // indirect + github.com/golang/glog v1.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/orderedcode v0.0.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.7.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect @@ -120,43 +120,45 @@ require ( github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.15.11 // indirect - github.com/lib/pq v1.10.6 // indirect + github.com/klauspost/compress v1.16.0 // indirect + github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-testing-interface v1.0.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect + github.com/onsi/gomega v1.20.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect + github.com/pelletier/go-toml/v2 v2.0.7 // indirect + github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/rs/cors v1.8.2 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/spf13/afero v1.8.2 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.1 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/ulikunitz/xz v0.5.8 // indirect github.com/zondax/hid v0.9.1 // indirect github.com/zondax/ledger-go v0.14.1 // indirect go.etcd.io/bbolt v1.3.6 // indirect - go.opencensus.io v0.23.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + go.opencensus.io v0.24.0 // indirect + golang.org/x/net v0.9.0 // indirect + golang.org/x/oauth2 v0.6.0 // indirect + golang.org/x/sys v0.7.0 // indirect + golang.org/x/term v0.7.0 // indirect + golang.org/x/text v0.9.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.102.0 // indirect + google.golang.org/api v0.110.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect @@ -170,15 +172,20 @@ replace ( // dgrijalva/jwt-go is deprecated and doesn't receive security updates. // TODO: remove it: https://github.com/cosmos/cosmos-sdk/issues/13134 github.com/dgrijalva/jwt-go => github.com/golang-jwt/jwt/v4 v4.4.2 - // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. + // Fix upstream GHSA-h395-qcrw-5vmq and GHSA-3vp4-m3rf-835h vulnerabilities. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 - github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 + github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.0 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/jhump/protoreflect => github.com/jhump/protoreflect v1.9.0 - github.com/tendermint/tendermint => github.com/celestiaorg/celestia-core v1.19.0-tm-v0.34.27 + // replace broken goleveldb. + github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 + // use cometbft + github.com/tendermint/tendermint => github.com/celestiaorg/celestia-core v1.22.0-tm-v0.34.28 ) retract ( + // revert fix https://github.com/cosmos/cosmos-sdk/pull/16331 + v0.46.12 // subject to a bug in the group module and gov module migration [v0.46.5, v0.46.6] // subject to the dragonberry vulnerability diff --git a/go.sum b/go.sum index f9fa228bb470..831c7c12a2fa 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.105.0 h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -28,15 +28,15 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.7.0 h1:k4MuwOsS7zGJJ+QfZ5vBK8SgHBAvYN/23BWsiihJ1vs= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= +cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -47,13 +47,13 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcbgI= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= -cosmossdk.io/math v1.0.0-beta.3 h1:TbZxSopz2LqjJ7aXYfn7nJSb8vNaBklW6BLpcei1qwM= -cosmossdk.io/math v1.0.0-beta.3/go.mod h1:3LYasri3Zna4XpbrTNdKsWmD5fHHkaNAod/mNT9XdE4= +cosmossdk.io/math v1.0.0-rc.0 h1:ml46ukocrAAoBpYKMidF0R2tQJ1Uxfns0yH8wqgMAFc= +cosmossdk.io/math v1.0.0-rc.0/go.mod h1:Ygz4wBHrgc7g0N+8+MrnTfS9LLn9aaTGa9hKopuym5k= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= @@ -67,8 +67,8 @@ github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= +github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= +github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= @@ -158,10 +158,13 @@ github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA= +github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/celestiaorg/celestia-core v1.19.0-tm-v0.34.27 h1:GLdDJRu1fRSMft4IqQz4/x/H1U3eN2TFlYbAycbSiN4= -github.com/celestiaorg/celestia-core v1.19.0-tm-v0.34.27/go.mod h1:8PbX2OIPehldawXWAzNWPxBPnfFtcYtjHecE45b2Beg= +github.com/celestiaorg/celestia-core v1.22.0-tm-v0.34.28 h1:idHJK9i4WCkYOf5PXVWZbOs8pWkCiHHQGI4MZr0iMtQ= +github.com/celestiaorg/celestia-core v1.22.0-tm-v0.34.28/go.mod h1:LOxHW9nA++/9U8TgvTyKo9TO3F09sWv8asKQs00m73U= github.com/celestiaorg/nmt v0.16.0 h1:4CX6d1Uwf1C+tGcAWskPve0HCDTnI4Ey8ffjiDwcGH0= github.com/celestiaorg/nmt v0.16.0/go.mod h1:GfwIvQPhUakn1modWxJ+rv8dUjJzuXg5H+MLFM1o7nY= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= @@ -174,9 +177,12 @@ github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= @@ -211,7 +217,7 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= @@ -222,12 +228,12 @@ github.com/cosmos/cosmos-sdk/db v1.0.0-beta.1/go.mod h1:JUMM2MxF9wuwzRWZJjb8BjXs github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= -github.com/cosmos/gogoproto v1.4.2 h1:UeGRcmFW41l0G0MiefWhkPEVEwvu78SZsHBvI78dAYw= -github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoKuI= +github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.19.5 h1:rGA3hOrgNxgRM5wYcSCxgQBap7fW82WZgY78V9po/iY= -github.com/cosmos/iavl v0.19.5/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= +github.com/cosmos/iavl v0.19.6 h1:XY78yEeNPrEYyNCKlqr9chrwoeSDJ0bV2VjocTk//OU= +github.com/cosmos/iavl v0.19.6/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/cosmos/ledger-cosmos-go v0.12.2 h1:/XYaBlE2BJxtvpkHiBm97gFGSGmYGKunKyF3nNqAXZA= @@ -250,8 +256,9 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= @@ -311,16 +318,16 @@ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2 github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= -github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8= +github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= @@ -332,8 +339,6 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -344,13 +349,13 @@ github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KE github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= +github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -361,6 +366,8 @@ github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= +github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -373,8 +380,8 @@ github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -406,8 +413,8 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= @@ -440,7 +447,7 @@ github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPg github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -460,12 +467,12 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.6.0 h1:SXk3ABtQYDT/OH8jAyvEOQ58mgawq5C4o/4/89qN2ZU= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= @@ -589,7 +596,6 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -609,9 +615,12 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -620,7 +629,8 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -629,11 +639,11 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+ github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= -github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= @@ -662,8 +672,10 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -671,8 +683,8 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= @@ -683,8 +695,9 @@ github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceT github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -736,8 +749,9 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= +github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= @@ -761,17 +775,20 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us= +github.com/pelletier/go-toml/v2 v2.0.7/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU= +github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -788,8 +805,6 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -808,20 +823,16 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= @@ -837,13 +848,16 @@ github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRr github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= -github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= +github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -908,8 +922,9 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= @@ -934,13 +949,13 @@ github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZF github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU= +github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -961,6 +976,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= @@ -977,8 +993,8 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -988,6 +1004,8 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1009,9 +1027,11 @@ golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1026,8 +1046,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0 h1:LGJsf5LRplCck6jUCH3dBL2dmycNruWNF5xugkSlfXw= +golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1053,7 +1073,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1102,15 +1123,15 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1120,10 +1141,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1135,6 +1154,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1204,7 +1224,6 @@ golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1212,18 +1231,23 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1233,8 +1257,11 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1303,7 +1330,8 @@ golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1336,8 +1364,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.110.0 h1:l+rh0KYUooe9JGbGVx71tbFo4SMbMTXK3I3ia2QSEeU= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1391,8 +1419,8 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6 h1:a2S6M0+660BgMNl++4JPlcAO/CjkqYItDEZwkoDQK7c= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1417,8 +1445,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.52.0 h1:kd48UiU7EHsV4rnLyOJRuP/Il/UHE7gdDAQ+SZI7nZk= -google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1433,8 +1461,9 @@ google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX7 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 h1:KR8+MyP7/qOlV+8Af01LtjL04bu7on42eVsxT4EyBQk= -google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/proto/cosmos/group/v1/events.proto b/proto/cosmos/group/v1/events.proto index c2cfe8728f72..2b98ec9abc32 100644 --- a/proto/cosmos/group/v1/events.proto +++ b/proto/cosmos/group/v1/events.proto @@ -79,3 +79,16 @@ message EventLeaveGroup { // address is the account address of the group member. string address = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"]; } + +// EventProposalPruned is an event emitted when a proposal is pruned. +message EventProposalPruned { + + // proposal_id is the unique ID of the proposal. + uint64 proposal_id = 1; + + // status is the proposal status (UNSPECIFIED, SUBMITTED, ACCEPTED, REJECTED, ABORTED, WITHDRAWN). + ProposalStatus status = 2; + + // tally_result is the proposal tally result (when applicable). + TallyResult tally_result = 3; +} diff --git a/proto/cosmos/group/v1/query.proto b/proto/cosmos/group/v1/query.proto index 51a011a9db8f..20516d327702 100644 --- a/proto/cosmos/group/v1/query.proto +++ b/proto/cosmos/group/v1/query.proto @@ -82,6 +82,13 @@ service Query { rpc TallyResult(QueryTallyResultRequest) returns (QueryTallyResultResponse) { option (google.api.http).get = "/cosmos/group/v1/proposals/{proposal_id}/tally"; }; + + // Groups queries all groups in state. + // + // Since: cosmos-sdk 0.47.1 + rpc Groups(QueryGroupsRequest) returns (QueryGroupsResponse) { + option (google.api.http).get = "/cosmos/group/v1/groups"; + }; } // QueryGroupInfoRequest is the Query/GroupInfo request type. @@ -311,3 +318,23 @@ message QueryTallyResultResponse { // tally defines the requested tally. TallyResult tally = 1 [(gogoproto.nullable) = false]; } + +// QueryGroupsRequest is the Query/Groups request type. +// +// Since: cosmos-sdk 0.47.1 +message QueryGroupsRequest { + + // pagination defines an optional pagination for the request. + cosmos.base.query.v1beta1.PageRequest pagination = 2; +} + +// QueryGroupsResponse is the Query/Groups response type. +// +// Since: cosmos-sdk 0.47.1 +message QueryGroupsResponse { + // `groups` is all the groups present in state. + repeated GroupInfo groups = 1; + + // pagination defines the pagination in the response. + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} diff --git a/proto/cosmos/group/v1/types.proto b/proto/cosmos/group/v1/types.proto index 837271542c63..d975d6b62da6 100644 --- a/proto/cosmos/group/v1/types.proto +++ b/proto/cosmos/group/v1/types.proto @@ -14,7 +14,6 @@ import "google/protobuf/any.proto"; // Member represents a group member with an account address, // non-zero weight, metadata and added_at timestamp. message Member { - // address is the member's account address. string address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; @@ -32,7 +31,6 @@ message Member { // Contrary to `Member`, it doesn't have any `added_at` field // since this field cannot be set as part of requests. message MemberRequest { - // address is the member's account address. string address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; @@ -120,7 +118,6 @@ enum VoteOption { // GroupInfo represents the high-level on-chain information for a group. message GroupInfo { - // id is the unique ID of the group. uint64 id = 1; @@ -145,7 +142,6 @@ message GroupInfo { // GroupMember represents the relationship between a group and a member. message GroupMember { - // group_id is the unique ID of the group. uint64 group_id = 1; @@ -299,7 +295,6 @@ message TallyResult { // Vote represents a vote for a proposal. message Vote { - // proposal is the unique ID of the proposal. uint64 proposal_id = 1; diff --git a/proto/cosmos/tx/v1beta1/service.proto b/proto/cosmos/tx/v1beta1/service.proto index 4dd9b5354067..f6c39d52baaa 100644 --- a/proto/cosmos/tx/v1beta1/service.proto +++ b/proto/cosmos/tx/v1beta1/service.proto @@ -50,7 +50,7 @@ message GetTxsEventRequest { // pagination defines a pagination for the request. // Deprecated post v0.46.x: use page and limit instead. cosmos.base.query.v1beta1.PageRequest pagination = 2 [deprecated = true]; - ; + OrderBy order_by = 3; // page is the page number to query, starts at 1. If not provided, will default to first page. uint64 page = 4; diff --git a/proto/cosmos/vesting/v1beta1/tx.proto b/proto/cosmos/vesting/v1beta1/tx.proto index 27511ba80cbd..732fe12536b2 100644 --- a/proto/cosmos/vesting/v1beta1/tx.proto +++ b/proto/cosmos/vesting/v1beta1/tx.proto @@ -39,6 +39,7 @@ message MsgCreateVestingAccount { repeated cosmos.base.v1beta1.Coin amount = 3 [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; + // end of vesting as unix time (in seconds). int64 end_time = 4; bool delayed = 5; } @@ -75,6 +76,7 @@ message MsgCreatePeriodicVestingAccount { string from_address = 1; string to_address = 2; + // start of vesting as unix time (in seconds). int64 start_time = 3; repeated Period vesting_periods = 4 [(gogoproto.nullable) = false]; } diff --git a/proto/cosmos/vesting/v1beta1/vesting.proto b/proto/cosmos/vesting/v1beta1/vesting.proto index 824cc30d8bb1..d5c1c9e583d7 100644 --- a/proto/cosmos/vesting/v1beta1/vesting.proto +++ b/proto/cosmos/vesting/v1beta1/vesting.proto @@ -20,6 +20,7 @@ message BaseVestingAccount { [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; repeated cosmos.base.v1beta1.Coin delegated_vesting = 4 [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; + // Vesting end time, as unix timestamp (in seconds). int64 end_time = 5; } @@ -30,6 +31,7 @@ message ContinuousVestingAccount { option (gogoproto.goproto_stringer) = false; BaseVestingAccount base_vesting_account = 1 [(gogoproto.embed) = true]; + // Vesting start time, as unix timestamp (in seconds). int64 start_time = 2; } @@ -47,6 +49,7 @@ message DelayedVestingAccount { message Period { option (gogoproto.goproto_stringer) = false; + // Period duration in seconds. int64 length = 1; repeated cosmos.base.v1beta1.Coin amount = 2 [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; diff --git a/proto/tendermint/types/block.proto b/proto/tendermint/types/block.proto index d395501f5f6b..84e9bb15d86a 100644 --- a/proto/tendermint/types/block.proto +++ b/proto/tendermint/types/block.proto @@ -5,9 +5,11 @@ option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; import "gogoproto/gogo.proto"; import "tendermint/types/types.proto"; +import "tendermint/types/evidence.proto"; message Block { - Header header = 1 [(gogoproto.nullable) = false]; - Data data = 2 [(gogoproto.nullable) = false]; - Commit last_commit = 4; + Header header = 1 [(gogoproto.nullable) = false]; + Data data = 2 [(gogoproto.nullable) = false]; + tendermint.types.EvidenceList evidence = 3 [(gogoproto.nullable) = false]; + Commit last_commit = 4; } diff --git a/proto/tendermint/types/evidence.proto b/proto/tendermint/types/evidence.proto new file mode 100644 index 000000000000..451b8dca3c71 --- /dev/null +++ b/proto/tendermint/types/evidence.proto @@ -0,0 +1,38 @@ +syntax = "proto3"; +package tendermint.types; + +option go_package = "github.com/tendermint/tendermint/proto/tendermint/types"; + +import "gogoproto/gogo.proto"; +import "google/protobuf/timestamp.proto"; +import "tendermint/types/types.proto"; +import "tendermint/types/validator.proto"; + +message Evidence { + oneof sum { + DuplicateVoteEvidence duplicate_vote_evidence = 1; + LightClientAttackEvidence light_client_attack_evidence = 2; + } +} + +// DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes. +message DuplicateVoteEvidence { + tendermint.types.Vote vote_a = 1; + tendermint.types.Vote vote_b = 2; + int64 total_voting_power = 3; + int64 validator_power = 4; + google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; +} + +// LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client. +message LightClientAttackEvidence { + tendermint.types.LightBlock conflicting_block = 1; + int64 common_height = 2; + repeated tendermint.types.Validator byzantine_validators = 3; + int64 total_voting_power = 4; + google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; +} + +message EvidenceList { + repeated Evidence evidence = 1 [(gogoproto.nullable) = false]; +} diff --git a/proto/tendermint/types/types.proto b/proto/tendermint/types/types.proto index dd9dcddc7bb5..3ce1694594ff 100644 --- a/proto/tendermint/types/types.proto +++ b/proto/tendermint/types/types.proto @@ -87,68 +87,6 @@ message Data { // NOTE: not all txs here are valid. We're just agreeing on the order first. // This means that block.AppHash does not include these txs. repeated bytes txs = 1; - - // field number 2 is reserved for intermediate state roots - EvidenceList evidence = 3 [(gogoproto.nullable) = false]; - Messages messages = 4 [(gogoproto.nullable) = false]; - uint64 original_square_size = 5; - bytes hash = 6; -} - -// DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes. -message DuplicateVoteEvidence { - tendermint.types.Vote vote_a = 1; - tendermint.types.Vote vote_b = 2; - int64 total_voting_power = 3; - int64 validator_power = 4; - google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; -} - -// LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client. -message LightClientAttackEvidence { - tendermint.types.LightBlock conflicting_block = 1; - int64 common_height = 2; - repeated tendermint.types.Validator byzantine_validators = 3; - int64 total_voting_power = 4; - google.protobuf.Timestamp timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; -} - -message Evidence { - oneof sum { - DuplicateVoteEvidence duplicate_vote_evidence = 1; - LightClientAttackEvidence light_client_attack_evidence = 2; - } -} - -// EvidenceData contains any evidence of malicious wrong-doing by validators -message EvidenceList { - repeated Evidence evidence = 1 [(gogoproto.nullable) = false]; -} - -message Messages { - repeated Message messages_list = 1; -} - -message Message { - bytes namespace_id = 1; - bytes data = 2; -} - -// DataAvailabilityHeader contains the row and column roots of the erasure -// coded version of the data in Block.Data. -// Therefor the original Block.Data is arranged in a -// k × k matrix, which is then "extended" to a -// 2k × 2k matrix applying multiple times Reed-Solomon encoding. -// For details see Section 5.2: https://arxiv.org/abs/1809.09044 -// or the Celestia specification: -// https://github.com/celestiaorg/celestia-specs/blob/master/specs/data_structures.md#availabledataheader -// Note that currently we list row and column roots in separate fields -// (different from the spec). -message DataAvailabilityHeader { - // RowRoot_j = root((M_{j,1} || M_{j,2} || ... || M_{j,2k} )) - repeated bytes row_roots = 1; - // ColumnRoot_j = root((M_{1,j} || M_{2,j} || ... || M_{2k,j} )) - repeated bytes column_roots = 2; } // Vote represents a prevote, precommit, or commit vote from validators for @@ -213,37 +151,7 @@ message BlockMeta { // TxProof represents a Merkle proof of the presence of a transaction in the Merkle tree. message TxProof { - repeated bytes row_roots = 1; - repeated bytes data = 2; - repeated NMTProof proofs = 3; -} - -// MalleatedTx wraps a transaction that was derived from a different original -// transaction. This allows for tendermint to track malleated and original -// transactions -message MalleatedTx { - bytes original_tx_hash = 1; - bytes tx = 2; -} - -// Proof represents proof of a namespace.ID in an NMT. -// In case this proof proves the absence of a namespace.ID -// in a tree it also contains the leaf hashes of the range -// where that namespace would be. -message NMTProof { - // start index of this proof. - int32 start = 1; - // end index of this proof. - int32 end = 2; - // Nodes that together with the corresponding leaf values can be used to - // recompute the root and verify this proof. Nodes should consist of the max - // and min namespaces along with the actual hash, resulting in each being 48 - // bytes each - repeated bytes nodes = 3; - // leafHash are nil if the namespace is present in the NMT. In case the - // namespace to be proved is in the min/max range of the tree but absent, this - // will contain the leaf hash necessary to verify the proof of absence. Leaf - // hashes should consist of the namespace along with the actual hash, - // resulting 40 bytes total. - bytes leaf_hash = 4; + bytes root_hash = 1; + bytes data = 2; + tendermint.crypto.Proof proof = 3; } diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index 3e740c8b630a..636479f79ac5 100755 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -38,5 +38,3 @@ cd .. # move proto files to the right places cp -r github.com/cosmos/cosmos-sdk/* ./ rm -rf github.com - -go mod tidy -compat=1.19 diff --git a/server/start.go b/server/start.go index 208bfb8db674..2ea63c5fe1a9 100644 --- a/server/start.go +++ b/server/start.go @@ -244,6 +244,10 @@ func startStandAlone(ctx *Context, appCreator types.AppCreator) error { if err = svr.Stop(); err != nil { tmos.Exit(err.Error()) } + + if err = app.Close(); err != nil { + tmos.Exit(err.Error()) + } }() // Wait for SIGINT or SIGTERM signal @@ -485,6 +489,7 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App defer func() { if tmNode != nil && tmNode.IsRunning() { _ = tmNode.Stop() + _ = app.Close() } if apiSrv != nil { diff --git a/server/tm_cmds.go b/server/tm_cmds.go index 2dc1ddc57336..9c070d5ef26c 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -5,14 +5,23 @@ package server import ( "fmt" + "github.com/tendermint/tendermint/light" + "github.com/tendermint/tendermint/node" + cmtstore "github.com/tendermint/tendermint/proto/tendermint/store" + sm "github.com/tendermint/tendermint/state" + "github.com/tendermint/tendermint/statesync" + "github.com/spf13/cobra" "github.com/tendermint/tendermint/p2p" pvm "github.com/tendermint/tendermint/privval" + "github.com/tendermint/tendermint/store" tversion "github.com/tendermint/tendermint/version" "sigs.k8s.io/yaml" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -117,3 +126,91 @@ func VersionCmd() *cobra.Command { }, } } + +func BootstrapStateCmd(appCreator types.AppCreator) *cobra.Command { + cmd := &cobra.Command{ + Use: "bootstrap-state", + Short: "Bootstrap CometBFT state at an arbitrary block height using a light client", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + serverCtx := GetServerContextFromCmd(cmd) + cfg := serverCtx.Config + + height, err := cmd.Flags().GetInt64("height") + if err != nil { + return err + } + if height == 0 { + home := serverCtx.Viper.GetString(flags.FlagHome) + db, err := openDB(home, GetAppDBBackend(serverCtx.Viper)) + if err != nil { + return err + } + + app := appCreator(serverCtx.Logger, db, nil, serverCtx.Viper) + height = app.CommitMultiStore().LastCommitID().Version + } + + blockStoreDB, err := node.DefaultDBProvider(&node.DBContext{ID: "blockstore", Config: cfg}) + if err != nil { + return err + } + blockStore := store.NewBlockStore(blockStoreDB) + + stateDB, err := node.DefaultDBProvider(&node.DBContext{ID: "state", Config: cfg}) + if err != nil { + return err + } + stateStore := sm.NewStore(stateDB, sm.StoreOptions{ + DiscardABCIResponses: cfg.Storage.DiscardABCIResponses, + }) + + genState, _, err := node.LoadStateFromDBOrGenesisDocProvider(stateDB, node.DefaultGenesisDocProviderFunc(cfg)) + if err != nil { + return err + } + + stateProvider, err := statesync.NewLightClientStateProvider( + cmd.Context(), + genState.ChainID, genState.Version, genState.InitialHeight, + cfg.StateSync.RPCServers, light.TrustOptions{ + Period: cfg.StateSync.TrustPeriod, + Height: cfg.StateSync.TrustHeight, + Hash: cfg.StateSync.TrustHashBytes(), + }, serverCtx.Logger.With("module", "light")) + if err != nil { + return fmt.Errorf("failed to set up light client state provider: %w", err) + } + + state, err := stateProvider.State(cmd.Context(), uint64(height)) + if err != nil { + return fmt.Errorf("failed to get state: %w", err) + } + + commit, err := stateProvider.Commit(cmd.Context(), uint64(height)) + if err != nil { + return fmt.Errorf("failed to get commit: %w", err) + } + + if err := stateStore.Bootstrap(state); err != nil { + return fmt.Errorf("failed to bootstrap state: %w", err) + } + + if err := blockStore.SaveSeenCommit(state.LastBlockHeight, commit); err != nil { + return fmt.Errorf("failed to save seen commit: %w", err) + } + + store.SaveBlockStoreState(&cmtstore.BlockStoreState{ + // it breaks the invariant that blocks in range [Base, Height] must exists, but it do works in practice. + Base: state.LastBlockHeight, + Height: state.LastBlockHeight, + }, blockStoreDB) + + return nil + }, + } + + cmd.Flags().Int64("height", 0, "Block height to bootstrap state at, if not provided it uses the latest block height in app state") + + return cmd +} diff --git a/server/types/app.go b/server/types/app.go index abc4c739e5bb..d886936f75c5 100644 --- a/server/types/app.go +++ b/server/types/app.go @@ -15,6 +15,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" + "github.com/cosmos/cosmos-sdk/snapshots" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -55,6 +56,12 @@ type ( // Return the multistore instance CommitMultiStore() sdk.CommitMultiStore + + // Return the snapshot manager + SnapshotManager() *snapshots.Manager + + // Close is called in start cmd to gracefully cleanup resources. + Close() error } // ApplicationQueryService defines an extension of the Application interface diff --git a/server/util.go b/server/util.go index 8c535d537c30..cac4bd9df194 100644 --- a/server/util.go +++ b/server/util.go @@ -273,8 +273,9 @@ func interceptConfigs(rootViper *viper.Viper, customAppTemplate string, customCo // add server commands func AddCommands(rootCmd *cobra.Command, defaultNodeHome string, appCreator types.AppCreator, appExport types.AppExporter, addStartFlags types.ModuleInitFlags) { tendermintCmd := &cobra.Command{ - Use: "tendermint", - Short: "Tendermint subcommands", + Use: "tendermint", + Aliases: []string{"comet", "cometbft"}, + Short: "Tendermint subcommands", } tendermintCmd.AddCommand( @@ -284,6 +285,7 @@ func AddCommands(rootCmd *cobra.Command, defaultNodeHome string, appCreator type VersionCmd(), cbftcmd.ResetAllCmd, cbftcmd.ResetStateCmd, + BootstrapStateCmd(appCreator), ) startCmd := StartCmd(appCreator, defaultNodeHome) @@ -464,3 +466,22 @@ func DefaultBaseappOptions(appOpts types.AppOptions) []func(*baseapp.BaseApp) { baseapp.SetIAVLLazyLoading(cast.ToBool(appOpts.Get(FlagIAVLLazyLoading))), } } + +func GetSnapshotStore(appOpts types.AppOptions) (*snapshots.Store, error) { + homeDir := cast.ToString(appOpts.Get(flags.FlagHome)) + snapshotDir := filepath.Join(homeDir, "data", "snapshots") + if err := os.MkdirAll(snapshotDir, os.ModePerm); err != nil { + return nil, fmt.Errorf("failed to create snapshots directory: %w", err) + } + + snapshotDB, err := dbm.NewDB("metadata", GetAppDBBackend(appOpts), snapshotDir) + if err != nil { + return nil, err + } + snapshotStore, err := snapshots.NewStore(snapshotDB, snapshotDir) + if err != nil { + return nil, err + } + + return snapshotStore, nil +} diff --git a/simapp/simd/cmd/root.go b/simapp/simd/cmd/root.go index d8b71c6df53a..03261d516ca1 100644 --- a/simapp/simd/cmd/root.go +++ b/simapp/simd/cmd/root.go @@ -20,6 +20,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/client/pruning" "github.com/cosmos/cosmos-sdk/client/rpc" + "github.com/cosmos/cosmos-sdk/client/snapshot" "github.com/cosmos/cosmos-sdk/server" serverconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" @@ -169,6 +170,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { debug.Cmd(), config.Cmd(), pruning.PruningCmd(a.newApp), + snapshot.Cmd(a.newApp), ) server.AddCommands(rootCmd, simapp.DefaultNodeHome, a.newApp, a.appExport, addModuleInitFlags) diff --git a/simapp/state.go b/simapp/state.go index 135863c5bd7c..f491e098dd34 100644 --- a/simapp/state.go +++ b/simapp/state.go @@ -8,6 +8,7 @@ import ( "os" "time" + "github.com/gogo/protobuf/proto" tmjson "github.com/tendermint/tendermint/libs/json" tmtypes "github.com/tendermint/tendermint/types" @@ -27,6 +28,34 @@ import ( // It panics if the user provides files for both of them. // If a file is not given for the genesis or the sim params, it creates a randomized one. func AppStateFn(cdc codec.JSONCodec, simManager *module.SimulationManager) simtypes.AppStateFn { + genesisState := NewDefaultGenesisState(cdc) + return AppStateFnWithExtendedCb(cdc, simManager, genesisState, nil) +} + +// AppStateFnWithExtendedCb returns the initial application state using a genesis or the simulation parameters. +// It calls AppStateFnWithExtendedCbs with nil moduleStateCb. +func AppStateFnWithExtendedCb( + cdc codec.JSONCodec, + simManager *module.SimulationManager, + genesisState map[string]json.RawMessage, + rawStateCb func(rawState map[string]json.RawMessage), +) simtypes.AppStateFn { + return AppStateFnWithExtendedCbs(cdc, simManager, genesisState, nil, rawStateCb) +} + +// AppStateFnWithExtendedCbs returns the initial application state using a genesis or the simulation parameters. +// It panics if the user provides files for both of them. +// If a file is not given for the genesis or the sim params, it creates a randomized one. +// genesisState is the default genesis state of the whole app. +// moduleStateCb is the callback function to access moduleState. +// rawStateCb is the callback function to extend rawState. +func AppStateFnWithExtendedCbs( + cdc codec.JSONCodec, + simManager *module.SimulationManager, + genesisState map[string]json.RawMessage, + moduleStateCb func(moduleName string, genesisState interface{}), + rawStateCb func(rawState map[string]json.RawMessage), +) simtypes.AppStateFn { return func(r *rand.Rand, accs []simtypes.Account, config simtypes.Config, ) (appState json.RawMessage, simAccs []simtypes.Account, chainID string, genesisTimestamp time.Time) { if FlagGenesisTimeValue == 0 { @@ -64,11 +93,11 @@ func AppStateFn(cdc codec.JSONCodec, simManager *module.SimulationManager) simty if err != nil { panic(err) } - appState, simAccs = AppStateRandomizedFn(simManager, r, cdc, accs, genesisTimestamp, appParams) + appState, simAccs = AppStateRandomizedFnWithState(simManager, r, cdc, accs, genesisTimestamp, appParams, genesisState) default: appParams := make(simtypes.AppParams) - appState, simAccs = AppStateRandomizedFn(simManager, r, cdc, accs, genesisTimestamp, appParams) + appState, simAccs = AppStateRandomizedFnWithState(simManager, r, cdc, accs, genesisTimestamp, appParams, genesisState) } rawState := make(map[string]json.RawMessage) @@ -124,8 +153,20 @@ func AppStateFn(cdc codec.JSONCodec, simManager *module.SimulationManager) simty } // change appState back - rawState[stakingtypes.ModuleName] = cdc.MustMarshalJSON(stakingState) - rawState[banktypes.ModuleName] = cdc.MustMarshalJSON(bankState) + for name, state := range map[string]proto.Message{ + stakingtypes.ModuleName: stakingState, + banktypes.ModuleName: bankState, + } { + if moduleStateCb != nil { + moduleStateCb(name, state) + } + rawState[name] = cdc.MustMarshalJSON(state) + } + + // extend state from callback function + if rawStateCb != nil { + rawStateCb(rawState) + } // replace appstate appState, err = json.Marshal(rawState) @@ -142,8 +183,20 @@ func AppStateRandomizedFn( simManager *module.SimulationManager, r *rand.Rand, cdc codec.JSONCodec, accs []simtypes.Account, genesisTimestamp time.Time, appParams simtypes.AppParams, ) (json.RawMessage, []simtypes.Account) { - numAccs := int64(len(accs)) genesisState := NewDefaultGenesisState(cdc) + return AppStateRandomizedFnWithState(simManager, r, cdc, accs, genesisTimestamp, appParams, genesisState) +} + +// AppStateRandomizedFnWithState creates calls each module's GenesisState generator function +// and creates the simulation params +// genesisState is the genesis state of the app. +// This function will not exist in v0.47, but be replaced by AppStateRandomizedFn with an extra genesisState argument. +func AppStateRandomizedFnWithState( + simManager *module.SimulationManager, r *rand.Rand, cdc codec.JSONCodec, + accs []simtypes.Account, genesisTimestamp time.Time, appParams simtypes.AppParams, + genesisState map[string]json.RawMessage, +) (json.RawMessage, []simtypes.Account) { + numAccs := int64(len(accs)) // generate a random amount of initial stake coins and a random initial // number of bonded accounts diff --git a/snapshots/README.md b/snapshots/README.md index 1c80f05d5633..f9fccfc20f38 100644 --- a/snapshots/README.md +++ b/snapshots/README.md @@ -55,16 +55,16 @@ Snapshot settings are optional. However, if set, they have an effect on how prun persisting the heights that are multiples of `state-sync.snapshot-interval` until after the snapshot is complete. If pruning is enabled (not `pruning = "nothing"`), we avoid pruning heights that are multiples of -`state-sync.snapshot-interval` in the regular logic determined by the -pruning settings and applied after every `Commit()`. This is done to prevent a -height from being removed before a snapshot is complete. Therefore, we keep -such heights until after a snapshot is done. At this point, the height is sent to +`state-sync.snapshot-interval` in the regular logic determined by the +pruning settings and applied after every `Commit()`. This is done to prevent a +height from being removed before a snapshot is complete. Therefore, we keep +such heights until after a snapshot is done. At this point, the height is sent to the `pruning.Manager` to be pruned according to the pruning settings after the next `Commit()`. To illustrate, assume that we are currently at height 960 with `pruning-keep-recent = 50`, `pruning-interval = 10`, and `state-sync.snapshot-interval = 100`. Let's assume that the snapshot that was triggered at height `900` **just finishes**. Then, we can prune height -`900` right away (that is, when we call `Commit()` at height 960 because 900 is less than `960 - 50 = 910`. +`900` right away (that is, when we call `Commit()` at height 960 because 900 is less than `960 - 50 = 910`). Let's now assume that all conditions stay the same but the snapshot at height 900 is **not complete yet**. Then, we cannot prune it to avoid deleting a height that is still being snapshotted. Therefore, we keep track @@ -78,23 +78,22 @@ Note that in both examples, if we let current height = C, and previous height P P - `pruning-keep-recent` - `pruning-interval` <= h <= P - `pruning-keep-recent` -we can prune height h. In our first example, all heights 899 - 909 fall in this range and are pruned at height 960 as long as +we can prune height h. In our first example, all heights 899 - 909 fall in this range and are pruned at height 960 as long as h is not a snapshot height (E.g. 900). That is, we always use current height to determine at which height to prune (960) while we use previous to determine which heights are to be pruned (959 - 50 - 10 = 899-909 = 959 - 50). - ## Configuration * `state-sync.snapshot-interval` - * the interval at which to take snapshots. - * the value of 0 disables snapshots. - * if pruning is enabled, it is done after a snapshot is complete for the heights that are multiples of this interval. + * the interval at which to take snapshots. + * the value of 0 disables snapshots. + * if pruning is enabled, it is done after a snapshot is complete for the heights that are multiples of this interval. * `state-sync.snapshot-keep-recent`: - * the number of recent snapshots to keep. - * 0 means keep all. + * the number of recent snapshots to keep. + * 0 means keep all. ## Snapshot Metadata diff --git a/snapshots/manager.go b/snapshots/manager.go index 05cbad3f5b30..b92a2b5b82d0 100644 --- a/snapshots/manager.go +++ b/snapshots/manager.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "math" + "os" "sort" "sync" @@ -38,12 +39,12 @@ type Manager struct { multistore types.Snapshotter logger log.Logger - mtx sync.Mutex - operation operation - chRestore chan<- io.ReadCloser - chRestoreDone <-chan restoreDone - restoreChunkHashes [][]byte - restoreChunkIndex uint32 + mtx sync.Mutex + operation operation + chRestore chan<- uint32 + chRestoreDone <-chan restoreDone + restoreSnapshot *types.Snapshot + restoreChunkIndex uint32 } // operation represents a Manager operation. Only one operation can be in progress at a time. @@ -61,7 +62,8 @@ const ( opPrune operation = "prune" opRestore operation = "restore" - chunkBufferSize = 4 + chunkBufferSize = 4 + chunkIDBufferSize = 1024 snapshotMaxItemSize = int(64e6) // SDK has no key/value size limit, so we set an arbitrary limit ) @@ -131,7 +133,7 @@ func (m *Manager) endLocked() { m.chRestore = nil } m.chRestoreDone = nil - m.restoreChunkHashes = nil + m.restoreSnapshot = nil m.restoreChunkIndex = 0 } @@ -284,11 +286,18 @@ func (m *Manager) Restore(snapshot types.Snapshot) error { } // Start an asynchronous snapshot restoration, passing chunks and completion status via channels. - chChunks := make(chan io.ReadCloser, chunkBufferSize) + chChunkIDs := make(chan uint32, chunkIDBufferSize) chDone := make(chan restoreDone, 1) + dir := m.store.pathSnapshot(snapshot.Height, snapshot.Format) + if err := os.MkdirAll(dir, 0o750); err != nil { + return sdkerrors.Wrapf(err, "failed to create snapshot directory %q", dir) + } + + chChunks := m.loadChunkStream(snapshot.Height, snapshot.Format, chChunkIDs) + go func() { - err := m.restoreSnapshot(snapshot, chChunks) + err := m.doRestoreSnapshot(snapshot, chChunks) chDone <- restoreDone{ complete: err == nil, err: err, @@ -296,15 +305,38 @@ func (m *Manager) Restore(snapshot types.Snapshot) error { close(chDone) }() - m.chRestore = chChunks + m.chRestore = chChunkIDs m.chRestoreDone = chDone - m.restoreChunkHashes = snapshot.Metadata.ChunkHashes + m.restoreSnapshot = &snapshot m.restoreChunkIndex = 0 return nil } -// restoreSnapshot do the heavy work of snapshot restoration after preliminary checks on request have passed. -func (m *Manager) restoreSnapshot(snapshot types.Snapshot, chChunks <-chan io.ReadCloser) error { +func (m *Manager) loadChunkStream(height uint64, format uint32, chunkIDs <-chan uint32) <-chan io.ReadCloser { + chunks := make(chan io.ReadCloser, chunkBufferSize) + go func() { + defer close(chunks) + + for chunkID := range chunkIDs { + chunk, err := m.store.loadChunkFile(height, format, chunkID) + if err != nil { + m.logger.Error("load chunk file failed", "height", height, "format", format, "chunk", chunkID, "err", err) + break + } + chunks <- chunk + } + }() + + return chunks +} + +// doRestoreSnapshot do the heavy work of snapshot restoration after preliminary checks on request have passed. +func (m *Manager) doRestoreSnapshot(snapshot types.Snapshot, chChunks <-chan io.ReadCloser) error { + dir := m.store.pathSnapshot(snapshot.Height, snapshot.Format) + if err := os.MkdirAll(dir, 0o750); err != nil { + return sdkerrors.Wrapf(err, "failed to create snapshot directory %q", dir) + } + streamReader, err := NewStreamReader(chChunks) if err != nil { return err @@ -348,7 +380,7 @@ func (m *Manager) RestoreChunk(chunk []byte) (bool, error) { return false, sdkerrors.Wrap(sdkerrors.ErrLogic, "no restore operation in progress") } - if int(m.restoreChunkIndex) >= len(m.restoreChunkHashes) { + if int(m.restoreChunkIndex) >= len(m.restoreSnapshot.Metadata.ChunkHashes) { return false, sdkerrors.Wrap(sdkerrors.ErrLogic, "received unexpected chunk") } @@ -365,19 +397,30 @@ func (m *Manager) RestoreChunk(chunk []byte) (bool, error) { // Verify the chunk hash. hash := sha256.Sum256(chunk) - expected := m.restoreChunkHashes[m.restoreChunkIndex] + expected := m.restoreSnapshot.Metadata.ChunkHashes[m.restoreChunkIndex] if !bytes.Equal(hash[:], expected) { return false, sdkerrors.Wrapf(types.ErrChunkHashMismatch, "expected %x, got %x", hash, expected) } + if err := m.store.saveChunkContent(chunk, m.restoreChunkIndex, m.restoreSnapshot); err != nil { + return false, sdkerrors.Wrapf(err, "save chunk content %d", m.restoreChunkIndex) + } + // Pass the chunk to the restore, and wait for completion if it was the final one. - m.chRestore <- io.NopCloser(bytes.NewReader(chunk)) + m.chRestore <- m.restoreChunkIndex m.restoreChunkIndex++ - if int(m.restoreChunkIndex) >= len(m.restoreChunkHashes) { + if int(m.restoreChunkIndex) >= len(m.restoreSnapshot.Metadata.ChunkHashes) { close(m.chRestore) m.chRestore = nil + + // the chunks are all written into files, we can save the snapshot to the db, + // even if the restoration may not completed yet. + if err := m.store.saveSnapshot(m.restoreSnapshot); err != nil { + return false, sdkerrors.Wrap(err, "save restoring snapshot") + } + done := <-m.chRestoreDone m.endLocked() if done.err != nil { @@ -386,11 +429,35 @@ func (m *Manager) RestoreChunk(chunk []byte) (bool, error) { if !done.complete { return false, sdkerrors.Wrap(sdkerrors.ErrLogic, "restore ended prematurely") } + return true, nil } return false, nil } +// RestoreLocalSnapshot restores app state from a local snapshot. +func (m *Manager) RestoreLocalSnapshot(height uint64, format uint32) error { + snapshot, ch, err := m.store.Load(height, format) + if err != nil { + return err + } + + if snapshot == nil { + return fmt.Errorf("snapshot doesn't exist, height: %d, format: %d", height, format) + } + + m.mtx.Lock() + defer m.mtx.Unlock() + + err = m.beginLocked(opRestore) + if err != nil { + return err + } + defer m.endLocked() + + return m.doRestoreSnapshot(*snapshot, ch) +} + // sortedExtensionNames sort extension names for deterministic iteration. func (m *Manager) sortedExtensionNames() []string { names := make([]string, 0, len(m.extensions)) diff --git a/snapshots/manager_test.go b/snapshots/manager_test.go index b71043022827..d379f09cb9f1 100644 --- a/snapshots/manager_test.go +++ b/snapshots/manager_test.go @@ -205,6 +205,13 @@ func TestManager_Restore(t *testing.T) { assert.Equal(t, expectItems, target.items) + // The snapshot is saved in local snapshot store + snapshots, err := store.List() + require.NoError(t, err) + snapshot := snapshots[0] + require.Equal(t, uint64(3), snapshot.Height) + require.Equal(t, types.CurrentFormat, snapshot.Format) + // Starting a new restore should fail now, because the target already has contents. err = manager.Restore(types.Snapshot{ Height: 3, diff --git a/snapshots/store.go b/snapshots/store.go index 8105938b80f1..254686e631b4 100644 --- a/snapshots/store.go +++ b/snapshots/store.go @@ -3,6 +3,7 @@ package snapshots import ( "crypto/sha256" "encoding/binary" + "hash" "io" "math" "os" @@ -14,6 +15,7 @@ import ( db "github.com/tendermint/tm-db" "github.com/cosmos/cosmos-sdk/snapshots/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) @@ -164,8 +166,8 @@ func (s *Store) Load(height uint64, format uint32) (*types.Snapshot, <-chan io.R // LoadChunk loads a chunk from disk, or returns nil if it does not exist. The caller must call // Close() on it when done. -func (s *Store) LoadChunk(height uint64, format uint32, chunk uint32) (io.ReadCloser, error) { - path := s.pathChunk(height, format, chunk) +func (s *Store) LoadChunk(height uint64, format, chunk uint32) (io.ReadCloser, error) { + path := s.PathChunk(height, format, chunk) file, err := os.Open(path) if os.IsNotExist(err) { return nil, nil @@ -174,8 +176,8 @@ func (s *Store) LoadChunk(height uint64, format uint32, chunk uint32) (io.ReadCl } // loadChunkFile loads a chunk from disk, and errors if it does not exist. -func (s *Store) loadChunkFile(height uint64, format uint32, chunk uint32) (io.ReadCloser, error) { - path := s.pathChunk(height, format, chunk) +func (s *Store) loadChunkFile(height uint64, format, chunk uint32) (io.ReadCloser, error) { + path := s.PathChunk(height, format, chunk) return os.Open(path) } @@ -259,33 +261,16 @@ func (s *Store) Save( snapshotHasher := sha256.New() chunkHasher := sha256.New() for chunkBody := range chunks { - defer chunkBody.Close() // nolint: staticcheck + defer chunkBody.Close() //nolint:staticcheck dir := s.pathSnapshot(height, format) err = os.MkdirAll(dir, 0o755) if err != nil { return nil, sdkerrors.Wrapf(err, "failed to create snapshot directory %q", dir) } - path := s.pathChunk(height, format, index) - file, err := os.Create(path) - if err != nil { - return nil, sdkerrors.Wrapf(err, "failed to create snapshot chunk file %q", path) - } - defer file.Close() // nolint: staticcheck - chunkHasher.Reset() - _, err = io.Copy(io.MultiWriter(file, chunkHasher, snapshotHasher), chunkBody) - if err != nil { - return nil, sdkerrors.Wrapf(err, "failed to generate snapshot chunk %v", index) - } - err = file.Close() - if err != nil { - return nil, sdkerrors.Wrapf(err, "failed to close snapshot chunk %v", index) + if err := s.saveChunk(chunkBody, index, snapshot, chunkHasher, snapshotHasher); err != nil { + return nil, err } - err = chunkBody.Close() - if err != nil { - return nil, sdkerrors.Wrapf(err, "failed to close snapshot chunk %v", index) - } - snapshot.Metadata.ChunkHashes = append(snapshot.Metadata.ChunkHashes, chunkHasher.Sum(nil)) index++ } snapshot.Chunks = index @@ -293,6 +278,42 @@ func (s *Store) Save( return snapshot, s.saveSnapshot(snapshot) } +// saveChunk saves the given chunkBody with the given index to its appropriate path on disk. +// The hash of the chunk is appended to the snapshot's metadata, +// and the overall snapshot hash is updated with the chunk content too. +func (s *Store) saveChunk(chunkBody io.ReadCloser, index uint32, snapshot *types.Snapshot, chunkHasher, snapshotHasher hash.Hash) error { + defer chunkBody.Close() + + path := s.PathChunk(snapshot.Height, snapshot.Format, index) + chunkFile, err := os.Create(path) + if err != nil { + return sdkerrors.Wrapf(err, "failed to create snapshot chunk file %q", path) + } + defer chunkFile.Close() + + chunkHasher.Reset() + if _, err := io.Copy(io.MultiWriter(chunkFile, chunkHasher, snapshotHasher), chunkBody); err != nil { + return sdkerrors.Wrapf(err, "failed to generate snapshot chunk %d", index) + } + + if err := chunkFile.Close(); err != nil { + return sdkerrors.Wrapf(err, "failed to close snapshot chunk file %d", index) + } + + if err := chunkBody.Close(); err != nil { + return sdkerrors.Wrapf(err, "failed to close snapshot chunk body %d", index) + } + + snapshot.Metadata.ChunkHashes = append(snapshot.Metadata.ChunkHashes, chunkHasher.Sum(nil)) + return nil +} + +// saveChunkContent save the chunk to disk +func (s *Store) saveChunkContent(chunk []byte, index uint32, snapshot *types.Snapshot) error { + path := s.PathChunk(snapshot.Height, snapshot.Format, index) + return os.WriteFile(path, chunk, 0o600) +} + // saveSnapshot saves snapshot metadata to the database. func (s *Store) saveSnapshot(snapshot *types.Snapshot) error { value, err := proto.Marshal(snapshot) @@ -313,8 +334,8 @@ func (s *Store) pathSnapshot(height uint64, format uint32) string { return filepath.Join(s.pathHeight(height), strconv.FormatUint(uint64(format), 10)) } -// pathChunk generates a snapshot chunk path. -func (s *Store) pathChunk(height uint64, format uint32, chunk uint32) string { +// PathChunk generates a snapshot chunk path. +func (s *Store) PathChunk(height uint64, format, chunk uint32) string { return filepath.Join(s.pathSnapshot(height, format), strconv.FormatUint(uint64(chunk), 10)) } diff --git a/store/iavl/store.go b/store/iavl/store.go index 3cf6c1dedbf2..7517f934f4de 100644 --- a/store/iavl/store.go +++ b/store/iavl/store.go @@ -111,7 +111,7 @@ func UnsafeNewStore(tree *iavl.MutableTree) *Store { // Any mutable operations executed will result in a panic. func (st *Store) GetImmutable(version int64) (*Store, error) { if !st.VersionExists(version) { - return &Store{tree: &immutableTree{&iavl.ImmutableTree{}}}, nil + return nil, fmt.Errorf("version mismatch on immutable IAVL tree; version does not exist. Version has either been pruned, or is for a future block height") } iTree, err := st.tree.GetImmutable(version) diff --git a/store/iavl/store_test.go b/store/iavl/store_test.go index dabe1e37f630..8379779c158b 100644 --- a/store/iavl/store_test.go +++ b/store/iavl/store_test.go @@ -127,7 +127,7 @@ func TestGetImmutable(t *testing.T) { require.Nil(t, err) _, err = store.GetImmutable(cID.Version + 1) - require.NoError(t, err) + require.Error(t, err) newStore, err := store.GetImmutable(cID.Version - 1) require.NoError(t, err) diff --git a/store/rootmulti/store.go b/store/rootmulti/store.go index 74915695ab40..7397abd0424e 100644 --- a/store/rootmulti/store.go +++ b/store/rootmulti/store.go @@ -481,6 +481,8 @@ func (rs *Store) CacheMultiStore() types.CacheMultiStore { // iterating at past heights. func (rs *Store) CacheMultiStoreWithVersion(version int64) (types.CacheMultiStore, error) { cachedStores := make(map[types.StoreKey]types.CacheWrapper) + var commitInfo *types.CommitInfo + storeInfos := map[string]bool{} for key, store := range rs.stores { var cacheStore types.KVStore switch store.GetStoreType() { @@ -493,9 +495,30 @@ func (rs *Store) CacheMultiStoreWithVersion(version int64) (types.CacheMultiStor // version does not exist or is pruned, an error should be returned. var err error cacheStore, err = store.(*iavl.Store).GetImmutable(version) + // if we got error from loading a module store + // we fetch commit info of this version + // we use commit info to check if the store existed at this version or not if err != nil { - return nil, err + if commitInfo == nil { + var errCommitInfo error + commitInfo, errCommitInfo = getCommitInfo(rs.db, version) + + if errCommitInfo != nil { + return nil, errCommitInfo + } + + for _, storeInfo := range commitInfo.StoreInfos { + storeInfos[storeInfo.Name] = true + } + } + + // If the store existed at this version, it means there's actually an error + // getting the root store at this version. + if storeInfos[key.Name()] { + return nil, err + } } + default: cacheStore = store } diff --git a/store/rootmulti/store_test.go b/store/rootmulti/store_test.go index 0e78e0f95bed..69e773be1a80 100644 --- a/store/rootmulti/store_test.go +++ b/store/rootmulti/store_test.go @@ -88,7 +88,7 @@ func TestCacheMultiStoreWithVersion(t *testing.T) { // require no failure when given an invalid or pruned version _, err = ms.CacheMultiStoreWithVersion(cID.Version + 1) - require.NoError(t, err) + require.Error(t, err) // require a valid version can be cache-loaded cms, err := ms.CacheMultiStoreWithVersion(cID.Version) @@ -99,6 +99,17 @@ func TestCacheMultiStoreWithVersion(t *testing.T) { require.NotNil(t, kvStore) require.Equal(t, kvStore.Get(k), v) + // add new module stores (store4 and store5) to multi stores and commit + ms.MountStoreWithDB(types.NewKVStoreKey("store4"), types.StoreTypeIAVL, nil) + ms.MountStoreWithDB(types.NewKVStoreKey("store5"), types.StoreTypeIAVL, nil) + err = ms.LoadLatestVersionAndUpgrade(&types.StoreUpgrades{Added: []string{"store4", "store5"}}) + require.NoError(t, err) + ms.Commit() + + // cache multistore of version before adding store4 should works + _, err = ms.CacheMultiStoreWithVersion(1) + require.NoError(t, err) + // require we cannot commit (write) to a cache-versioned multi-store require.Panics(t, func() { kvStore.Set(k, []byte("newValue")) @@ -482,9 +493,9 @@ func TestMultiStore_Pruning(t *testing.T) { saved []int64 }{ {"prune nothing", 10, pruningtypes.NewPruningOptions(pruningtypes.PruningNothing), nil, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}, - {"prune everything", 10, pruningtypes.NewPruningOptions(pruningtypes.PruningEverything), []int64{1, 2, 3, 4, 5, 6, 7, 8, 9}, []int64{10}}, - {"prune some; no batch", 10, pruningtypes.NewCustomPruningOptions(2, 1), []int64{1, 2, 4, 5, 7}, []int64{3, 6, 8, 9, 10}}, - {"prune some; small batch", 10, pruningtypes.NewCustomPruningOptions(2, 3), []int64{1, 2, 4, 5}, []int64{3, 6, 7, 8, 9, 10}}, + {"prune everything", 12, pruningtypes.NewPruningOptions(pruningtypes.PruningEverything), []int64{1, 2, 3, 4, 5, 6, 7}, []int64{8, 9, 10, 11, 12}}, + {"prune some; no batch", 10, pruningtypes.NewCustomPruningOptions(2, 1), []int64{1, 2, 3, 4, 6, 5, 7}, []int64{8, 9, 10}}, + {"prune some; small batch", 10, pruningtypes.NewCustomPruningOptions(2, 3), []int64{1, 2, 3, 4, 5, 6}, []int64{7, 8, 9, 10}}, {"prune some; large batch", 10, pruningtypes.NewCustomPruningOptions(2, 11), nil, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}, } @@ -502,12 +513,12 @@ func TestMultiStore_Pruning(t *testing.T) { for _, v := range tc.saved { _, err := ms.CacheMultiStoreWithVersion(v) - require.NoError(t, err, "expected error when loading height: %d", v) + require.NoError(t, err, "expected no error when loading height: %d", v) } for _, v := range tc.deleted { _, err := ms.CacheMultiStoreWithVersion(v) - require.NoError(t, err, "expected error when loading height: %d", v) + require.Error(t, err, "expected error when loading height: %d", v) } }) } diff --git a/testutil/rest/rest.go b/testutil/rest/rest.go index c2cd418d0d14..89a16b3ff286 100644 --- a/testutil/rest/rest.go +++ b/testutil/rest/rest.go @@ -12,7 +12,7 @@ import ( // GetRequest defines a wrapper around an HTTP GET request with a provided URL. // An error is returned if the request or reading the body fails. func GetRequest(url string) ([]byte, error) { - res, err := http.Get(url) // nolint:gosec + res, err := http.Get(url) //nolint:gosec if err != nil { return nil, err } @@ -31,7 +31,7 @@ func GetRequest(url string) ([]byte, error) { // PostRequest defines a wrapper around an HTTP POST request with a provided URL and data. // An error is returned if the request or reading the body fails. func PostRequest(url string, contentType string, data []byte) ([]byte, error) { - res, err := http.Post(url, contentType, bytes.NewBuffer(data)) // nolint:gosec + res, err := http.Post(url, contentType, bytes.NewBuffer(data)) //nolint:gosec if err != nil { return nil, fmt.Errorf("error while sending post request: %w", err) } diff --git a/types/query/pagination.pb.go b/types/query/pagination.pb.go index 45d700b9f3ce..3e7cc5486220 100644 --- a/types/query/pagination.pb.go +++ b/types/query/pagination.pb.go @@ -25,10 +25,10 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // PageRequest is to be embedded in gRPC request messages for efficient // pagination. Ex: // -// message SomeRequest { -// Foo some_parameter = 1; -// PageRequest pagination = 2; -// } +// message SomeRequest { +// Foo some_parameter = 1; +// PageRequest pagination = 2; +// } type PageRequest struct { // key is a value returned in PageResponse.next_key to begin // querying the next page most efficiently. Only one of offset or key @@ -123,10 +123,10 @@ func (m *PageRequest) GetReverse() bool { // PageResponse is to be embedded in gRPC response messages where the // corresponding request message has used PageRequest. // -// message SomeResponse { -// repeated Bar results = 1; -// PageResponse page = 2; -// } +// message SomeResponse { +// repeated Bar results = 1; +// PageResponse page = 2; +// } type PageResponse struct { // next_key is the key to be passed to PageRequest.key to // query the next page most efficiently. It will be empty if diff --git a/types/simulation/types.go b/types/simulation/types.go index 199f47fa38e2..a152413f3c07 100644 --- a/types/simulation/types.go +++ b/types/simulation/types.go @@ -161,6 +161,10 @@ type AppStateFn func(r *rand.Rand, accs []Account, config Config) ( appState json.RawMessage, accounts []Account, chainId string, genesisTimestamp time.Time, ) +// AppStateFnWithExtendedCb returns the app state json bytes and the genesis accounts +// Deprecated: Use AppStateFn instead. This will be removed in a future relase. +type AppStateFnWithExtendedCb AppStateFn + // RandomAccountFn returns a slice of n random simulation accounts type RandomAccountFn func(r *rand.Rand, n int) []Account diff --git a/x/auth/vesting/client/cli/tx.go b/x/auth/vesting/client/cli/tx.go index 3c88d04500fa..f2ef3ba67fe7 100644 --- a/x/auth/vesting/client/cli/tx.go +++ b/x/auth/vesting/client/cli/tx.go @@ -142,7 +142,7 @@ func NewMsgCreatePeriodicVestingAccountCmd() *cobra.Command { An array of coin strings and unix epoch times for coins to vest { "start_time": 1625204910, -"period":[ +"periods":[ { "coins": "10test", "length_seconds":2592000 //30 days diff --git a/x/auth/vesting/msg_server.go b/x/auth/vesting/msg_server.go index afcd2681e1bb..c3dd5785163d 100644 --- a/x/auth/vesting/msg_server.go +++ b/x/auth/vesting/msg_server.go @@ -79,8 +79,7 @@ func (s msgServer) CreateVestingAccount(goCtx context.Context, msg *types.MsgCre } }() - err = bk.SendCoins(ctx, from, to, msg.Amount) - if err != nil { + if err = bk.SendCoins(ctx, from, to, msg.Amount); err != nil { return nil, err } @@ -140,8 +139,7 @@ func (s msgServer) CreatePermanentLockedAccount(goCtx context.Context, msg *type } }() - err = bk.SendCoins(ctx, from, to, msg.Amount) - if err != nil { + if err = bk.SendCoins(ctx, from, to, msg.Amount); err != nil { return nil, err } @@ -175,11 +173,14 @@ func (s msgServer) CreatePeriodicVestingAccount(goCtx context.Context, msg *type } var totalCoins sdk.Coins - for _, period := range msg.VestingPeriods { totalCoins = totalCoins.Add(period.Amount...) } + if err := bk.IsSendEnabledCoins(ctx, totalCoins...); err != nil { + return nil, err + } + baseAccount := authtypes.NewBaseAccountWithAddress(to) baseAccount = ak.NewAccount(ctx, baseAccount).(*authtypes.BaseAccount) vestingAccount := types.NewPeriodicVestingAccount(baseAccount, totalCoins.Sort(), msg.StartTime, msg.VestingPeriods) @@ -200,8 +201,7 @@ func (s msgServer) CreatePeriodicVestingAccount(goCtx context.Context, msg *type } }() - err = bk.SendCoins(ctx, from, to, totalCoins) - if err != nil { + if err = bk.SendCoins(ctx, from, to, totalCoins); err != nil { return nil, err } diff --git a/x/auth/vesting/types/msgs.go b/x/auth/vesting/types/msgs.go index fbce860cede4..f2194af5690b 100644 --- a/x/auth/vesting/types/msgs.go +++ b/x/auth/vesting/types/msgs.go @@ -182,6 +182,14 @@ func (msg MsgCreatePeriodicVestingAccount) ValidateBasic() error { } for i, period := range msg.VestingPeriods { + if !period.Amount.IsValid() { + return sdkerrors.ErrInvalidCoins.Wrap(period.Amount.String()) + } + + if !period.Amount.IsAllPositive() { + return sdkerrors.ErrInvalidCoins.Wrap(period.Amount.String()) + } + if period.Length < 1 { return fmt.Errorf("invalid period length of %d in period %d, length must be greater than 0", period.Length, i) } diff --git a/x/auth/vesting/types/tx.pb.go b/x/auth/vesting/types/tx.pb.go index 6f43ecbbf640..4c0f70952103 100644 --- a/x/auth/vesting/types/tx.pb.go +++ b/x/auth/vesting/types/tx.pb.go @@ -38,8 +38,9 @@ type MsgCreateVestingAccount struct { FromAddress string `protobuf:"bytes,1,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"` ToAddress string `protobuf:"bytes,2,opt,name=to_address,json=toAddress,proto3" json:"to_address,omitempty"` Amount github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,3,rep,name=amount,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"amount"` - EndTime int64 `protobuf:"varint,4,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` - Delayed bool `protobuf:"varint,5,opt,name=delayed,proto3" json:"delayed,omitempty"` + // end of vesting as unix time (in seconds). + EndTime int64 `protobuf:"varint,4,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + Delayed bool `protobuf:"varint,5,opt,name=delayed,proto3" json:"delayed,omitempty"` } func (m *MsgCreateVestingAccount) Reset() { *m = MsgCreateVestingAccount{} } @@ -257,8 +258,9 @@ var xxx_messageInfo_MsgCreatePermanentLockedAccountResponse proto.InternalMessag // // Since: cosmos-sdk 0.46 type MsgCreatePeriodicVestingAccount struct { - FromAddress string `protobuf:"bytes,1,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"` - ToAddress string `protobuf:"bytes,2,opt,name=to_address,json=toAddress,proto3" json:"to_address,omitempty"` + FromAddress string `protobuf:"bytes,1,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"` + ToAddress string `protobuf:"bytes,2,opt,name=to_address,json=toAddress,proto3" json:"to_address,omitempty"` + // start of vesting as unix time (in seconds). StartTime int64 `protobuf:"varint,3,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` VestingPeriods []Period `protobuf:"bytes,4,rep,name=vesting_periods,json=vestingPeriods,proto3" json:"vesting_periods"` } diff --git a/x/auth/vesting/types/vesting.pb.go b/x/auth/vesting/types/vesting.pb.go index 0daec372f12a..cea677c9d902 100644 --- a/x/auth/vesting/types/vesting.pb.go +++ b/x/auth/vesting/types/vesting.pb.go @@ -33,7 +33,8 @@ type BaseVestingAccount struct { OriginalVesting github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=original_vesting,json=originalVesting,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"original_vesting"` DelegatedFree github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,3,rep,name=delegated_free,json=delegatedFree,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"delegated_free"` DelegatedVesting github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,4,rep,name=delegated_vesting,json=delegatedVesting,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"delegated_vesting"` - EndTime int64 `protobuf:"varint,5,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + // Vesting end time, as unix timestamp (in seconds). + EndTime int64 `protobuf:"varint,5,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` } func (m *BaseVestingAccount) Reset() { *m = BaseVestingAccount{} } @@ -72,7 +73,8 @@ var xxx_messageInfo_BaseVestingAccount proto.InternalMessageInfo // continuously vests by unlocking coins linearly with respect to time. type ContinuousVestingAccount struct { *BaseVestingAccount `protobuf:"bytes,1,opt,name=base_vesting_account,json=baseVestingAccount,proto3,embedded=base_vesting_account" json:"base_vesting_account,omitempty"` - StartTime int64 `protobuf:"varint,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + // Vesting start time, as unix timestamp (in seconds). + StartTime int64 `protobuf:"varint,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` } func (m *ContinuousVestingAccount) Reset() { *m = ContinuousVestingAccount{} } @@ -148,6 +150,7 @@ var xxx_messageInfo_DelayedVestingAccount proto.InternalMessageInfo // Period defines a length of time and amount of coins that will vest. type Period struct { + // Period duration in seconds. Length int64 `protobuf:"varint,1,opt,name=length,proto3" json:"length,omitempty"` Amount github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=amount,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"amount"` } diff --git a/x/distribution/keeper/delegation.go b/x/distribution/keeper/delegation.go index a5531e33f775..f94e1a73b4be 100644 --- a/x/distribution/keeper/delegation.go +++ b/x/distribution/keeper/delegation.go @@ -205,6 +205,7 @@ func (k Keeper) withdrawDelegationRewards(ctx sdk.Context, val stakingtypes.Vali types.EventTypeWithdrawRewards, sdk.NewAttribute(sdk.AttributeKeyAmount, emittedRewards.String()), sdk.NewAttribute(types.AttributeKeyValidator, val.GetOperator().String()), + sdk.NewAttribute(types.AttributeKeyDelegator, del.GetDelegatorAddr().String()), ), ) diff --git a/x/distribution/types/distribution.pb.go b/x/distribution/types/distribution.pb.go index 57858b3637d9..a1d4e49c4c75 100644 --- a/x/distribution/types/distribution.pb.go +++ b/x/distribution/types/distribution.pb.go @@ -80,12 +80,11 @@ func (m *Params) GetWithdrawAddrEnabled() bool { // The reference count indicates the number of objects // which might need to reference this historical entry at any point. // ReferenceCount = -// -// number of outstanding delegations which ended the associated period (and -// might need to read that record) -// + number of slashes which ended the associated period (and might need to -// read that record) -// + one per validator for the zeroeth period, set on initialization +// number of outstanding delegations which ended the associated period (and +// might need to read that record) +// + number of slashes which ended the associated period (and might need to +// read that record) +// + one per validator for the zeroeth period, set on initialization type ValidatorHistoricalRewards struct { CumulativeRewardRatio github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,1,rep,name=cumulative_reward_ratio,json=cumulativeRewardRatio,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"cumulative_reward_ratio"` ReferenceCount uint32 `protobuf:"varint,2,opt,name=reference_count,json=referenceCount,proto3" json:"reference_count,omitempty"` diff --git a/x/distribution/types/events.go b/x/distribution/types/events.go index ce4c0ef62e3c..9ca631db0076 100644 --- a/x/distribution/types/events.go +++ b/x/distribution/types/events.go @@ -11,6 +11,6 @@ const ( AttributeKeyWithdrawAddress = "withdraw_address" AttributeKeyValidator = "validator" - - AttributeValueCategory = ModuleName + AttributeKeyDelegator = "delegator" + AttributeValueCategory = ModuleName ) diff --git a/x/gov/migrations/v046/convert.go b/x/gov/migrations/v046/convert.go index e368a0b2b2b6..2c632a4124a6 100644 --- a/x/gov/migrations/v046/convert.go +++ b/x/gov/migrations/v046/convert.go @@ -49,7 +49,7 @@ func ConvertToLegacyProposal(proposal v1.Proposal) (v1beta1.Proposal, error) { return v1beta1.Proposal{}, err } if len(msgs) != 1 { - return v1beta1.Proposal{}, sdkerrors.ErrInvalidType.Wrap("can't convert a gov/v1 Proposal to gov/v1beta1 Proposal when amount of proposal messages is more than one") + return v1beta1.Proposal{}, sdkerrors.ErrInvalidType.Wrap("can't convert a gov/v1 Proposal to gov/v1beta1 Proposal when amount of proposal messages not exactly one") } if legacyMsg, ok := msgs[0].(*v1.MsgExecLegacyContent); ok { // check that the content struct can be unmarshalled diff --git a/x/group/client/cli/query.go b/x/group/client/cli/query.go index 1535566f525d..e7b866d92508 100644 --- a/x/group/client/cli/query.go +++ b/x/group/client/cli/query.go @@ -33,6 +33,7 @@ func QueryCmd(name string) *cobra.Command { QueryVotesByVoterCmd(), QueryGroupsByMemberCmd(), QueryTallyResultCmd(), + QueryGroupsCmd(), ) return queryCmd @@ -504,3 +505,37 @@ func QueryVotesByVoterCmd() *cobra.Command { return cmd } + +func QueryGroupsCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "groups", + Short: "Query for groups present in the state", + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + pageReq, err := client.ReadPageRequest(cmd.Flags()) + if err != nil { + return err + } + + queryClient := group.NewQueryClient(clientCtx) + + res, err := queryClient.Groups(cmd.Context(), &group.QueryGroupsRequest{ + Pagination: pageReq, + }) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + flags.AddPaginationFlagsToCmd(cmd, "groups") + + return cmd +} diff --git a/x/group/client/testutil/query.go b/x/group/client/testutil/query.go index 74c152b50978..28ec0746be81 100644 --- a/x/group/client/testutil/query.go +++ b/x/group/client/testutil/query.go @@ -149,6 +149,55 @@ func (s *IntegrationTestSuite) TestQueryGroupsByMembers() { } } +func (s *IntegrationTestSuite) TestQueryGroups() { + val := s.network.Validators[0] + clientCtx := val.ClientCtx + require := s.Require() + + testCases := []struct { + name string + args []string + expectErr bool + expectErrMsg string + numItems int + expectGroups []*group.GroupInfo + }{ + { + name: "valid req", + args: []string{fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, + expectErr: false, + numItems: 5, + }, + { + name: "valid req with pagination", + args: []string{ + "--limit=2", + fmt.Sprintf("--%s=json", tmcli.OutputFlag), + }, + expectErr: false, + numItems: 2, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := client.QueryGroupsCmd() + out, err := cli.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expectErr { + require.Contains(out.String(), tc.expectErrMsg) + } else { + require.NoError(err, out.String()) + + var resp group.QueryGroupsResponse + val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), &resp) + + require.Len(resp.Groups, tc.numItems) + } + }) + } +} + func (s *IntegrationTestSuite) TestQueryGroupMembers() { val := s.network.Validators[0] clientCtx := val.ClientCtx diff --git a/x/group/events.pb.go b/x/group/events.pb.go index 3cbcb2d491d6..c724b905da7c 100644 --- a/x/group/events.pb.go +++ b/x/group/events.pb.go @@ -464,6 +464,70 @@ func (m *EventLeaveGroup) GetAddress() string { return "" } +// EventProposalPruned is an event emitted when a proposal is pruned. +type EventProposalPruned struct { + // proposal_id is the unique ID of the proposal. + ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id,omitempty"` + // status is the proposal status (UNSPECIFIED, SUBMITTED, ACCEPTED, REJECTED, ABORTED, WITHDRAWN). + Status ProposalStatus `protobuf:"varint,2,opt,name=status,proto3,enum=cosmos.group.v1.ProposalStatus" json:"status,omitempty"` + // tally_result is the proposal tally result (when applicable). + TallyResult *TallyResult `protobuf:"bytes,3,opt,name=tally_result,json=tallyResult,proto3" json:"tally_result,omitempty"` +} + +func (m *EventProposalPruned) Reset() { *m = EventProposalPruned{} } +func (m *EventProposalPruned) String() string { return proto.CompactTextString(m) } +func (*EventProposalPruned) ProtoMessage() {} +func (*EventProposalPruned) Descriptor() ([]byte, []int) { + return fileDescriptor_e8d753981546f032, []int{9} +} +func (m *EventProposalPruned) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventProposalPruned) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventProposalPruned.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *EventProposalPruned) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventProposalPruned.Merge(m, src) +} +func (m *EventProposalPruned) XXX_Size() int { + return m.Size() +} +func (m *EventProposalPruned) XXX_DiscardUnknown() { + xxx_messageInfo_EventProposalPruned.DiscardUnknown(m) +} + +var xxx_messageInfo_EventProposalPruned proto.InternalMessageInfo + +func (m *EventProposalPruned) GetProposalId() uint64 { + if m != nil { + return m.ProposalId + } + return 0 +} + +func (m *EventProposalPruned) GetStatus() ProposalStatus { + if m != nil { + return m.Status + } + return PROPOSAL_STATUS_UNSPECIFIED +} + +func (m *EventProposalPruned) GetTallyResult() *TallyResult { + if m != nil { + return m.TallyResult + } + return nil +} + func init() { proto.RegisterType((*EventCreateGroup)(nil), "cosmos.group.v1.EventCreateGroup") proto.RegisterType((*EventUpdateGroup)(nil), "cosmos.group.v1.EventUpdateGroup") @@ -474,36 +538,41 @@ func init() { proto.RegisterType((*EventVote)(nil), "cosmos.group.v1.EventVote") proto.RegisterType((*EventExec)(nil), "cosmos.group.v1.EventExec") proto.RegisterType((*EventLeaveGroup)(nil), "cosmos.group.v1.EventLeaveGroup") + proto.RegisterType((*EventProposalPruned)(nil), "cosmos.group.v1.EventProposalPruned") } func init() { proto.RegisterFile("cosmos/group/v1/events.proto", fileDescriptor_e8d753981546f032) } var fileDescriptor_e8d753981546f032 = []byte{ - // 382 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x49, 0xce, 0x2f, 0xce, - 0xcd, 0x2f, 0xd6, 0x4f, 0x2f, 0xca, 0x2f, 0x2d, 0xd0, 0x2f, 0x33, 0xd4, 0x4f, 0x2d, 0x4b, 0xcd, - 0x2b, 0x29, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x87, 0xc8, 0xea, 0x81, 0x65, 0xf5, - 0xca, 0x0c, 0xa5, 0x24, 0x21, 0x02, 0xf1, 0x60, 0x69, 0x7d, 0xa8, 0x2c, 0x98, 0x23, 0x25, 0x8d, - 0x6e, 0x52, 0x49, 0x65, 0x41, 0x2a, 0x54, 0x52, 0x49, 0x97, 0x4b, 0xc0, 0x15, 0x64, 0xb0, 0x73, - 0x51, 0x6a, 0x62, 0x49, 0xaa, 0x3b, 0x48, 0x89, 0x90, 0x24, 0x17, 0x07, 0x58, 0x6d, 0x7c, 0x66, - 0x8a, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x4b, 0x10, 0x3b, 0x98, 0xef, 0x99, 0x02, 0x57, 0x1e, 0x5a, - 0x90, 0x42, 0x8c, 0x72, 0x1f, 0x2e, 0x31, 0x74, 0xd3, 0x03, 0xf2, 0x73, 0x32, 0x93, 0x2b, 0x85, - 0x8c, 0xb8, 0xd8, 0x13, 0x53, 0x52, 0x8a, 0x52, 0x8b, 0x8b, 0xc1, 0x7a, 0x38, 0x9d, 0x24, 0x2e, - 0x6d, 0xd1, 0x15, 0x81, 0xba, 0xdb, 0x11, 0x22, 0x13, 0x5c, 0x52, 0x94, 0x99, 0x97, 0x1e, 0x04, - 0x53, 0x08, 0x37, 0x0d, 0xc9, 0x72, 0x0a, 0x4c, 0x33, 0xe3, 0x12, 0x06, 0x9b, 0x16, 0x5c, 0x9a, - 0x94, 0x9b, 0x59, 0x12, 0x50, 0x94, 0x5f, 0x90, 0x5f, 0x9c, 0x98, 0x23, 0x24, 0xcf, 0xc5, 0x5d, - 0x00, 0x65, 0x23, 0x3c, 0xc4, 0x05, 0x13, 0xf2, 0x4c, 0x51, 0xb2, 0xe0, 0x12, 0x05, 0xeb, 0x0b, - 0xcf, 0x2c, 0xc9, 0x48, 0x29, 0x4a, 0x2c, 0x27, 0x5e, 0xa7, 0x0e, 0x17, 0x27, 0x58, 0x67, 0x58, - 0x7e, 0x49, 0x2a, 0x61, 0xd5, 0x8d, 0x8c, 0x50, 0xe5, 0xae, 0x15, 0xa9, 0xc9, 0x04, 0x95, 0x0b, - 0xd9, 0x73, 0xb1, 0x15, 0xa5, 0x16, 0x97, 0xe6, 0x94, 0x48, 0x30, 0x29, 0x30, 0x6a, 0xf0, 0x19, - 0xa9, 0xeb, 0xa1, 0x25, 0x11, 0x3d, 0x98, 0x43, 0x41, 0xe6, 0x95, 0x96, 0xe4, 0x17, 0x05, 0x81, - 0x95, 0x07, 0x41, 0xb5, 0x09, 0x09, 0x71, 0xb1, 0xe4, 0xe4, 0xa7, 0x17, 0x4b, 0x30, 0x83, 0x02, - 0x30, 0x08, 0xcc, 0x56, 0x4a, 0xe0, 0xe2, 0x07, 0x3b, 0xc1, 0x27, 0x35, 0xb1, 0x8c, 0x60, 0x6c, - 0x23, 0xc7, 0x02, 0x13, 0x91, 0xb1, 0xe0, 0x64, 0x77, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, - 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, - 0x72, 0x0c, 0x51, 0x2a, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xd0, 0xf4, - 0x0c, 0xa5, 0x74, 0x8b, 0x53, 0xb2, 0xf5, 0x2b, 0x20, 0xc9, 0x39, 0x89, 0x0d, 0x9c, 0x8c, 0x8d, - 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5b, 0xc0, 0x98, 0xf8, 0x2f, 0x03, 0x00, 0x00, + // 442 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x93, 0x4f, 0xef, 0xd2, 0x30, + 0x18, 0xc7, 0xe9, 0x4f, 0x02, 0x52, 0x8c, 0x98, 0xfa, 0x27, 0x03, 0xc9, 0x20, 0xc4, 0x44, 0x0e, + 0xb2, 0x05, 0x4c, 0xd4, 0x93, 0x44, 0x0c, 0x31, 0x24, 0x1c, 0xc8, 0xf0, 0x4f, 0xe2, 0x05, 0xc7, + 0xda, 0x8c, 0xc5, 0x41, 0x97, 0xb6, 0x9b, 0x70, 0xf4, 0x1d, 0xf8, 0x52, 0x3c, 0xf8, 0x22, 0x3c, + 0x12, 0x4f, 0x1e, 0x0d, 0xbc, 0x11, 0xb3, 0xae, 0x03, 0x82, 0x31, 0x23, 0xf9, 0x9d, 0x68, 0xfb, + 0xfd, 0x7c, 0xbf, 0x3c, 0x4f, 0x9f, 0x15, 0xd6, 0x1d, 0xca, 0x97, 0x94, 0x9b, 0x2e, 0xa3, 0x61, + 0x60, 0x46, 0x5d, 0x93, 0x44, 0x64, 0x25, 0xb8, 0x11, 0x30, 0x2a, 0x28, 0xaa, 0x24, 0xaa, 0x21, + 0x55, 0x23, 0xea, 0xd6, 0xaa, 0xc9, 0xc1, 0x4c, 0xca, 0xa6, 0x52, 0xe5, 0xa6, 0xf6, 0xf0, 0x3c, + 0x49, 0x6c, 0x02, 0xa2, 0xc4, 0x56, 0x07, 0xde, 0x19, 0xc6, 0xc1, 0xaf, 0x19, 0xb1, 0x05, 0x79, + 0x13, 0x23, 0xa8, 0x0a, 0x6f, 0x4a, 0x76, 0xe6, 0x61, 0x0d, 0x34, 0x41, 0x3b, 0x6f, 0x15, 0xe5, + 0x7e, 0x84, 0x0f, 0xf8, 0xbb, 0x00, 0x5f, 0x82, 0x8f, 0xe1, 0x83, 0xf3, 0xf4, 0x09, 0xf5, 0x3d, + 0x67, 0x83, 0x7a, 0xb0, 0x68, 0x63, 0xcc, 0x08, 0xe7, 0xd2, 0x53, 0x1a, 0x68, 0xbf, 0x7e, 0x74, + 0xee, 0xa9, 0xba, 0x5f, 0x25, 0xca, 0x54, 0x30, 0x6f, 0xe5, 0x5a, 0x29, 0x78, 0x48, 0x3b, 0xf9, + 0xf3, 0x6b, 0xa4, 0x3d, 0x83, 0x77, 0x65, 0xda, 0x34, 0x9c, 0x2f, 0x3d, 0x31, 0x61, 0x34, 0xa0, + 0xdc, 0xf6, 0x51, 0x03, 0x96, 0x03, 0xb5, 0x3e, 0x36, 0x04, 0xd3, 0xa3, 0x11, 0x6e, 0xbd, 0x80, + 0xf7, 0xa5, 0xef, 0x83, 0x27, 0x16, 0x98, 0xd9, 0x5f, 0x2e, 0x77, 0x3e, 0x81, 0x25, 0xe9, 0x7c, + 0x4f, 0x05, 0xc9, 0xa6, 0xbf, 0x02, 0x85, 0x0f, 0xd7, 0xc4, 0xc9, 0xc4, 0x51, 0x1f, 0x16, 0x18, + 0xe1, 0xa1, 0x2f, 0xb4, 0xab, 0x26, 0x68, 0xdf, 0xee, 0x3d, 0x36, 0xce, 0x3e, 0x11, 0x23, 0x2d, + 0x34, 0xce, 0x0b, 0x05, 0x65, 0x96, 0xc4, 0x2d, 0x65, 0x43, 0x08, 0xe6, 0x7d, 0xea, 0x72, 0xed, + 0x46, 0x7c, 0x81, 0x96, 0x5c, 0xb7, 0x3e, 0xc1, 0x8a, 0x2c, 0x61, 0x4c, 0xec, 0x28, 0x73, 0xda, + 0xa7, 0x53, 0xb8, 0xba, 0x74, 0x0a, 0xdf, 0x81, 0x1a, 0x43, 0x5a, 0xdd, 0x84, 0x85, 0x2b, 0x82, + 0xb3, 0xfb, 0x7d, 0x0e, 0x0b, 0x5c, 0xd8, 0x22, 0xe4, 0xaa, 0xdf, 0xc6, 0x7f, 0xfb, 0x9d, 0x4a, + 0xcc, 0x52, 0x38, 0xea, 0xc3, 0x5b, 0xc2, 0xf6, 0xfd, 0xcd, 0x4c, 0x5d, 0x57, 0xdc, 0x6f, 0xb9, + 0x57, 0xff, 0xc7, 0xfe, 0x36, 0x86, 0xd4, 0x1d, 0x95, 0xc5, 0x71, 0x33, 0x78, 0xf9, 0x73, 0xa7, + 0x83, 0xed, 0x4e, 0x07, 0x7f, 0x76, 0x3a, 0xf8, 0xb6, 0xd7, 0x73, 0xdb, 0xbd, 0x9e, 0xfb, 0xbd, + 0xd7, 0x73, 0x1f, 0x1f, 0xb9, 0x9e, 0x58, 0x84, 0x73, 0xc3, 0xa1, 0x4b, 0xf5, 0x04, 0xd5, 0x4f, + 0x87, 0xe3, 0xcf, 0xe6, 0x3a, 0x79, 0x81, 0xf3, 0x82, 0x7c, 0x79, 0x4f, 0xff, 0x06, 0x00, 0x00, + 0xff, 0xff, 0xa5, 0x1a, 0x1c, 0xb9, 0xe2, 0x03, 0x00, 0x00, } func (m *EventCreateGroup) Marshal() (dAtA []byte, err error) { @@ -781,6 +850,51 @@ func (m *EventLeaveGroup) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *EventProposalPruned) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventProposalPruned) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventProposalPruned) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.TallyResult != nil { + { + size, err := m.TallyResult.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Status != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x10 + } + if m.ProposalId != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.ProposalId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { offset -= sovEvents(v) base := offset @@ -913,6 +1027,25 @@ func (m *EventLeaveGroup) Size() (n int) { return n } +func (m *EventProposalPruned) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ProposalId != 0 { + n += 1 + sovEvents(uint64(m.ProposalId)) + } + if m.Status != 0 { + n += 1 + sovEvents(uint64(m.Status)) + } + if m.TallyResult != nil { + l = m.TallyResult.Size() + n += 1 + l + sovEvents(uint64(l)) + } + return n +} + func sovEvents(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1649,6 +1782,130 @@ func (m *EventLeaveGroup) Unmarshal(dAtA []byte) error { } return nil } +func (m *EventProposalPruned) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EventProposalPruned: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventProposalPruned: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ProposalId", wireType) + } + m.ProposalId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ProposalId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= ProposalStatus(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TallyResult", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TallyResult == nil { + m.TallyResult = &TallyResult{} + } + if err := m.TallyResult.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipEvents(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/group/keeper/genesis.go b/x/group/keeper/genesis.go index 2e0766ed716e..8043b52acce0 100644 --- a/x/group/keeper/genesis.go +++ b/x/group/keeper/genesis.go @@ -42,7 +42,8 @@ func (k Keeper) InitGenesis(ctx types.Context, cdc codec.JSONCodec, data json.Ra return []abci.ValidatorUpdate{} } -func (k Keeper) ExportGenesis(ctx types.Context, cdc codec.JSONCodec) *group.GenesisState { +// ExportGenesis returns the group module's exported genesis. +func (k Keeper) ExportGenesis(ctx types.Context, _ codec.JSONCodec) *group.GenesisState { genesisState := group.NewGenesisState() var groups []*group.GroupInfo diff --git a/x/group/keeper/grpc_query.go b/x/group/keeper/grpc_query.go index ff26844dde56..616f21133847 100644 --- a/x/group/keeper/grpc_query.go +++ b/x/group/keeper/grpc_query.go @@ -2,6 +2,7 @@ package keeper import ( "context" + "math" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -346,3 +347,25 @@ func (k Keeper) TallyResult(goCtx context.Context, request *group.QueryTallyResu Tally: tallyResult, }, nil } + +// Groups returns all the groups present in the state. +func (k Keeper) Groups(goCtx context.Context, request *group.QueryGroupsRequest) (*group.QueryGroupsResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + it, err := k.groupTable.PrefixScan(ctx.KVStore(k.key), 1, math.MaxUint64) + if err != nil { + return nil, err + } + defer it.Close() + + var groups []*group.GroupInfo + pageRes, err := orm.Paginate(it, request.Pagination, &groups) + if err != nil { + return nil, err + } + + return &group.QueryGroupsResponse{ + Groups: groups, + Pagination: pageRes, + }, nil +} diff --git a/x/group/keeper/keeper.go b/x/group/keeper/keeper.go index 210ce6014c58..02bd70d1206e 100644 --- a/x/group/keeper/keeper.go +++ b/x/group/keeper/keeper.go @@ -367,6 +367,15 @@ func (k Keeper) PruneProposals(ctx sdk.Context) error { if err != nil { return err } + // Emit event for proposal finalized with its result + if err := ctx.EventManager().EmitTypedEvent( + &group.EventProposalPruned{ + ProposalId: proposal.Id, + Status: proposal.Status, + TallyResult: &proposal.FinalTallyResult, + }); err != nil { + return err + } } return nil @@ -401,6 +410,14 @@ func (k Keeper) TallyProposalsAtVPEnd(ctx sdk.Context) error { if err := k.pruneVotes(ctx, proposalID); err != nil { return err } + // Emit event for proposal finalized with its result + if err := ctx.EventManager().EmitTypedEvent( + &group.EventProposalPruned{ + ProposalId: proposal.Id, + Status: proposal.Status, + }); err != nil { + return err + } } else if proposal.Status == group.PROPOSAL_STATUS_SUBMITTED { if err := k.doTallyAndUpdate(ctx, &proposal, electorate, policyInfo); err != nil { return sdkerrors.Wrap(err, "doTallyAndUpdate") diff --git a/x/group/keeper/keeper_test.go b/x/group/keeper/keeper_test.go index 56a748018965..e9c9aa9539cc 100644 --- a/x/group/keeper/keeper_test.go +++ b/x/group/keeper/keeper_test.go @@ -9,6 +9,7 @@ import ( "time" "github.com/stretchr/testify/suite" + abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtime "github.com/tendermint/tendermint/types/time" @@ -23,6 +24,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/group/module" ) +var EventProposalPruned = "cosmos.group.v1.EventProposalPruned" + const minExecutionPeriod = 5 * time.Second type TestSuite struct { @@ -1663,6 +1666,8 @@ func (s *TestSuite) TestSubmitProposal() { s.Require().Contains(fromBalances, sdk.NewInt64Coin("test", 9900)) toBalances := s.app.BankKeeper.GetAllBalances(sdkCtx, addr2) s.Require().Contains(toBalances, sdk.NewInt64Coin("test", 100)) + events := sdkCtx.EventManager().ABCIEvents() + s.Require().True(eventTypeFound(events, EventProposalPruned)) }, }, "with try exec, not enough yes votes for proposal to pass": { @@ -1751,6 +1756,7 @@ func (s *TestSuite) TestWithdrawProposal() { proposalId uint64 admin string expErrMsg string + postRun func(sdkCtx sdk.Context) }{ "wrong admin": { preRun: func(sdkCtx sdk.Context) uint64 { @@ -1758,6 +1764,7 @@ func (s *TestSuite) TestWithdrawProposal() { }, admin: addr5.String(), expErrMsg: "unauthorized", + postRun: func(sdkCtx sdk.Context) {}, }, "wrong proposalId": { preRun: func(sdkCtx sdk.Context) uint64 { @@ -1765,6 +1772,7 @@ func (s *TestSuite) TestWithdrawProposal() { }, admin: proposers[0], expErrMsg: "not found", + postRun: func(sdkCtx sdk.Context) {}, }, "happy case with proposer": { preRun: func(sdkCtx sdk.Context) uint64 { @@ -1772,6 +1780,7 @@ func (s *TestSuite) TestWithdrawProposal() { }, proposalId: proposalID, admin: proposers[0], + postRun: func(sdkCtx sdk.Context) {}, }, "already closed proposal": { preRun: func(sdkCtx sdk.Context) uint64 { @@ -1786,6 +1795,7 @@ func (s *TestSuite) TestWithdrawProposal() { proposalId: proposalID, admin: proposers[0], expErrMsg: "cannot withdraw a proposal with the status of PROPOSAL_STATUS_WITHDRAWN", + postRun: func(sdkCtx sdk.Context) {}, }, "happy case with group admin address": { preRun: func(sdkCtx sdk.Context) uint64 { @@ -1793,6 +1803,17 @@ func (s *TestSuite) TestWithdrawProposal() { }, proposalId: proposalID, admin: proposers[0], + postRun: func(sdkCtx sdk.Context) { + resp, err := s.keeper.Proposal(s.ctx, &group.QueryProposalRequest{ProposalId: proposalID}) + s.Require().NoError(err) + vpe := resp.Proposal.VotingPeriodEnd + timeDiff := vpe.Sub(s.sdkCtx.BlockTime()) + ctxVPE := sdkCtx.WithBlockTime(s.sdkCtx.BlockTime().Add(timeDiff).Add(time.Second * 1)) + s.Require().NoError(s.keeper.TallyProposalsAtVPEnd(ctxVPE)) + events := ctxVPE.EventManager().ABCIEvents() + + s.Require().True(eventTypeFound(events, EventProposalPruned)) + }, }, } for msg, spec := range specs { @@ -1815,6 +1836,7 @@ func (s *TestSuite) TestWithdrawProposal() { resp, err := s.keeper.Proposal(s.ctx, &group.QueryProposalRequest{ProposalId: pId}) s.Require().NoError(err) s.Require().Equal(resp.GetProposal().Status, group.PROPOSAL_STATUS_WITHDRAWN) + spec.postRun(s.sdkCtx) }) } } @@ -2316,6 +2338,7 @@ func (s *TestSuite) TestExecProposal() { expBalance bool expFromBalances sdk.Coin expToBalances sdk.Coin + postRun func(sdkCtx sdk.Context) }{ "proposal executed when accepted": { setupProposal: func(ctx context.Context) uint64 { @@ -2328,6 +2351,10 @@ func (s *TestSuite) TestExecProposal() { expBalance: true, expFromBalances: sdk.NewInt64Coin("test", 9900), expToBalances: sdk.NewInt64Coin("test", 100), + postRun: func(sdkCtx sdk.Context) { + events := sdkCtx.EventManager().ABCIEvents() + s.Require().True(eventTypeFound(events, EventProposalPruned)) + }, }, "proposal with multiple messages executed when accepted": { setupProposal: func(ctx context.Context) uint64 { @@ -2340,6 +2367,10 @@ func (s *TestSuite) TestExecProposal() { expBalance: true, expFromBalances: sdk.NewInt64Coin("test", 9800), expToBalances: sdk.NewInt64Coin("test", 200), + postRun: func(sdkCtx sdk.Context) { + events := sdkCtx.EventManager().ABCIEvents() + s.Require().True(eventTypeFound(events, EventProposalPruned)) + }, }, "proposal not executed when rejected": { setupProposal: func(ctx context.Context) uint64 { @@ -2349,6 +2380,7 @@ func (s *TestSuite) TestExecProposal() { srcBlockTime: s.blockTime.Add(minExecutionPeriod), // After min execution period end expProposalStatus: group.PROPOSAL_STATUS_REJECTED, expExecutorResult: group.PROPOSAL_EXECUTOR_RESULT_NOT_RUN, + postRun: func(sdkCtx sdk.Context) {}, }, "open proposal must not fail": { setupProposal: func(ctx context.Context) uint64 { @@ -2356,12 +2388,14 @@ func (s *TestSuite) TestExecProposal() { }, expProposalStatus: group.PROPOSAL_STATUS_SUBMITTED, expExecutorResult: group.PROPOSAL_EXECUTOR_RESULT_NOT_RUN, + postRun: func(sdkCtx sdk.Context) {}, }, "existing proposal required": { setupProposal: func(ctx context.Context) uint64 { return 9999 }, - expErr: true, + expErr: true, + postRun: func(sdkCtx sdk.Context) {}, }, "Decision policy also applied on exactly voting period end": { setupProposal: func(ctx context.Context) uint64 { @@ -2371,6 +2405,7 @@ func (s *TestSuite) TestExecProposal() { srcBlockTime: s.blockTime.Add(time.Second), // Voting period is 1s expProposalStatus: group.PROPOSAL_STATUS_REJECTED, expExecutorResult: group.PROPOSAL_EXECUTOR_RESULT_NOT_RUN, + postRun: func(sdkCtx sdk.Context) {}, }, "Decision policy also applied after voting period end": { setupProposal: func(ctx context.Context) uint64 { @@ -2380,6 +2415,7 @@ func (s *TestSuite) TestExecProposal() { srcBlockTime: s.blockTime.Add(time.Second).Add(time.Millisecond), // Voting period is 1s expProposalStatus: group.PROPOSAL_STATUS_REJECTED, expExecutorResult: group.PROPOSAL_EXECUTOR_RESULT_NOT_RUN, + postRun: func(sdkCtx sdk.Context) {}, }, "exec proposal before MinExecutionPeriod should fail": { setupProposal: func(ctx context.Context) uint64 { @@ -2389,6 +2425,7 @@ func (s *TestSuite) TestExecProposal() { srcBlockTime: s.blockTime.Add(4 * time.Second), // min execution date is 5s later after s.blockTime expProposalStatus: group.PROPOSAL_STATUS_ACCEPTED, expExecutorResult: group.PROPOSAL_EXECUTOR_RESULT_FAILURE, // Because MinExecutionPeriod has not passed + postRun: func(sdkCtx sdk.Context) {}, }, "exec proposal at exactly MinExecutionPeriod should pass": { setupProposal: func(ctx context.Context) uint64 { @@ -2398,6 +2435,10 @@ func (s *TestSuite) TestExecProposal() { srcBlockTime: s.blockTime.Add(5 * time.Second), // min execution date is 5s later after s.blockTime expProposalStatus: group.PROPOSAL_STATUS_ACCEPTED, expExecutorResult: group.PROPOSAL_EXECUTOR_RESULT_SUCCESS, + postRun: func(sdkCtx sdk.Context) { + events := sdkCtx.EventManager().ABCIEvents() + s.Require().True(eventTypeFound(events, EventProposalPruned)) + }, }, "prevent double execution when successful": { setupProposal: func(ctx context.Context) uint64 { @@ -2419,6 +2460,10 @@ func (s *TestSuite) TestExecProposal() { expBalance: true, expFromBalances: sdk.NewInt64Coin("test", 9900), expToBalances: sdk.NewInt64Coin("test", 100), + postRun: func(sdkCtx sdk.Context) { + events := sdkCtx.EventManager().ABCIEvents() + s.Require().True(eventTypeFound(events, EventProposalPruned)) + }, }, "rollback all msg updates on failure": { setupProposal: func(ctx context.Context) uint64 { @@ -2428,6 +2473,7 @@ func (s *TestSuite) TestExecProposal() { srcBlockTime: s.blockTime.Add(minExecutionPeriod), // After min execution period end expProposalStatus: group.PROPOSAL_STATUS_ACCEPTED, expExecutorResult: group.PROPOSAL_EXECUTOR_RESULT_FAILURE, + postRun: func(sdkCtx sdk.Context) {}, }, "executable when failed before": { setupProposal: func(ctx context.Context) uint64 { @@ -2444,6 +2490,10 @@ func (s *TestSuite) TestExecProposal() { srcBlockTime: s.blockTime.Add(minExecutionPeriod), // After min execution period end expProposalStatus: group.PROPOSAL_STATUS_ACCEPTED, expExecutorResult: group.PROPOSAL_EXECUTOR_RESULT_SUCCESS, + postRun: func(sdkCtx sdk.Context) { + events := sdkCtx.EventManager().ABCIEvents() + s.Require().True(eventTypeFound(events, EventProposalPruned)) + }, }, } for msg, spec := range specs { @@ -2487,6 +2537,8 @@ func (s *TestSuite) TestExecProposal() { toBalances := s.app.BankKeeper.GetAllBalances(sdkCtx, addr2) s.Require().Contains(toBalances, spec.expToBalances) } + + spec.postRun(sdkCtx) }) } } @@ -2629,6 +2681,8 @@ func (s *TestSuite) TestExecPrunedProposalsAndVotes() { res, err := s.keeper.VotesByProposal(ctx, &group.QueryVotesByProposalRequest{ProposalId: proposalID}) s.Require().NoError(err) s.Require().Empty(res.GetVotes()) + events := sdkCtx.EventManager().ABCIEvents() + s.Require().True(eventTypeFound(events, EventProposalPruned)) } else { // Check that proposal and votes exists @@ -3191,3 +3245,14 @@ func (s *TestSuite) TestTallyProposalsAtVPEnd_GroupMemberLeaving() { s.Require().NoError(s.app.GroupKeeper.TallyProposalsAtVPEnd(ctx)) s.NotPanics(func() { module.EndBlocker(ctx, s.app.GroupKeeper) }) } + +func eventTypeFound(events []abci.Event, eventType string) bool { + eventTypeFound := false + for _, e := range events { + if e.Type == eventType { + eventTypeFound = true + break + } + } + return eventTypeFound +} diff --git a/x/group/keeper/msg_server.go b/x/group/keeper/msg_server.go index 3947f0adad50..d4ffcdbbcffc 100644 --- a/x/group/keeper/msg_server.go +++ b/x/group/keeper/msg_server.go @@ -702,6 +702,7 @@ func (k Keeper) doTallyAndUpdate(ctx sdk.Context, p *group.Proposal, electorate } else { p.Status = group.PROPOSAL_STATUS_REJECTED } + } return nil @@ -773,6 +774,16 @@ func (k Keeper) Exec(goCtx context.Context, req *group.MsgExec) (*group.MsgExecR if err := k.pruneProposal(ctx, proposal.Id); err != nil { return nil, err } + + // Emit event for proposal finalized with its result + if err := ctx.EventManager().EmitTypedEvent( + &group.EventProposalPruned{ + ProposalId: proposal.Id, + Status: proposal.Status, + TallyResult: &proposal.FinalTallyResult, + }); err != nil { + return nil, err + } } else { store := ctx.KVStore(k.key) if err := k.proposalTable.Update(store, id, &proposal); err != nil { diff --git a/x/group/query.pb.go b/x/group/query.pb.go index 83056fe205dd..0756ee8d0d54 100644 --- a/x/group/query.pb.go +++ b/x/group/query.pb.go @@ -1380,6 +1380,111 @@ func (m *QueryTallyResultResponse) GetTally() TallyResult { return TallyResult{} } +// QueryGroupsRequest is the Query/Groups request type. +// +// Since: cosmos-sdk 0.47.1 +type QueryGroupsRequest struct { + // pagination defines an optional pagination for the request. + Pagination *query.PageRequest `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryGroupsRequest) Reset() { *m = QueryGroupsRequest{} } +func (m *QueryGroupsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryGroupsRequest) ProtoMessage() {} +func (*QueryGroupsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_0fcf9f1d74302290, []int{26} +} +func (m *QueryGroupsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryGroupsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryGroupsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryGroupsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryGroupsRequest.Merge(m, src) +} +func (m *QueryGroupsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryGroupsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryGroupsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryGroupsRequest proto.InternalMessageInfo + +func (m *QueryGroupsRequest) GetPagination() *query.PageRequest { + if m != nil { + return m.Pagination + } + return nil +} + +// QueryGroupsResponse is the Query/Groups response type. +// +// Since: cosmos-sdk 0.47.1 +type QueryGroupsResponse struct { + // `groups` is all the groups present in state. + Groups []*GroupInfo `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` + // pagination defines the pagination in the response. + Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryGroupsResponse) Reset() { *m = QueryGroupsResponse{} } +func (m *QueryGroupsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryGroupsResponse) ProtoMessage() {} +func (*QueryGroupsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_0fcf9f1d74302290, []int{27} +} +func (m *QueryGroupsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryGroupsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryGroupsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryGroupsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryGroupsResponse.Merge(m, src) +} +func (m *QueryGroupsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryGroupsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryGroupsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryGroupsResponse proto.InternalMessageInfo + +func (m *QueryGroupsResponse) GetGroups() []*GroupInfo { + if m != nil { + return m.Groups + } + return nil +} + +func (m *QueryGroupsResponse) GetPagination() *query.PageResponse { + if m != nil { + return m.Pagination + } + return nil +} + func init() { proto.RegisterType((*QueryGroupInfoRequest)(nil), "cosmos.group.v1.QueryGroupInfoRequest") proto.RegisterType((*QueryGroupInfoResponse)(nil), "cosmos.group.v1.QueryGroupInfoResponse") @@ -1407,91 +1512,95 @@ func init() { proto.RegisterType((*QueryGroupsByMemberResponse)(nil), "cosmos.group.v1.QueryGroupsByMemberResponse") proto.RegisterType((*QueryTallyResultRequest)(nil), "cosmos.group.v1.QueryTallyResultRequest") proto.RegisterType((*QueryTallyResultResponse)(nil), "cosmos.group.v1.QueryTallyResultResponse") + proto.RegisterType((*QueryGroupsRequest)(nil), "cosmos.group.v1.QueryGroupsRequest") + proto.RegisterType((*QueryGroupsResponse)(nil), "cosmos.group.v1.QueryGroupsResponse") } func init() { proto.RegisterFile("cosmos/group/v1/query.proto", fileDescriptor_0fcf9f1d74302290) } var fileDescriptor_0fcf9f1d74302290 = []byte{ - // 1249 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x98, 0xcf, 0x6f, 0xdc, 0x44, - 0x14, 0xc7, 0x33, 0x25, 0x69, 0x92, 0x97, 0xb6, 0x11, 0x43, 0x5a, 0x12, 0x37, 0xda, 0x04, 0x03, - 0xf9, 0x1d, 0x3b, 0xbb, 0x49, 0xd3, 0x8a, 0x9f, 0xea, 0x4a, 0x10, 0x72, 0x28, 0x4a, 0x97, 0x88, - 0x03, 0x97, 0xc8, 0x9b, 0x75, 0x8c, 0xc5, 0xae, 0x67, 0xbb, 0x76, 0x22, 0x56, 0xd1, 0x5e, 0x90, - 0xca, 0x01, 0x71, 0x00, 0x8a, 0x50, 0x89, 0x38, 0xf4, 0x80, 0x04, 0x7f, 0x00, 0x08, 0x89, 0x5b, - 0x6f, 0x3d, 0x56, 0x70, 0xe1, 0x84, 0x50, 0xc2, 0x1f, 0x82, 0x3c, 0xf3, 0xbc, 0xeb, 0xdf, 0xeb, - 0x15, 0x2b, 0xc8, 0xa9, 0x5d, 0xfb, 0xbd, 0x79, 0x9f, 0xf9, 0xbe, 0xe7, 0xf1, 0xd7, 0x81, 0xeb, - 0xfb, 0xcc, 0xae, 0x31, 0x5b, 0x35, 0x1a, 0xec, 0xb0, 0xae, 0x1e, 0xe5, 0xd5, 0x7b, 0x87, 0x7a, - 0xa3, 0xa9, 0xd4, 0x1b, 0xcc, 0x61, 0x74, 0x5c, 0xdc, 0x54, 0xf8, 0x4d, 0xe5, 0x28, 0x2f, 0x4d, - 0x18, 0xcc, 0x60, 0xfc, 0x9e, 0xea, 0xfe, 0x4f, 0x84, 0x49, 0xd3, 0x06, 0x63, 0x46, 0x55, 0x57, - 0xb5, 0xba, 0xa9, 0x6a, 0x96, 0xc5, 0x1c, 0xcd, 0x31, 0x99, 0x65, 0xe3, 0xdd, 0x48, 0x05, 0xa7, - 0x59, 0xd7, 0xbd, 0x9b, 0x4b, 0x78, 0xb3, 0xac, 0xd9, 0xba, 0x28, 0xad, 0x1e, 0xe5, 0xcb, 0xba, - 0xa3, 0xe5, 0xd5, 0xba, 0x66, 0x98, 0x16, 0x5f, 0x09, 0x63, 0xa7, 0x44, 0xec, 0x9e, 0xa8, 0x8f, - 0x68, 0xfc, 0x87, 0x5c, 0x80, 0xab, 0x77, 0xdd, 0xe4, 0x2d, 0xb7, 0xc6, 0xb6, 0x75, 0xc0, 0x4a, - 0xfa, 0xbd, 0x43, 0xdd, 0x76, 0xe8, 0x14, 0x8c, 0xf0, 0xba, 0x7b, 0x66, 0x65, 0x92, 0xcc, 0x92, - 0x85, 0xc1, 0xd2, 0x30, 0xff, 0xbd, 0x5d, 0x91, 0xdf, 0x81, 0x6b, 0xe1, 0x1c, 0xbb, 0xce, 0x2c, - 0x5b, 0xa7, 0x0a, 0x0c, 0x9a, 0xd6, 0x01, 0xe3, 0x09, 0x63, 0x05, 0x49, 0x09, 0xa9, 0xa0, 0x74, - 0x32, 0x78, 0x9c, 0x7c, 0x17, 0xae, 0x77, 0x56, 0xda, 0x61, 0x55, 0x73, 0xbf, 0xe9, 0x67, 0x28, - 0xc0, 0xb0, 0x56, 0xa9, 0x34, 0x74, 0xdb, 0xe6, 0x2b, 0x8e, 0x16, 0x27, 0x7f, 0xfb, 0x69, 0x75, - 0x02, 0x17, 0xbd, 0x2d, 0xee, 0xbc, 0xe7, 0x34, 0x4c, 0xcb, 0x28, 0x79, 0x81, 0xf2, 0x2e, 0x4c, - 0xc7, 0x2f, 0x89, 0x88, 0x1b, 0x01, 0xc4, 0xd9, 0x78, 0x44, 0x5f, 0x9e, 0x00, 0x6d, 0xc1, 0x64, - 0x67, 0xd5, 0x3b, 0x7a, 0xad, 0xac, 0x37, 0xec, 0xee, 0x4a, 0xd1, 0xb7, 0x01, 0x3a, 0xcd, 0x98, - 0xbc, 0xc0, 0x4b, 0xce, 0x79, 0x25, 0xdd, 0xce, 0x29, 0x62, 0x68, 0xb0, 0x73, 0xca, 0x8e, 0x66, - 0xe8, 0xb8, 0x6c, 0xc9, 0x97, 0x29, 0x7f, 0x47, 0x60, 0x2a, 0xa6, 0x3e, 0x6e, 0x69, 0x13, 0x86, - 0x6b, 0xe2, 0xd2, 0x24, 0x99, 0x7d, 0x66, 0x61, 0xac, 0x30, 0x1d, 0xbf, 0x2b, 0x91, 0x57, 0xf2, - 0x82, 0xe9, 0x56, 0x0c, 0xdd, 0x7c, 0x57, 0x3a, 0x51, 0x34, 0x80, 0xf7, 0x20, 0x80, 0x67, 0x17, - 0x9b, 0xb7, 0x2b, 0x35, 0xd3, 0xf2, 0xf4, 0x51, 0x60, 0x48, 0x73, 0x7f, 0x77, 0xed, 0xa1, 0x08, - 0xeb, 0x9b, 0x68, 0xdf, 0x12, 0x90, 0xe2, 0xa8, 0x50, 0xb5, 0x02, 0x5c, 0xe4, 0xf2, 0x78, 0xa2, - 0xa5, 0x4d, 0x2b, 0x46, 0xf6, 0x4f, 0xb1, 0xfb, 0x04, 0x66, 0x43, 0x63, 0x6a, 0xea, 0x76, 0x51, - 0xfc, 0xfc, 0x0f, 0x07, 0xeb, 0x67, 0x02, 0x2f, 0xa4, 0x70, 0xa0, 0x54, 0x5b, 0x70, 0x45, 0x80, - 0xd4, 0x31, 0x00, 0x25, 0xeb, 0xfe, 0xf4, 0x5c, 0x36, 0xfc, 0xeb, 0xf6, 0x4f, 0xbf, 0x93, 0x04, - 0xfd, 0xce, 0xc5, 0xe0, 0x25, 0x89, 0x1a, 0x9c, 0xbf, 0xf3, 0x27, 0xea, 0x4d, 0x98, 0xe0, 0xd8, - 0x3b, 0x0d, 0x56, 0x67, 0xb6, 0x56, 0xf5, 0x74, 0x9c, 0x81, 0xb1, 0x3a, 0x5e, 0xea, 0x8c, 0x22, - 0x78, 0x97, 0xb6, 0x2b, 0xf2, 0xbb, 0xf8, 0x12, 0xe9, 0x24, 0xe2, 0x1e, 0x6f, 0xc0, 0x88, 0x17, - 0x86, 0x07, 0xee, 0x54, 0x64, 0x77, 0xed, 0xa4, 0x76, 0xa8, 0xfc, 0x88, 0x80, 0x1c, 0x58, 0xd0, - 0x9b, 0x48, 0x21, 0xc2, 0xbf, 0x78, 0x3d, 0xf4, 0xad, 0xc7, 0x3f, 0x10, 0x78, 0x31, 0x15, 0x11, - 0x15, 0xb8, 0x09, 0xa3, 0xde, 0xb6, 0xbc, 0x06, 0xa7, 0x48, 0xd0, 0x89, 0xed, 0x5f, 0x57, 0x1b, - 0x30, 0xc3, 0x41, 0xdf, 0x67, 0x8e, 0x5e, 0x6c, 0xe3, 0xba, 0xbf, 0x1a, 0x59, 0x1b, 0xec, 0x3e, - 0x49, 0x47, 0x6e, 0x02, 0xe7, 0x48, 0x7d, 0x92, 0x78, 0x98, 0x7c, 0x07, 0x9f, 0xce, 0xd8, 0x9a, - 0xa8, 0xcc, 0x22, 0x0c, 0xba, 0xc1, 0x38, 0x17, 0x57, 0x23, 0xa2, 0xb8, 0xd1, 0x25, 0x1e, 0x22, - 0x7f, 0x4a, 0xd0, 0x27, 0xb8, 0xd7, 0xec, 0x62, 0xcf, 0x03, 0xda, 0xb7, 0xae, 0x7f, 0x4d, 0xd0, - 0x5d, 0x44, 0x40, 0x70, 0x53, 0xcb, 0x42, 0x28, 0xaf, 0xd5, 0x09, 0xbb, 0x12, 0x31, 0xfd, 0x6b, - 0xf1, 0x57, 0x04, 0xed, 0x09, 0x62, 0x05, 0x9a, 0xdb, 0xee, 0x1d, 0xc9, 0xd4, 0xbb, 0xbe, 0x69, - 0xf5, 0xa5, 0x67, 0x0a, 0x82, 0x50, 0xff, 0xab, 0x50, 0x0f, 0xc3, 0x96, 0x00, 0x2d, 0xd1, 0x39, - 0x38, 0x50, 0x4e, 0x88, 0xdf, 0x0b, 0xfb, 0xd0, 0xce, 0x83, 0x5d, 0x79, 0x05, 0x9e, 0xe7, 0x6c, - 0xbb, 0x5a, 0xb5, 0xea, 0x9e, 0x6d, 0x87, 0x55, 0x27, 0xf3, 0xcb, 0x61, 0x17, 0x67, 0x33, 0x90, - 0x8b, 0x9b, 0xba, 0x05, 0x43, 0x8e, 0x7b, 0x19, 0x0f, 0x81, 0xa8, 0x6f, 0xf5, 0x25, 0x15, 0x07, - 0x9f, 0xfc, 0x39, 0x33, 0x50, 0x12, 0x09, 0x85, 0xfb, 0xcf, 0xc2, 0x10, 0x5f, 0x96, 0x7e, 0x4e, - 0x60, 0xb4, 0xbd, 0x75, 0x3a, 0x17, 0x59, 0x22, 0xf6, 0xf3, 0x46, 0x9a, 0xef, 0x1a, 0x27, 0x10, - 0x65, 0xe5, 0x93, 0xdf, 0xff, 0x7e, 0x70, 0x61, 0x81, 0xce, 0xa9, 0xe1, 0xaf, 0x31, 0xf4, 0x66, - 0xd6, 0x01, 0x53, 0x8f, 0x3d, 0x9f, 0xd6, 0xa2, 0xdf, 0x13, 0x18, 0x0f, 0xbd, 0xb0, 0xe9, 0x4a, - 0x4a, 0xb1, 0xc8, 0x57, 0x8f, 0xb4, 0x9a, 0x31, 0x1a, 0x01, 0x37, 0x38, 0xa0, 0x42, 0x57, 0x12, - 0x00, 0xb9, 0xbd, 0x68, 0x22, 0x27, 0x4e, 0x6d, 0x8b, 0x3e, 0x24, 0x70, 0xc9, 0xff, 0x31, 0x41, - 0x17, 0x53, 0xaa, 0x06, 0x3f, 0x78, 0xa4, 0xa5, 0x2c, 0xa1, 0x48, 0x97, 0xe7, 0x74, 0xcb, 0x74, - 0x31, 0x81, 0x0e, 0xbf, 0x45, 0xfc, 0x0a, 0x9e, 0x10, 0xb8, 0x1c, 0xb0, 0xec, 0x34, 0xad, 0x60, - 0xc8, 0xf4, 0x49, 0xcb, 0x99, 0x62, 0x91, 0x6e, 0x8d, 0xd3, 0x2d, 0xd1, 0x85, 0x78, 0x3a, 0x7b, - 0xaf, 0xdc, 0xdc, 0xe3, 0xde, 0xd0, 0x55, 0xae, 0x66, 0x5a, 0x2d, 0xfa, 0x2b, 0x81, 0x89, 0x38, - 0xaf, 0x4c, 0xf3, 0xdd, 0xba, 0x16, 0xf1, 0xf7, 0x52, 0xa1, 0x97, 0x14, 0x24, 0x7e, 0x95, 0x13, - 0xdf, 0xa0, 0xeb, 0x69, 0xdd, 0x36, 0x75, 0x4e, 0x2e, 0x6e, 0xf9, 0x94, 0xfd, 0x25, 0x0a, 0x2f, - 0x04, 0xce, 0x06, 0x1f, 0xd0, 0xb9, 0xd0, 0x4b, 0x0a, 0xc2, 0xdf, 0xe2, 0xf0, 0x05, 0xba, 0x96, - 0x01, 0x3e, 0x28, 0xfb, 0x67, 0x04, 0x46, 0xbc, 0x97, 0x2d, 0x7d, 0x39, 0xbe, 0x74, 0xc8, 0x15, - 0x48, 0x73, 0xdd, 0xc2, 0x90, 0x4a, 0xe5, 0x54, 0x8b, 0x74, 0x3e, 0x42, 0xe5, 0x9d, 0x62, 0xea, - 0xb1, 0xef, 0x88, 0x6b, 0xd1, 0xc7, 0x04, 0xae, 0xc5, 0xdb, 0x3e, 0xba, 0x9e, 0x5e, 0x33, 0xd6, - 0xc7, 0x4a, 0x1b, 0xbd, 0x25, 0x21, 0xf6, 0x6b, 0x1c, 0x7b, 0x93, 0x6e, 0x24, 0x62, 0x77, 0x86, - 0x00, 0x0f, 0x01, 0xdf, 0xf3, 0xff, 0x98, 0xc0, 0x73, 0x31, 0xee, 0x8c, 0xae, 0xc5, 0xb3, 0x24, - 0x9b, 0x47, 0x29, 0xdf, 0x43, 0x06, 0xa2, 0xbf, 0xc5, 0xd1, 0xdf, 0xa4, 0xaf, 0x47, 0xd0, 0xdd, - 0xf7, 0xbd, 0x4b, 0xdd, 0xd6, 0x9b, 0x7b, 0x92, 0xa0, 0xfe, 0xea, 0x31, 0xbf, 0xd8, 0xa2, 0x3f, - 0x12, 0x18, 0x0f, 0x19, 0xb1, 0xa4, 0xa3, 0x36, 0xde, 0x38, 0x26, 0x1d, 0xb5, 0x09, 0xee, 0x2e, - 0x65, 0x7e, 0xb9, 0x4f, 0xf1, 0x83, 0x87, 0x46, 0xe6, 0x1b, 0x02, 0x97, 0xfc, 0x3e, 0x28, 0xe9, - 0xb8, 0x8d, 0x31, 0x70, 0x49, 0xc7, 0x6d, 0x9c, 0xad, 0x4a, 0x99, 0xe5, 0x36, 0x21, 0x2a, 0x8a, - 0x1a, 0x3e, 0x22, 0x70, 0x25, 0xe8, 0x38, 0x68, 0x97, 0x13, 0x34, 0x60, 0x99, 0xa4, 0x95, 0x6c, - 0xc1, 0x88, 0xb7, 0xce, 0xf1, 0x56, 0xe9, 0x72, 0xca, 0x79, 0x2b, 0xde, 0x08, 0xbe, 0x51, 0x3d, - 0x21, 0x30, 0xe6, 0xf3, 0x01, 0x74, 0x21, 0xbe, 0x64, 0xd4, 0x9b, 0x48, 0x8b, 0x19, 0x22, 0x91, - 0x6c, 0x93, 0x93, 0xad, 0x51, 0x25, 0xf9, 0x69, 0x0a, 0x4d, 0x21, 0xf7, 0x21, 0xc5, 0x37, 0x9e, - 0x9c, 0xe6, 0xc8, 0xd3, 0xd3, 0x1c, 0xf9, 0xeb, 0x34, 0x47, 0xbe, 0x38, 0xcb, 0x0d, 0x3c, 0x3d, - 0xcb, 0x0d, 0xfc, 0x71, 0x96, 0x1b, 0xf8, 0xe0, 0x25, 0xc3, 0x74, 0x3e, 0x3c, 0x2c, 0x2b, 0xfb, - 0xac, 0xe6, 0xad, 0x29, 0xfe, 0x59, 0xb5, 0x2b, 0x1f, 0xa9, 0x1f, 0x8b, 0x02, 0xe5, 0x8b, 0xfc, - 0xcf, 0xb0, 0xeb, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x11, 0xfe, 0x04, 0xa9, 0x4e, 0x16, 0x00, - 0x00, + // 1292 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x98, 0x4b, 0x6f, 0x1b, 0x55, + 0x14, 0xc7, 0x73, 0x4b, 0x9e, 0x27, 0x6d, 0x23, 0x6e, 0xd3, 0x36, 0x99, 0x46, 0x4e, 0x98, 0x96, + 0xbc, 0x33, 0x13, 0x3b, 0x69, 0x5a, 0xf1, 0x54, 0x2d, 0x41, 0xc8, 0xa2, 0x28, 0x35, 0x11, 0x0b, + 0x84, 0x14, 0x8d, 0xe3, 0x89, 0x19, 0x61, 0xcf, 0xb8, 0x9e, 0x49, 0x84, 0x15, 0x79, 0x83, 0x04, + 0x0b, 0xc4, 0x02, 0x5a, 0x84, 0x4a, 0xc4, 0xa2, 0x0b, 0x24, 0xf8, 0x00, 0x20, 0x24, 0x76, 0xdd, + 0x75, 0x59, 0xc1, 0x86, 0x15, 0x42, 0x09, 0xdf, 0x82, 0x0d, 0x9a, 0x7b, 0xcf, 0xb5, 0xe7, 0xed, + 0x89, 0xb0, 0xc0, 0xab, 0x76, 0x66, 0xce, 0xb9, 0xe7, 0x37, 0xff, 0x73, 0xe6, 0xfa, 0x7f, 0x03, + 0xd7, 0xf6, 0x2c, 0xbb, 0x6a, 0xd9, 0x6a, 0xb9, 0x6e, 0x1d, 0xd4, 0xd4, 0xc3, 0xac, 0x7a, 0xff, + 0x40, 0xaf, 0x37, 0x94, 0x5a, 0xdd, 0x72, 0x2c, 0x3a, 0xc6, 0x1f, 0x2a, 0xec, 0xa1, 0x72, 0x98, + 0x95, 0xc6, 0xcb, 0x56, 0xd9, 0x62, 0xcf, 0x54, 0xf7, 0x7f, 0x3c, 0x4c, 0x9a, 0x2a, 0x5b, 0x56, + 0xb9, 0xa2, 0xab, 0x5a, 0xcd, 0x50, 0x35, 0xd3, 0xb4, 0x1c, 0xcd, 0x31, 0x2c, 0xd3, 0xc6, 0xa7, + 0xa1, 0x0a, 0x4e, 0xa3, 0xa6, 0x8b, 0x87, 0x8b, 0xf8, 0xb0, 0xa8, 0xd9, 0x3a, 0x2f, 0xad, 0x1e, + 0x66, 0x8b, 0xba, 0xa3, 0x65, 0xd5, 0x9a, 0x56, 0x36, 0x4c, 0xb6, 0x12, 0xc6, 0x4e, 0xf2, 0xd8, + 0x5d, 0x5e, 0x1f, 0xd1, 0xd8, 0x85, 0x9c, 0x83, 0xcb, 0xf7, 0xdc, 0xe4, 0x4d, 0xb7, 0xc6, 0x96, + 0xb9, 0x6f, 0x15, 0xf4, 0xfb, 0x07, 0xba, 0xed, 0xd0, 0x49, 0x18, 0x66, 0x75, 0x77, 0x8d, 0xd2, + 0x04, 0x99, 0x21, 0xf3, 0xfd, 0x85, 0x21, 0x76, 0xbd, 0x55, 0x92, 0xdf, 0x82, 0x2b, 0xc1, 0x1c, + 0xbb, 0x66, 0x99, 0xb6, 0x4e, 0x15, 0xe8, 0x37, 0xcc, 0x7d, 0x8b, 0x25, 0x8c, 0xe6, 0x24, 0x25, + 0xa0, 0x82, 0xd2, 0xce, 0x60, 0x71, 0xf2, 0x3d, 0xb8, 0xd6, 0x5e, 0x69, 0xdb, 0xaa, 0x18, 0x7b, + 0x0d, 0x2f, 0x43, 0x0e, 0x86, 0xb4, 0x52, 0xa9, 0xae, 0xdb, 0x36, 0x5b, 0x71, 0x24, 0x3f, 0xf1, + 0xeb, 0x8f, 0x2b, 0xe3, 0xb8, 0xe8, 0x1d, 0xfe, 0xe4, 0x1d, 0xa7, 0x6e, 0x98, 0xe5, 0x82, 0x08, + 0x94, 0x77, 0x60, 0x2a, 0x7a, 0x49, 0x44, 0x5c, 0xf7, 0x21, 0xce, 0x44, 0x23, 0x7a, 0xf2, 0x38, + 0x68, 0x13, 0x26, 0xda, 0xab, 0xde, 0xd5, 0xab, 0x45, 0xbd, 0x6e, 0x77, 0x56, 0x8a, 0xbe, 0x09, + 0xd0, 0x6e, 0xc6, 0xc4, 0x39, 0x56, 0x72, 0x56, 0x94, 0x74, 0x3b, 0xa7, 0xf0, 0xa1, 0xc1, 0xce, + 0x29, 0xdb, 0x5a, 0x59, 0xc7, 0x65, 0x0b, 0x9e, 0x4c, 0xf9, 0x5b, 0x02, 0x93, 0x11, 0xf5, 0xf1, + 0x95, 0x36, 0x60, 0xa8, 0xca, 0x6f, 0x4d, 0x90, 0x99, 0xe7, 0xe6, 0x47, 0x73, 0x53, 0xd1, 0x6f, + 0xc5, 0xf3, 0x0a, 0x22, 0x98, 0x6e, 0x46, 0xd0, 0xcd, 0x75, 0xa4, 0xe3, 0x45, 0x7d, 0x78, 0x0f, + 0x7d, 0x78, 0x76, 0xbe, 0x71, 0xa7, 0x54, 0x35, 0x4c, 0xa1, 0x8f, 0x02, 0x03, 0x9a, 0x7b, 0xdd, + 0xb1, 0x87, 0x3c, 0xac, 0x6b, 0xa2, 0x7d, 0x43, 0x40, 0x8a, 0xa2, 0x42, 0xd5, 0x72, 0x30, 0xc8, + 0xe4, 0x11, 0xa2, 0x25, 0x4d, 0x2b, 0x46, 0x76, 0x4f, 0xb1, 0x4f, 0x08, 0xcc, 0x04, 0xc6, 0xd4, + 0xd0, 0xed, 0x3c, 0xbf, 0xfc, 0x0f, 0x07, 0xeb, 0x27, 0x02, 0x2f, 0x24, 0x70, 0xa0, 0x54, 0x9b, + 0x70, 0x91, 0x83, 0xd4, 0x30, 0x00, 0x25, 0xeb, 0xfc, 0xf5, 0x5c, 0x28, 0x7b, 0xd7, 0xed, 0x9e, + 0x7e, 0xc7, 0x31, 0xfa, 0xf5, 0xc4, 0xe0, 0xc5, 0x89, 0xea, 0x9f, 0xbf, 0xde, 0x13, 0xf5, 0x16, + 0x8c, 0x33, 0xec, 0xed, 0xba, 0x55, 0xb3, 0x6c, 0xad, 0x22, 0x74, 0x9c, 0x86, 0xd1, 0x1a, 0xde, + 0x6a, 0x8f, 0x22, 0x88, 0x5b, 0x5b, 0x25, 0xf9, 0x6d, 0xfc, 0x11, 0x69, 0x27, 0xe2, 0x3b, 0xde, + 0x84, 0x61, 0x11, 0x86, 0x1b, 0xee, 0x64, 0xe8, 0xed, 0x5a, 0x49, 0xad, 0x50, 0xf9, 0x31, 0x01, + 0xd9, 0xb7, 0xa0, 0x98, 0x48, 0x2e, 0xc2, 0xbf, 0xf8, 0x79, 0xe8, 0x5a, 0x8f, 0xbf, 0x27, 0x70, + 0x3d, 0x11, 0x11, 0x15, 0xb8, 0x05, 0x23, 0xe2, 0xb5, 0x44, 0x83, 0x13, 0x24, 0x68, 0xc7, 0x76, + 0xaf, 0xab, 0x75, 0x98, 0x66, 0xa0, 0xef, 0x5a, 0x8e, 0x9e, 0x6f, 0xe1, 0xba, 0x57, 0xf5, 0xb4, + 0x0d, 0x76, 0xbf, 0xa4, 0x43, 0x37, 0x81, 0x71, 0x24, 0x7e, 0x49, 0x2c, 0x4c, 0xbe, 0x8b, 0x5f, + 0x67, 0x64, 0x4d, 0x54, 0x66, 0x01, 0xfa, 0xdd, 0x60, 0x9c, 0x8b, 0xcb, 0x21, 0x51, 0xdc, 0xe8, + 0x02, 0x0b, 0x91, 0x3f, 0x25, 0xe8, 0x13, 0xdc, 0x7b, 0x76, 0xfe, 0xcc, 0x03, 0xda, 0xb5, 0xae, + 0x7f, 0x45, 0xd0, 0x5d, 0x84, 0x40, 0xf0, 0xa5, 0x96, 0xb8, 0x50, 0xa2, 0xd5, 0x31, 0x6f, 0xc5, + 0x63, 0xba, 0xd7, 0xe2, 0x07, 0x04, 0xed, 0x09, 0x62, 0xf9, 0x9a, 0xdb, 0xea, 0x1d, 0x49, 0xd5, + 0xbb, 0xae, 0x69, 0xf5, 0xa5, 0x30, 0x05, 0x7e, 0xa8, 0xff, 0x55, 0xa8, 0x47, 0x41, 0x4b, 0x80, + 0x96, 0xa8, 0x07, 0x36, 0x94, 0x63, 0xe2, 0xf5, 0xc2, 0x1e, 0xb4, 0x5e, 0xb0, 0x2b, 0x2f, 0xc1, + 0x55, 0xc6, 0xb6, 0xa3, 0x55, 0x2a, 0xee, 0xde, 0x76, 0x50, 0x71, 0x52, 0xff, 0x38, 0xec, 0xe0, + 0x6c, 0xfa, 0x72, 0xf1, 0xa5, 0x6e, 0xc3, 0x80, 0xe3, 0xde, 0xc6, 0x4d, 0x20, 0xec, 0x5b, 0x3d, + 0x49, 0xf9, 0xfe, 0xa7, 0x7f, 0x4c, 0xf7, 0x15, 0x78, 0x82, 0xfc, 0x3e, 0x50, 0x8f, 0x5a, 0x02, + 0xa6, 0x5b, 0xcd, 0x78, 0x40, 0xe0, 0x92, 0x6f, 0xf9, 0x1e, 0x68, 0x42, 0xee, 0xef, 0xe7, 0x61, + 0x80, 0x41, 0xd1, 0xcf, 0x09, 0x8c, 0xb4, 0x0a, 0xd1, 0xd9, 0x10, 0x44, 0xe4, 0x89, 0x4e, 0x9a, + 0xeb, 0x18, 0xc7, 0x8b, 0xca, 0xca, 0xc7, 0xbf, 0xfd, 0xf5, 0xf0, 0xdc, 0x3c, 0x9d, 0x55, 0x83, + 0x07, 0x50, 0xb4, 0xa3, 0xe6, 0xbe, 0xa5, 0x1e, 0x09, 0x6b, 0xda, 0xa4, 0xdf, 0x11, 0x18, 0x0b, + 0x78, 0x14, 0xba, 0x9c, 0x50, 0x2c, 0x74, 0xd0, 0x93, 0x56, 0x52, 0x46, 0x23, 0xe0, 0x3a, 0x03, + 0x54, 0xe8, 0x72, 0x0c, 0x20, 0x73, 0x54, 0x0d, 0xe4, 0xc4, 0x0f, 0xb5, 0x49, 0x1f, 0x11, 0x38, + 0xef, 0x3d, 0x3f, 0xd1, 0x85, 0x84, 0xaa, 0xfe, 0x33, 0x9e, 0xb4, 0x98, 0x26, 0x14, 0xe9, 0xb2, + 0x8c, 0x6e, 0x89, 0x2e, 0xc4, 0xd0, 0xe1, 0xf1, 0xcb, 0xab, 0xe0, 0x31, 0x81, 0x0b, 0xbe, 0x53, + 0x0a, 0x4d, 0x2a, 0x18, 0xf0, 0xb9, 0xd2, 0x52, 0xaa, 0x58, 0xa4, 0x5b, 0x65, 0x74, 0x8b, 0x74, + 0x3e, 0x9a, 0xce, 0xde, 0x2d, 0x36, 0x76, 0x99, 0x1d, 0x76, 0x95, 0xab, 0x1a, 0x66, 0x93, 0xfe, + 0x42, 0x60, 0x3c, 0xea, 0x78, 0x40, 0xb3, 0x9d, 0xba, 0x16, 0x3a, 0xd2, 0x48, 0xb9, 0xb3, 0xa4, + 0x20, 0xf1, 0xcb, 0x8c, 0xf8, 0x26, 0x5d, 0x4b, 0xea, 0xb6, 0xa1, 0x33, 0x72, 0xfe, 0xc8, 0xa3, + 0xec, 0xcf, 0x61, 0x78, 0x2e, 0x70, 0x3a, 0x78, 0x9f, 0xce, 0xb9, 0xb3, 0xa4, 0x20, 0xfc, 0x6d, + 0x06, 0x9f, 0xa3, 0xab, 0x29, 0xe0, 0xfd, 0xb2, 0x7f, 0x46, 0x60, 0x58, 0xf8, 0x0b, 0xfa, 0x62, + 0x74, 0xe9, 0x80, 0x11, 0x92, 0x66, 0x3b, 0x85, 0x21, 0x95, 0xca, 0xa8, 0x16, 0xe8, 0x5c, 0x88, + 0x4a, 0x6c, 0xdc, 0xea, 0x91, 0x67, 0x57, 0x6f, 0xd2, 0x27, 0x04, 0xae, 0x44, 0x3b, 0x5d, 0xba, + 0x96, 0x5c, 0x33, 0xd2, 0xba, 0x4b, 0xeb, 0x67, 0x4b, 0x42, 0xec, 0x57, 0x18, 0xf6, 0x06, 0x5d, + 0x8f, 0xc5, 0x6e, 0x0f, 0x01, 0x6e, 0x02, 0x9e, 0xef, 0xff, 0x09, 0x81, 0x4b, 0x11, 0x86, 0x94, + 0xae, 0x46, 0xb3, 0xc4, 0xfb, 0x65, 0x29, 0x7b, 0x86, 0x0c, 0x44, 0x7f, 0x83, 0xa1, 0xbf, 0x4e, + 0x5f, 0x0d, 0xa1, 0xbb, 0x16, 0xc7, 0xa5, 0x6e, 0xe9, 0xcd, 0x6c, 0x98, 0x5f, 0x7f, 0xf5, 0x88, + 0xdd, 0x6c, 0xd2, 0x1f, 0x08, 0x8c, 0x05, 0xbc, 0x67, 0xdc, 0x56, 0x1b, 0xed, 0x95, 0xe3, 0xb6, + 0xda, 0x18, 0x43, 0x9b, 0x30, 0xbf, 0xcc, 0x9a, 0x79, 0xc1, 0x03, 0x23, 0xf3, 0x35, 0x81, 0xf3, + 0x5e, 0xeb, 0x17, 0xb7, 0xdd, 0x46, 0x78, 0xd6, 0xb8, 0xed, 0x36, 0xca, 0x49, 0x26, 0xcc, 0x72, + 0x8b, 0x10, 0x15, 0x45, 0x0d, 0x1f, 0x13, 0xb8, 0xe8, 0x37, 0x59, 0xb4, 0xc3, 0x0e, 0xea, 0x73, + 0x89, 0xd2, 0x72, 0xba, 0x60, 0xc4, 0x5b, 0x63, 0x78, 0x2b, 0x74, 0x29, 0x61, 0xbf, 0xe5, 0xbf, + 0x08, 0x9e, 0x51, 0x3d, 0x26, 0x30, 0xea, 0xb1, 0x3e, 0x74, 0x3e, 0xba, 0x64, 0xd8, 0x8e, 0x49, + 0x0b, 0x29, 0x22, 0x91, 0x6c, 0x83, 0x91, 0xad, 0x52, 0x25, 0xfe, 0x6b, 0x0a, 0x4c, 0x21, 0xb3, + 0x5e, 0xd4, 0x81, 0x41, 0xfe, 0xae, 0xf4, 0x7a, 0x92, 0x12, 0x82, 0xe8, 0x46, 0x72, 0x10, 0xc2, + 0x4c, 0x33, 0x98, 0x49, 0x7a, 0x35, 0x46, 0xa6, 0xfc, 0x6b, 0x4f, 0x4f, 0x32, 0xe4, 0xd9, 0x49, + 0x86, 0xfc, 0x79, 0x92, 0x21, 0x5f, 0x9c, 0x66, 0xfa, 0x9e, 0x9d, 0x66, 0xfa, 0x7e, 0x3f, 0xcd, + 0xf4, 0xbd, 0x77, 0xa3, 0x6c, 0x38, 0x1f, 0x1c, 0x14, 0x95, 0x3d, 0xab, 0x2a, 0x92, 0xf9, 0x3f, + 0x2b, 0x76, 0xe9, 0x43, 0xf5, 0x23, 0xbe, 0x40, 0x71, 0x90, 0xfd, 0xbd, 0x7b, 0xed, 0x9f, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x1c, 0xce, 0x79, 0xa7, 0xb7, 0x17, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1536,6 +1645,10 @@ type QueryClient interface { // then it simply returns the `final_tally_result` state stored in the // proposal itself. TallyResult(ctx context.Context, in *QueryTallyResultRequest, opts ...grpc.CallOption) (*QueryTallyResultResponse, error) + // Groups queries all groups in state. + // + // Since: cosmos-sdk 0.47.1 + Groups(ctx context.Context, in *QueryGroupsRequest, opts ...grpc.CallOption) (*QueryGroupsResponse, error) } type queryClient struct { @@ -1663,6 +1776,15 @@ func (c *queryClient) TallyResult(ctx context.Context, in *QueryTallyResultReque return out, nil } +func (c *queryClient) Groups(ctx context.Context, in *QueryGroupsRequest, opts ...grpc.CallOption) (*QueryGroupsResponse, error) { + out := new(QueryGroupsResponse) + err := c.cc.Invoke(ctx, "/cosmos.group.v1.Query/Groups", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // GroupInfo queries group info based on group id. @@ -1695,6 +1817,10 @@ type QueryServer interface { // then it simply returns the `final_tally_result` state stored in the // proposal itself. TallyResult(context.Context, *QueryTallyResultRequest) (*QueryTallyResultResponse, error) + // Groups queries all groups in state. + // + // Since: cosmos-sdk 0.47.1 + Groups(context.Context, *QueryGroupsRequest) (*QueryGroupsResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -1740,6 +1866,9 @@ func (*UnimplementedQueryServer) GroupsByMember(ctx context.Context, req *QueryG func (*UnimplementedQueryServer) TallyResult(ctx context.Context, req *QueryTallyResultRequest) (*QueryTallyResultResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method TallyResult not implemented") } +func (*UnimplementedQueryServer) Groups(ctx context.Context, req *QueryGroupsRequest) (*QueryGroupsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Groups not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -1979,6 +2108,24 @@ func _Query_TallyResult_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _Query_Groups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryGroupsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Groups(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosmos.group.v1.Query/Groups", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Groups(ctx, req.(*QueryGroupsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "cosmos.group.v1.Query", HandlerType: (*QueryServer)(nil), @@ -2035,6 +2182,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "TallyResult", Handler: _Query_TallyResult_Handler, }, + { + MethodName: "Groups", + Handler: _Query_Groups_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "cosmos/group/v1/query.proto", @@ -3084,6 +3235,90 @@ func (m *QueryTallyResultResponse) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } +func (m *QueryGroupsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryGroupsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryGroupsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *QueryGroupsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryGroupsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryGroupsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Groups) > 0 { + for iNdEx := len(m.Groups) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Groups[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -3508,6 +3743,38 @@ func (m *QueryTallyResultResponse) Size() (n int) { return n } +func (m *QueryGroupsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryGroupsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Groups) > 0 { + for _, e := range m.Groups { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -6196,6 +6463,212 @@ func (m *QueryTallyResultResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryGroupsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryGroupsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryGroupsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageRequest{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryGroupsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryGroupsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryGroupsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Groups", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Groups = append(m.Groups, &GroupInfo{}) + if err := m.Groups[len(m.Groups)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageResponse{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/group/query.pb.gw.go b/x/group/query.pb.gw.go index d9f8b8c588b0..a0a30e91c3a6 100644 --- a/x/group/query.pb.gw.go +++ b/x/group/query.pb.gw.go @@ -901,6 +901,42 @@ func local_request_Query_TallyResult_0(ctx context.Context, marshaler runtime.Ma } +var ( + filter_Query_Groups_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_Groups_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryGroupsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Groups_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Groups(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Groups_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryGroupsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Groups_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Groups(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -1206,6 +1242,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_Groups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Groups_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Groups_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1507,6 +1566,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_Groups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Groups_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Groups_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1536,6 +1615,8 @@ var ( pattern_Query_GroupsByMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"cosmos", "group", "v1", "groups_by_member", "address"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_TallyResult_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"cosmos", "group", "v1", "proposals", "proposal_id", "tally"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_Groups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"cosmos", "group", "v1", "groups"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -1564,4 +1645,6 @@ var ( forward_Query_GroupsByMember_0 = runtime.ForwardResponseMessage forward_Query_TallyResult_0 = runtime.ForwardResponseMessage + + forward_Query_Groups_0 = runtime.ForwardResponseMessage ) diff --git a/x/group/simulation/genesis.go b/x/group/simulation/genesis.go index 7f30a4fc7303..66b471fa5e47 100644 --- a/x/group/simulation/genesis.go +++ b/x/group/simulation/genesis.go @@ -21,6 +21,16 @@ const ( GroupVote = "group-vote" ) +func checkAccExists(acc sdk.AccAddress, g []*group.GroupMember, lastIndex int) bool { + s := acc.String() + for i := 0; i < lastIndex; i++ { + if g[i].Member.Address == s { + return true + } + } + return false +} + func getGroups(r *rand.Rand, accounts []simtypes.Account) []*group.GroupInfo { groups := make([]*group.GroupInfo, 3) for i := 0; i < 3; i++ { @@ -40,6 +50,9 @@ func getGroupMembers(r *rand.Rand, accounts []simtypes.Account) []*group.GroupMe groupMembers := make([]*group.GroupMember, 3) for i := 0; i < 3; i++ { acc, _ := simtypes.RandomAcc(r, accounts) + for checkAccExists(acc.Address, groupMembers, i) { + acc, _ = simtypes.RandomAcc(r, accounts) + } groupMembers[i] = &group.GroupMember{ GroupId: uint64(i + 1), Member: &group.Member{ @@ -147,6 +160,11 @@ func getVoteOption(index int) group.VoteOption { // RandomizedGenState generates a random GenesisState for the group module. func RandomizedGenState(simState *module.SimulationState) { + // The test requires we have at least 3 accounts. + if len(simState.Accounts) < 3 { + return + } + // groups var groups []*group.GroupInfo simState.AppParams.GetOrGenerate( diff --git a/x/group/spec/04_events.md b/x/group/spec/04_events.md index ca4e2fdf20bb..1f064009d7bc 100644 --- a/x/group/spec/04_events.md +++ b/x/group/spec/04_events.md @@ -70,3 +70,12 @@ The group module emits the following events: | message | action | /cosmos.group.v1.Msg/LeaveGroup | | cosmos.group.v1.EventLeaveGroup | proposal_id | {proposalId} | | cosmos.group.v1.EventLeaveGroup | address | {address} | + +### EventProposalPruned + +| Type | Attribute Key | Attribute Value | +|-------------------------------------|---------------|---------------------------------| +| message | action | /cosmos.group.v1.Msg/LeaveGroup | +| cosmos.group.v1.EventProposalPruned | proposal_id | {proposalId} | +| cosmos.group.v1.EventProposalPruned | status | {ProposalStatus} | +| cosmos.group.v1.EventProposalPruned | tally_result | {TallyResult} | \ No newline at end of file diff --git a/x/group/types.pb.go b/x/group/types.pb.go index 9c9e028daa05..76010d43b92f 100644 --- a/x/group/types.pb.go +++ b/x/group/types.pb.go @@ -297,10 +297,10 @@ func (m *MemberRequest) GetMetadata() string { // ThresholdDecisionPolicy is a decision policy where a proposal passes when it // satisfies the two following conditions: -// 1. The sum of all `YES` voters' weights is greater or equal than the defined -// `threshold`. -// 2. The voting and execution periods of the proposal respect the parameters -// given by `windows`. +// 1. The sum of all `YES` voters' weights is greater or equal than the defined +// `threshold`. +// 2. The voting and execution periods of the proposal respect the parameters +// given by `windows`. type ThresholdDecisionPolicy struct { // threshold is the minimum weighted sum of `YES` votes that must be met or // exceeded for a proposal to succeed. @@ -358,10 +358,10 @@ func (m *ThresholdDecisionPolicy) GetWindows() *DecisionPolicyWindows { // PercentageDecisionPolicy is a decision policy where a proposal passes when // it satisfies the two following conditions: -// 1. The percentage of all `YES` voters' weights out of the total group weight -// is greater or equal than the given `percentage`. -// 2. The voting and execution periods of the proposal respect the parameters -// given by `windows`. +// 1. The percentage of all `YES` voters' weights out of the total group weight +// is greater or equal than the given `percentage`. +// 2. The voting and execution periods of the proposal respect the parameters +// given by `windows`. type PercentageDecisionPolicy struct { // percentage is the minimum percentage the weighted sum of `YES` votes must // meet for a proposal to succeed. diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 7d70a88b349c..95dd7de3ed11 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1260,508 +1260,479 @@ 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{ - // 8007 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x7b, 0x70, 0x64, 0xd9, - 0x79, 0x97, 0xfa, 0xa9, 0xee, 0xaf, 0x5b, 0xad, 0xab, 0x23, 0xcd, 0x4c, 0x8f, 0x76, 0x57, 0xd2, - 0xb6, 0xf7, 0x31, 0xfb, 0xd2, 0xec, 0xce, 0xee, 0xcc, 0xec, 0xf4, 0xd8, 0x5e, 0xb7, 0xd4, 0x3d, - 0x1a, 0xcd, 0xe8, 0xd1, 0x7b, 0x5b, 0x9a, 0x7d, 0x04, 0xb8, 0x5c, 0xdd, 0x3e, 0x6a, 0xdd, 0xd5, - 0xed, 0x7b, 0xaf, 0xef, 0xbd, 0xad, 0x91, 0xb6, 0x02, 0xb5, 0x2e, 0xf3, 0xb0, 0x87, 0x02, 0x1c, - 0x42, 0x11, 0xc7, 0xf1, 0x98, 0xdd, 0x38, 0xe0, 0x60, 0x0c, 0x24, 0xb1, 0x31, 0x84, 0x14, 0x60, - 0xa0, 0x00, 0xe3, 0x2a, 0x28, 0x27, 0x7f, 0x90, 0x04, 0xc2, 0x12, 0xd6, 0x2e, 0x30, 0xc6, 0x01, - 0x63, 0x96, 0x2a, 0x28, 0x57, 0x28, 0xea, 0xbc, 0xee, 0xa3, 0x1f, 0xea, 0xd6, 0x66, 0xd6, 0x49, - 0x55, 0xfe, 0x1a, 0x9d, 0x73, 0xbe, 0xef, 0x77, 0xbf, 0xf3, 0x9d, 0xef, 0x75, 0xce, 0xb9, 0xb7, - 0x07, 0xfe, 0xd9, 0x55, 0x58, 0x68, 0x59, 0x56, 0xcb, 0xc0, 0xe7, 0x6d, 0xc7, 0xf2, 0xac, 0x9d, - 0xce, 0xee, 0xf9, 0x26, 0x76, 0x35, 0x47, 0xb7, 0x3d, 0xcb, 0x59, 0xa4, 0x7d, 0x68, 0x92, 0x51, - 0x2c, 0x0a, 0x8a, 0xd2, 0x3a, 0x4c, 0x5d, 0xd3, 0x0d, 0x5c, 0xf5, 0x09, 0x1b, 0xd8, 0x43, 0xcf, - 0x43, 0x72, 0x57, 0x37, 0x70, 0x31, 0xb6, 0x90, 0x38, 0x97, 0xbb, 0xf0, 0xd0, 0x62, 0x17, 0xd3, - 0x62, 0x94, 0xa3, 0x4e, 0xba, 0x65, 0xca, 0x51, 0xfa, 0x76, 0x12, 0xa6, 0xfb, 0x8c, 0x22, 0x04, - 0x49, 0x53, 0x6d, 0x13, 0xc4, 0xd8, 0xb9, 0xac, 0x4c, 0xff, 0x46, 0x45, 0x18, 0xb7, 0x55, 0x6d, - 0x5f, 0x6d, 0xe1, 0x62, 0x9c, 0x76, 0x8b, 0x26, 0x9a, 0x03, 0x68, 0x62, 0x1b, 0x9b, 0x4d, 0x6c, - 0x6a, 0x47, 0xc5, 0xc4, 0x42, 0xe2, 0x5c, 0x56, 0x0e, 0xf5, 0xa0, 0x27, 0x60, 0xca, 0xee, 0xec, - 0x18, 0xba, 0xa6, 0x84, 0xc8, 0x60, 0x21, 0x71, 0x2e, 0x25, 0x4b, 0x6c, 0xa0, 0x1a, 0x10, 0x3f, - 0x0a, 0x93, 0xb7, 0xb1, 0xba, 0x1f, 0x26, 0xcd, 0x51, 0xd2, 0x02, 0xe9, 0x0e, 0x11, 0x2e, 0x43, - 0xbe, 0x8d, 0x5d, 0x57, 0x6d, 0x61, 0xc5, 0x3b, 0xb2, 0x71, 0x31, 0x49, 0x67, 0xbf, 0xd0, 0x33, - 0xfb, 0xee, 0x99, 0xe7, 0x38, 0xd7, 0xd6, 0x91, 0x8d, 0x51, 0x05, 0xb2, 0xd8, 0xec, 0xb4, 0x19, - 0x42, 0x6a, 0x80, 0xfe, 0x6a, 0x66, 0xa7, 0xdd, 0x8d, 0x92, 0x21, 0x6c, 0x1c, 0x62, 0xdc, 0xc5, - 0xce, 0x81, 0xae, 0xe1, 0x62, 0x9a, 0x02, 0x3c, 0xda, 0x03, 0xd0, 0x60, 0xe3, 0xdd, 0x18, 0x82, - 0x0f, 0x2d, 0x43, 0x16, 0x1f, 0x7a, 0xd8, 0x74, 0x75, 0xcb, 0x2c, 0x8e, 0x53, 0x90, 0x87, 0xfb, - 0xac, 0x22, 0x36, 0x9a, 0xdd, 0x10, 0x01, 0x1f, 0xba, 0x04, 0xe3, 0x96, 0xed, 0xe9, 0x96, 0xe9, - 0x16, 0x33, 0x0b, 0xb1, 0x73, 0xb9, 0x0b, 0xf7, 0xf7, 0x35, 0x84, 0x4d, 0x46, 0x23, 0x0b, 0x62, - 0xb4, 0x0a, 0x92, 0x6b, 0x75, 0x1c, 0x0d, 0x2b, 0x9a, 0xd5, 0xc4, 0x8a, 0x6e, 0xee, 0x5a, 0xc5, - 0x2c, 0x05, 0x98, 0xef, 0x9d, 0x08, 0x25, 0x5c, 0xb6, 0x9a, 0x78, 0xd5, 0xdc, 0xb5, 0xe4, 0x82, - 0x1b, 0x69, 0xa3, 0xd3, 0x90, 0x76, 0x8f, 0x4c, 0x4f, 0x3d, 0x2c, 0xe6, 0xa9, 0x85, 0xf0, 0x56, - 0xe9, 0x97, 0xd3, 0x30, 0x39, 0x8a, 0x89, 0x5d, 0x85, 0xd4, 0x2e, 0x99, 0x65, 0x31, 0x7e, 0x12, - 0x1d, 0x30, 0x9e, 0xa8, 0x12, 0xd3, 0xef, 0x51, 0x89, 0x15, 0xc8, 0x99, 0xd8, 0xf5, 0x70, 0x93, - 0x59, 0x44, 0x62, 0x44, 0x9b, 0x02, 0xc6, 0xd4, 0x6b, 0x52, 0xc9, 0xf7, 0x64, 0x52, 0x2f, 0xc3, - 0xa4, 0x2f, 0x92, 0xe2, 0xa8, 0x66, 0x4b, 0xd8, 0xe6, 0xf9, 0x61, 0x92, 0x2c, 0xd6, 0x04, 0x9f, - 0x4c, 0xd8, 0xe4, 0x02, 0x8e, 0xb4, 0x51, 0x15, 0xc0, 0x32, 0xb1, 0xb5, 0xab, 0x34, 0xb1, 0x66, - 0x14, 0x33, 0x03, 0xb4, 0xb4, 0x49, 0x48, 0x7a, 0xb4, 0x64, 0xb1, 0x5e, 0xcd, 0x40, 0x57, 0x02, - 0x53, 0x1b, 0x1f, 0x60, 0x29, 0xeb, 0xcc, 0xc9, 0x7a, 0xac, 0x6d, 0x1b, 0x0a, 0x0e, 0x26, 0x76, - 0x8f, 0x9b, 0x7c, 0x66, 0x59, 0x2a, 0xc4, 0xe2, 0xd0, 0x99, 0xc9, 0x9c, 0x8d, 0x4d, 0x6c, 0xc2, - 0x09, 0x37, 0xd1, 0x07, 0xc0, 0xef, 0x50, 0xa8, 0x59, 0x01, 0x8d, 0x42, 0x79, 0xd1, 0xb9, 0xa1, - 0xb6, 0xf1, 0xec, 0xeb, 0x50, 0x88, 0xaa, 0x07, 0xcd, 0x40, 0xca, 0xf5, 0x54, 0xc7, 0xa3, 0x56, - 0x98, 0x92, 0x59, 0x03, 0x49, 0x90, 0xc0, 0x66, 0x93, 0x46, 0xb9, 0x94, 0x4c, 0xfe, 0x44, 0x1f, - 0x09, 0x26, 0x9c, 0xa0, 0x13, 0x7e, 0xa4, 0x77, 0x45, 0x23, 0xc8, 0xdd, 0xf3, 0x9e, 0xbd, 0x0c, - 0x13, 0x91, 0x09, 0x8c, 0xfa, 0xe8, 0xd2, 0x8f, 0xc3, 0xa9, 0xbe, 0xd0, 0xe8, 0x65, 0x98, 0xe9, - 0x98, 0xba, 0xe9, 0x61, 0xc7, 0x76, 0x30, 0xb1, 0x58, 0xf6, 0xa8, 0xe2, 0x7f, 0x19, 0x1f, 0x60, - 0x73, 0xdb, 0x61, 0x6a, 0x86, 0x22, 0x4f, 0x77, 0x7a, 0x3b, 0x1f, 0xcf, 0x66, 0xbe, 0x33, 0x2e, - 0xbd, 0xf1, 0xc6, 0x1b, 0x6f, 0xc4, 0x4b, 0xff, 0x24, 0x0d, 0x33, 0xfd, 0x7c, 0xa6, 0xaf, 0xfb, - 0x9e, 0x86, 0xb4, 0xd9, 0x69, 0xef, 0x60, 0x87, 0x2a, 0x29, 0x25, 0xf3, 0x16, 0xaa, 0x40, 0xca, - 0x50, 0x77, 0xb0, 0x51, 0x4c, 0x2e, 0xc4, 0xce, 0x15, 0x2e, 0x3c, 0x31, 0x92, 0x57, 0x2e, 0xae, - 0x11, 0x16, 0x99, 0x71, 0xa2, 0x0f, 0x43, 0x92, 0x87, 0x68, 0x82, 0xf0, 0xf8, 0x68, 0x08, 0xc4, - 0x97, 0x64, 0xca, 0x87, 0xee, 0x83, 0x2c, 0xf9, 0x97, 0xd9, 0x46, 0x9a, 0xca, 0x9c, 0x21, 0x1d, - 0xc4, 0x2e, 0xd0, 0x2c, 0x64, 0xa8, 0x9b, 0x34, 0xb1, 0x48, 0x6d, 0x7e, 0x9b, 0x18, 0x56, 0x13, - 0xef, 0xaa, 0x1d, 0xc3, 0x53, 0x0e, 0x54, 0xa3, 0x83, 0xa9, 0xc1, 0x67, 0xe5, 0x3c, 0xef, 0xbc, - 0x45, 0xfa, 0xd0, 0x3c, 0xe4, 0x98, 0x57, 0xe9, 0x66, 0x13, 0x1f, 0xd2, 0xe8, 0x99, 0x92, 0x99, - 0xa3, 0xad, 0x92, 0x1e, 0xf2, 0xf8, 0xd7, 0x5c, 0xcb, 0x14, 0xa6, 0x49, 0x1f, 0x41, 0x3a, 0xe8, - 0xe3, 0x2f, 0x77, 0x07, 0xee, 0x07, 0xfa, 0x4f, 0xaf, 0xc7, 0x97, 0x1e, 0x85, 0x49, 0x4a, 0xf1, - 0x2c, 0x5f, 0x7a, 0xd5, 0x28, 0x4e, 0x2d, 0xc4, 0xce, 0x65, 0xe4, 0x02, 0xeb, 0xde, 0xe4, 0xbd, - 0xa5, 0xaf, 0xc6, 0x21, 0x49, 0x03, 0xcb, 0x24, 0xe4, 0xb6, 0x5e, 0xa9, 0xd7, 0x94, 0xea, 0xe6, - 0xf6, 0xd2, 0x5a, 0x4d, 0x8a, 0xa1, 0x02, 0x00, 0xed, 0xb8, 0xb6, 0xb6, 0x59, 0xd9, 0x92, 0xe2, - 0x7e, 0x7b, 0x75, 0x63, 0xeb, 0xd2, 0x73, 0x52, 0xc2, 0x67, 0xd8, 0x66, 0x1d, 0xc9, 0x30, 0xc1, - 0xb3, 0x17, 0xa4, 0x14, 0x92, 0x20, 0xcf, 0x00, 0x56, 0x5f, 0xae, 0x55, 0x2f, 0x3d, 0x27, 0xa5, - 0xa3, 0x3d, 0xcf, 0x5e, 0x90, 0xc6, 0xd1, 0x04, 0x64, 0x69, 0xcf, 0xd2, 0xe6, 0xe6, 0x9a, 0x94, - 0xf1, 0x31, 0x1b, 0x5b, 0xf2, 0xea, 0xc6, 0x8a, 0x94, 0xf5, 0x31, 0x57, 0xe4, 0xcd, 0xed, 0xba, - 0x04, 0x3e, 0xc2, 0x7a, 0xad, 0xd1, 0xa8, 0xac, 0xd4, 0xa4, 0x9c, 0x4f, 0xb1, 0xf4, 0xca, 0x56, - 0xad, 0x21, 0xe5, 0x23, 0x62, 0x3d, 0x7b, 0x41, 0x9a, 0xf0, 0x1f, 0x51, 0xdb, 0xd8, 0x5e, 0x97, - 0x0a, 0x68, 0x0a, 0x26, 0xd8, 0x23, 0x84, 0x10, 0x93, 0x5d, 0x5d, 0x97, 0x9e, 0x93, 0xa4, 0x40, - 0x10, 0x86, 0x32, 0x15, 0xe9, 0xb8, 0xf4, 0x9c, 0x84, 0x4a, 0xcb, 0x90, 0xa2, 0x66, 0x88, 0x10, - 0x14, 0xd6, 0x2a, 0x4b, 0xb5, 0x35, 0x65, 0xb3, 0xbe, 0xb5, 0xba, 0xb9, 0x51, 0x59, 0x93, 0x62, - 0x41, 0x9f, 0x5c, 0x7b, 0x71, 0x7b, 0x55, 0xae, 0x55, 0xa5, 0x78, 0xb8, 0xaf, 0x5e, 0xab, 0x6c, - 0xd5, 0xaa, 0x52, 0xa2, 0xa4, 0xc1, 0x4c, 0xbf, 0x80, 0xda, 0xd7, 0x85, 0x42, 0xb6, 0x10, 0x1f, - 0x60, 0x0b, 0x14, 0xab, 0xdb, 0x16, 0x4a, 0xdf, 0x8a, 0xc3, 0x74, 0x9f, 0xa4, 0xd2, 0xf7, 0x21, - 0x2f, 0x40, 0x8a, 0xd9, 0x32, 0x4b, 0xb3, 0x8f, 0xf5, 0xcd, 0x4e, 0xd4, 0xb2, 0x7b, 0x52, 0x2d, - 0xe5, 0x0b, 0x97, 0x1a, 0x89, 0x01, 0xa5, 0x06, 0x81, 0xe8, 0x31, 0xd8, 0x3f, 0xda, 0x13, 0xfc, - 0x59, 0x7e, 0xbc, 0x34, 0x4a, 0x7e, 0xa4, 0x7d, 0x27, 0x4b, 0x02, 0xa9, 0x3e, 0x49, 0xe0, 0x2a, - 0x4c, 0xf5, 0x00, 0x8d, 0x1c, 0x8c, 0x3f, 0x1e, 0x83, 0xe2, 0x20, 0xe5, 0x0c, 0x09, 0x89, 0xf1, - 0x48, 0x48, 0xbc, 0xda, 0xad, 0xc1, 0x07, 0x07, 0x2f, 0x42, 0xcf, 0x5a, 0x7f, 0x21, 0x06, 0xa7, - 0xfb, 0x97, 0x94, 0x7d, 0x65, 0xf8, 0x30, 0xa4, 0xdb, 0xd8, 0xdb, 0xb3, 0x44, 0x59, 0xf5, 0x48, - 0x9f, 0x64, 0x4d, 0x86, 0xbb, 0x17, 0x9b, 0x73, 0x85, 0xb3, 0x7d, 0x62, 0x50, 0x5d, 0xc8, 0xa4, - 0xe9, 0x91, 0xf4, 0x93, 0x71, 0x38, 0xd5, 0x17, 0xbc, 0xaf, 0xa0, 0x0f, 0x00, 0xe8, 0xa6, 0xdd, - 0xf1, 0x58, 0xe9, 0xc4, 0x22, 0x71, 0x96, 0xf6, 0xd0, 0xe0, 0x45, 0xa2, 0x6c, 0xc7, 0xf3, 0xc7, - 0x13, 0x74, 0x1c, 0x58, 0x17, 0x25, 0x78, 0x3e, 0x10, 0x34, 0x49, 0x05, 0x9d, 0x1b, 0x30, 0xd3, - 0x1e, 0xc3, 0x7c, 0x1a, 0x24, 0xcd, 0xd0, 0xb1, 0xe9, 0x29, 0xae, 0xe7, 0x60, 0xb5, 0xad, 0x9b, - 0x2d, 0x9a, 0x6a, 0x32, 0xe5, 0xd4, 0xae, 0x6a, 0xb8, 0x58, 0x9e, 0x64, 0xc3, 0x0d, 0x31, 0x4a, - 0x38, 0xa8, 0x01, 0x39, 0x21, 0x8e, 0x74, 0x84, 0x83, 0x0d, 0xfb, 0x1c, 0xa5, 0x9f, 0xc8, 0x42, - 0x2e, 0x54, 0x80, 0xa3, 0x07, 0x21, 0xff, 0x9a, 0x7a, 0xa0, 0x2a, 0x62, 0x53, 0xc5, 0x34, 0x91, - 0x23, 0x7d, 0x75, 0xbe, 0xb1, 0x7a, 0x1a, 0x66, 0x28, 0x89, 0xd5, 0xf1, 0xb0, 0xa3, 0x68, 0x86, - 0xea, 0xba, 0x54, 0x69, 0x19, 0x4a, 0x8a, 0xc8, 0xd8, 0x26, 0x19, 0x5a, 0x16, 0x23, 0xe8, 0x22, - 0x4c, 0x53, 0x8e, 0x76, 0xc7, 0xf0, 0x74, 0xdb, 0xc0, 0x0a, 0xd9, 0xe6, 0xb9, 0x34, 0xe5, 0xf8, - 0x92, 0x4d, 0x11, 0x8a, 0x75, 0x4e, 0x40, 0x24, 0x72, 0x51, 0x15, 0x1e, 0xa0, 0x6c, 0x2d, 0x6c, - 0x62, 0x47, 0xf5, 0xb0, 0x82, 0x3f, 0xda, 0x51, 0x0d, 0x57, 0x51, 0xcd, 0xa6, 0xb2, 0xa7, 0xba, - 0x7b, 0xc5, 0x19, 0x02, 0xb0, 0x14, 0x2f, 0xc6, 0xe4, 0xb3, 0x84, 0x70, 0x85, 0xd3, 0xd5, 0x28, - 0x59, 0xc5, 0x6c, 0x5e, 0x57, 0xdd, 0x3d, 0x54, 0x86, 0xd3, 0x14, 0xc5, 0xf5, 0x1c, 0xdd, 0x6c, - 0x29, 0xda, 0x1e, 0xd6, 0xf6, 0x95, 0x8e, 0xb7, 0xfb, 0x7c, 0xf1, 0xbe, 0xf0, 0xf3, 0xa9, 0x84, - 0x0d, 0x4a, 0xb3, 0x4c, 0x48, 0xb6, 0xbd, 0xdd, 0xe7, 0x51, 0x03, 0xf2, 0x64, 0x31, 0xda, 0xfa, - 0xeb, 0x58, 0xd9, 0xb5, 0x1c, 0x9a, 0x43, 0x0b, 0x7d, 0x42, 0x53, 0x48, 0x83, 0x8b, 0x9b, 0x9c, - 0x61, 0xdd, 0x6a, 0xe2, 0x72, 0xaa, 0x51, 0xaf, 0xd5, 0xaa, 0x72, 0x4e, 0xa0, 0x5c, 0xb3, 0x1c, - 0x62, 0x50, 0x2d, 0xcb, 0x57, 0x70, 0x8e, 0x19, 0x54, 0xcb, 0x12, 0xea, 0xbd, 0x08, 0xd3, 0x9a, - 0xc6, 0xe6, 0xac, 0x6b, 0x0a, 0xdf, 0x8c, 0xb9, 0x45, 0x29, 0xa2, 0x2c, 0x4d, 0x5b, 0x61, 0x04, - 0xdc, 0xc6, 0x5d, 0x74, 0x05, 0x4e, 0x05, 0xca, 0x0a, 0x33, 0x4e, 0xf5, 0xcc, 0xb2, 0x9b, 0xf5, - 0x22, 0x4c, 0xdb, 0x47, 0xbd, 0x8c, 0x28, 0xf2, 0x44, 0xfb, 0xa8, 0x9b, 0xed, 0x32, 0xcc, 0xd8, - 0x7b, 0x76, 0x2f, 0xdf, 0xe3, 0x61, 0x3e, 0x64, 0xef, 0xd9, 0xdd, 0x8c, 0x0f, 0xd3, 0x9d, 0xb9, - 0x83, 0x35, 0xd5, 0xc3, 0xcd, 0xe2, 0x99, 0x30, 0x79, 0x68, 0x00, 0x2d, 0x82, 0xa4, 0x69, 0x0a, - 0x36, 0xd5, 0x1d, 0x03, 0x2b, 0xaa, 0x83, 0x4d, 0xd5, 0x2d, 0xce, 0x53, 0xe2, 0xa4, 0xe7, 0x74, - 0xb0, 0x5c, 0xd0, 0xb4, 0x1a, 0x1d, 0xac, 0xd0, 0x31, 0xf4, 0x38, 0x4c, 0x59, 0x3b, 0xaf, 0x69, - 0xcc, 0x22, 0x15, 0xdb, 0xc1, 0xbb, 0xfa, 0x61, 0xf1, 0x21, 0xaa, 0xde, 0x49, 0x32, 0x40, 0xed, - 0xb1, 0x4e, 0xbb, 0xd1, 0x63, 0x20, 0x69, 0xee, 0x9e, 0xea, 0xd8, 0x34, 0x24, 0xbb, 0xb6, 0xaa, - 0xe1, 0xe2, 0xc3, 0x8c, 0x94, 0xf5, 0x6f, 0x88, 0x6e, 0xe2, 0x11, 0xee, 0x6d, 0x7d, 0xd7, 0x13, - 0x88, 0x8f, 0x32, 0x8f, 0xa0, 0x7d, 0x1c, 0xed, 0x1c, 0x48, 0x44, 0x13, 0x91, 0x07, 0x9f, 0xa3, - 0x64, 0x05, 0x7b, 0xcf, 0x0e, 0x3f, 0xf7, 0x03, 0x30, 0x41, 0x28, 0x83, 0x87, 0x3e, 0xc6, 0x0a, - 0x37, 0x7b, 0x2f, 0xf4, 0xc4, 0xe7, 0xe0, 0x34, 0x21, 0x6a, 0x63, 0x4f, 0x6d, 0xaa, 0x9e, 0x1a, - 0xa2, 0x7e, 0x92, 0x52, 0x13, 0xb5, 0xaf, 0xf3, 0xc1, 0x88, 0x9c, 0x4e, 0x67, 0xe7, 0xc8, 0x37, - 0xac, 0xa7, 0x98, 0x9c, 0xa4, 0x4f, 0x98, 0xd6, 0xfb, 0x56, 0x9c, 0x97, 0xca, 0x90, 0x0f, 0xdb, - 0x3d, 0xca, 0x02, 0xb3, 0x7c, 0x29, 0x46, 0x8a, 0xa0, 0xe5, 0xcd, 0x2a, 0x29, 0x5f, 0x5e, 0xad, - 0x49, 0x71, 0x52, 0x46, 0xad, 0xad, 0x6e, 0xd5, 0x14, 0x79, 0x7b, 0x63, 0x6b, 0x75, 0xbd, 0x26, - 0x25, 0x42, 0x85, 0xfd, 0x8d, 0x64, 0xe6, 0x11, 0xe9, 0x51, 0x52, 0x35, 0x14, 0xa2, 0x3b, 0x35, - 0xf4, 0x41, 0x38, 0x23, 0x8e, 0x55, 0x5c, 0xec, 0x29, 0xb7, 0x75, 0x87, 0x3a, 0x64, 0x5b, 0x65, - 0xc9, 0xd1, 0xb7, 0x9f, 0x19, 0x4e, 0xd5, 0xc0, 0xde, 0x4b, 0xba, 0x43, 0xdc, 0xad, 0xad, 0x7a, - 0x68, 0x0d, 0xe6, 0x4d, 0x4b, 0x71, 0x3d, 0xd5, 0x6c, 0xaa, 0x4e, 0x53, 0x09, 0x0e, 0xb4, 0x14, - 0x55, 0xd3, 0xb0, 0xeb, 0x5a, 0x2c, 0x11, 0xfa, 0x28, 0xf7, 0x9b, 0x56, 0x83, 0x13, 0x07, 0x19, - 0xa2, 0xc2, 0x49, 0xbb, 0xcc, 0x37, 0x31, 0xc8, 0x7c, 0xef, 0x83, 0x6c, 0x5b, 0xb5, 0x15, 0x6c, - 0x7a, 0xce, 0x11, 0xad, 0xcf, 0x33, 0x72, 0xa6, 0xad, 0xda, 0x35, 0xd2, 0xfe, 0x91, 0x6c, 0x93, - 0x6e, 0x24, 0x33, 0x49, 0x29, 0x75, 0x23, 0x99, 0x49, 0x49, 0xe9, 0x1b, 0xc9, 0x4c, 0x5a, 0x1a, - 0xbf, 0x91, 0xcc, 0x64, 0xa4, 0xec, 0x8d, 0x64, 0x26, 0x2b, 0x41, 0xe9, 0x9d, 0x04, 0xe4, 0xc3, - 0x15, 0x3c, 0xd9, 0x10, 0x69, 0x34, 0x87, 0xc5, 0x68, 0x94, 0xfb, 0xc0, 0xb1, 0xf5, 0xfe, 0xe2, - 0x32, 0x49, 0x6e, 0xe5, 0x34, 0x2b, 0x97, 0x65, 0xc6, 0x49, 0x0a, 0x0b, 0x62, 0x7e, 0x98, 0x95, - 0x27, 0x19, 0x99, 0xb7, 0xd0, 0x0a, 0xa4, 0x5f, 0x73, 0x29, 0x76, 0x9a, 0x62, 0x3f, 0x74, 0x3c, - 0xf6, 0x8d, 0x06, 0x05, 0xcf, 0xde, 0x68, 0x28, 0x1b, 0x9b, 0xf2, 0x7a, 0x65, 0x4d, 0xe6, 0xec, - 0xe8, 0x2c, 0x24, 0x0d, 0xf5, 0xf5, 0xa3, 0x68, 0x1a, 0xa4, 0x5d, 0xa3, 0x2e, 0xcb, 0x59, 0x48, - 0xde, 0xc6, 0xea, 0x7e, 0x34, 0xf9, 0xd0, 0xae, 0xf7, 0xd1, 0x3d, 0xce, 0x43, 0x8a, 0xea, 0x0b, - 0x01, 0x70, 0x8d, 0x49, 0x63, 0x28, 0x03, 0xc9, 0xe5, 0x4d, 0x99, 0xb8, 0x88, 0x04, 0x79, 0xd6, - 0xab, 0xd4, 0x57, 0x6b, 0xcb, 0x35, 0x29, 0x5e, 0xba, 0x08, 0x69, 0xa6, 0x04, 0xe2, 0x3e, 0xbe, - 0x1a, 0xa4, 0x31, 0xde, 0xe4, 0x18, 0x31, 0x31, 0xba, 0xbd, 0xbe, 0x54, 0x93, 0xa5, 0x78, 0xcf, - 0xe2, 0x97, 0x5c, 0xc8, 0x87, 0x2b, 0xf3, 0x1f, 0xcd, 0xf6, 0xfc, 0x6b, 0x31, 0xc8, 0x85, 0x2a, - 0x6d, 0x52, 0x22, 0xa9, 0x86, 0x61, 0xdd, 0x56, 0x54, 0x43, 0x57, 0x5d, 0x6e, 0x1a, 0x40, 0xbb, - 0x2a, 0xa4, 0x67, 0xd4, 0xa5, 0xfb, 0x11, 0x39, 0x4d, 0x4a, 0x4a, 0x97, 0x3e, 0x17, 0x03, 0xa9, - 0xbb, 0xd4, 0xed, 0x12, 0x33, 0xf6, 0xfb, 0x29, 0x66, 0xe9, 0xb3, 0x31, 0x28, 0x44, 0xeb, 0xdb, - 0x2e, 0xf1, 0x1e, 0xfc, 0x7d, 0x15, 0xef, 0xb7, 0xe3, 0x30, 0x11, 0xa9, 0x6a, 0x47, 0x95, 0xee, - 0xa3, 0x30, 0xa5, 0x37, 0x71, 0xdb, 0xb6, 0x3c, 0x6c, 0x6a, 0x47, 0x8a, 0x81, 0x0f, 0xb0, 0x51, - 0x2c, 0xd1, 0xa0, 0x71, 0xfe, 0xf8, 0xba, 0x79, 0x71, 0x35, 0xe0, 0x5b, 0x23, 0x6c, 0xe5, 0xe9, - 0xd5, 0x6a, 0x6d, 0xbd, 0xbe, 0xb9, 0x55, 0xdb, 0x58, 0x7e, 0x45, 0xd9, 0xde, 0xb8, 0xb9, 0xb1, - 0xf9, 0xd2, 0x86, 0x2c, 0xe9, 0x5d, 0x64, 0xef, 0xa3, 0xdb, 0xd7, 0x41, 0xea, 0x16, 0x0a, 0x9d, - 0x81, 0x7e, 0x62, 0x49, 0x63, 0x68, 0x1a, 0x26, 0x37, 0x36, 0x95, 0xc6, 0x6a, 0xb5, 0xa6, 0xd4, - 0xae, 0x5d, 0xab, 0x2d, 0x6f, 0x35, 0xd8, 0x49, 0x88, 0x4f, 0xbd, 0x15, 0x71, 0xf0, 0xd2, 0x67, - 0x12, 0x30, 0xdd, 0x47, 0x12, 0x54, 0xe1, 0x7b, 0x18, 0xb6, 0xad, 0x7a, 0x6a, 0x14, 0xe9, 0x17, - 0x49, 0x15, 0x51, 0x57, 0x1d, 0x8f, 0x6f, 0x79, 0x1e, 0x03, 0xa2, 0x25, 0xd3, 0xd3, 0x77, 0x75, - 0xec, 0xf0, 0x13, 0x26, 0xb6, 0xb1, 0x99, 0x0c, 0xfa, 0xd9, 0x21, 0xd3, 0x93, 0x80, 0x6c, 0xcb, - 0xd5, 0x3d, 0xfd, 0x00, 0x2b, 0xba, 0x29, 0x8e, 0xa3, 0xc8, 0x46, 0x27, 0x29, 0x4b, 0x62, 0x64, - 0xd5, 0xf4, 0x7c, 0x6a, 0x13, 0xb7, 0xd4, 0x2e, 0x6a, 0x12, 0xcc, 0x13, 0xb2, 0x24, 0x46, 0x7c, - 0xea, 0x07, 0x21, 0xdf, 0xb4, 0x3a, 0xa4, 0xfa, 0x63, 0x74, 0x24, 0x77, 0xc4, 0xe4, 0x1c, 0xeb, - 0xf3, 0x49, 0x78, 0x5d, 0x1f, 0x9c, 0x83, 0xe5, 0xe5, 0x1c, 0xeb, 0x63, 0x24, 0x8f, 0xc2, 0xa4, - 0xda, 0x6a, 0x39, 0x04, 0x5c, 0x00, 0xb1, 0x9d, 0x4a, 0xc1, 0xef, 0xa6, 0x84, 0xb3, 0x37, 0x20, - 0x23, 0xf4, 0x40, 0x92, 0x37, 0xd1, 0x84, 0x62, 0xb3, 0xed, 0x77, 0xfc, 0x5c, 0x56, 0xce, 0x98, - 0x62, 0xf0, 0x41, 0xc8, 0xeb, 0xae, 0x12, 0x1c, 0xeb, 0xc7, 0x17, 0xe2, 0xe7, 0x32, 0x72, 0x4e, - 0x77, 0xfd, 0x23, 0xd1, 0xd2, 0x17, 0xe2, 0x50, 0x88, 0x5e, 0x4b, 0xa0, 0x2a, 0x64, 0x0c, 0x4b, - 0x53, 0xa9, 0x69, 0xb1, 0x3b, 0xb1, 0x73, 0x43, 0x6e, 0x32, 0x16, 0xd7, 0x38, 0xbd, 0xec, 0x73, - 0xce, 0xfe, 0x9b, 0x18, 0x64, 0x44, 0x37, 0x3a, 0x0d, 0x49, 0x5b, 0xf5, 0xf6, 0x28, 0x5c, 0x6a, - 0x29, 0x2e, 0xc5, 0x64, 0xda, 0x26, 0xfd, 0xae, 0xad, 0x9a, 0xd4, 0x04, 0x78, 0x3f, 0x69, 0x93, - 0x75, 0x35, 0xb0, 0xda, 0xa4, 0xdb, 0x20, 0xab, 0xdd, 0xc6, 0xa6, 0xe7, 0x8a, 0x75, 0xe5, 0xfd, - 0xcb, 0xbc, 0x1b, 0x3d, 0x01, 0x53, 0x9e, 0xa3, 0xea, 0x46, 0x84, 0x36, 0x49, 0x69, 0x25, 0x31, - 0xe0, 0x13, 0x97, 0xe1, 0xac, 0xc0, 0x6d, 0x62, 0x4f, 0xd5, 0xf6, 0x70, 0x33, 0x60, 0x4a, 0xd3, - 0xe3, 0x8e, 0x33, 0x9c, 0xa0, 0xca, 0xc7, 0x05, 0x6f, 0xe9, 0x57, 0x63, 0x30, 0x25, 0x36, 0x6e, - 0x4d, 0x5f, 0x59, 0xeb, 0x00, 0xaa, 0x69, 0x5a, 0x5e, 0x58, 0x5d, 0xbd, 0xa6, 0xdc, 0xc3, 0xb7, - 0x58, 0xf1, 0x99, 0xe4, 0x10, 0xc0, 0x6c, 0x1b, 0x20, 0x18, 0x19, 0xa8, 0xb6, 0x79, 0xc8, 0xf1, - 0x3b, 0x27, 0x7a, 0x71, 0xc9, 0xb6, 0xfa, 0xc0, 0xba, 0xc8, 0x0e, 0x0f, 0xcd, 0x40, 0x6a, 0x07, - 0xb7, 0x74, 0x93, 0x9f, 0x24, 0xb3, 0x86, 0x38, 0x90, 0x49, 0xfa, 0x07, 0x32, 0x4b, 0x7f, 0x12, - 0xa6, 0x35, 0xab, 0xdd, 0x2d, 0xee, 0x92, 0xd4, 0x75, 0xdc, 0xe0, 0x5e, 0x8f, 0xbd, 0xfa, 0x14, - 0x27, 0x6a, 0x59, 0x86, 0x6a, 0xb6, 0x16, 0x2d, 0xa7, 0x15, 0x5c, 0xbc, 0x92, 0x8a, 0xc7, 0x0d, - 0x5d, 0xbf, 0xda, 0x3b, 0xff, 0x27, 0x16, 0xfb, 0xd9, 0x78, 0x62, 0xa5, 0xbe, 0xf4, 0xc5, 0xf8, - 0xec, 0x0a, 0x63, 0xac, 0x0b, 0x65, 0xc8, 0x78, 0xd7, 0xc0, 0x1a, 0x99, 0x20, 0xfc, 0xce, 0x13, - 0x30, 0xd3, 0xb2, 0x5a, 0x16, 0x45, 0x3a, 0x4f, 0xfe, 0xe2, 0x37, 0xb7, 0x59, 0xbf, 0x77, 0x76, - 0xe8, 0x35, 0x6f, 0x79, 0x03, 0xa6, 0x39, 0xb1, 0x42, 0xaf, 0x8e, 0xd8, 0xc6, 0x06, 0x1d, 0x7b, - 0xaa, 0x56, 0xfc, 0xc5, 0x6f, 0xd3, 0xf4, 0x2d, 0x4f, 0x71, 0x56, 0x32, 0xc6, 0xf6, 0x3e, 0x65, - 0x19, 0x4e, 0x45, 0xf0, 0x98, 0x93, 0x62, 0x67, 0x08, 0xe2, 0x3f, 0xe7, 0x88, 0xd3, 0x21, 0xc4, - 0x06, 0x67, 0x2d, 0x2f, 0xc3, 0xc4, 0x49, 0xb0, 0xfe, 0x05, 0xc7, 0xca, 0xe3, 0x30, 0xc8, 0x0a, - 0x4c, 0x52, 0x10, 0xad, 0xe3, 0x7a, 0x56, 0x9b, 0x46, 0xc0, 0xe3, 0x61, 0xfe, 0xe5, 0xb7, 0x99, - 0xd7, 0x14, 0x08, 0xdb, 0xb2, 0xcf, 0x55, 0x2e, 0x03, 0xbd, 0x2d, 0x6b, 0x62, 0xcd, 0x18, 0x82, - 0xf0, 0x75, 0x2e, 0x88, 0x4f, 0x5f, 0xbe, 0x05, 0x33, 0xe4, 0x6f, 0x1a, 0xa0, 0xc2, 0x92, 0x0c, - 0x3f, 0x82, 0x2b, 0xfe, 0xea, 0xc7, 0x99, 0x63, 0x4e, 0xfb, 0x00, 0x21, 0x99, 0x42, 0xab, 0xd8, - 0xc2, 0x9e, 0x87, 0x1d, 0x57, 0x51, 0x8d, 0x7e, 0xe2, 0x85, 0xce, 0x30, 0x8a, 0x3f, 0xfd, 0xbd, - 0xe8, 0x2a, 0xae, 0x30, 0xce, 0x8a, 0x61, 0x94, 0xb7, 0xe1, 0x4c, 0x1f, 0xab, 0x18, 0x01, 0xf3, - 0x33, 0x1c, 0x73, 0xa6, 0xc7, 0x32, 0x08, 0x6c, 0x1d, 0x44, 0xbf, 0xbf, 0x96, 0x23, 0x60, 0xfe, - 0x0c, 0xc7, 0x44, 0x9c, 0x57, 0x2c, 0x29, 0x41, 0xbc, 0x01, 0x53, 0x07, 0xd8, 0xd9, 0xb1, 0x5c, - 0x7e, 0x6e, 0x34, 0x02, 0xdc, 0x67, 0x39, 0xdc, 0x24, 0x67, 0xa4, 0x07, 0x49, 0x04, 0xeb, 0x0a, - 0x64, 0x76, 0x55, 0x0d, 0x8f, 0x00, 0x71, 0x97, 0x43, 0x8c, 0x13, 0x7a, 0xc2, 0x5a, 0x81, 0x7c, - 0xcb, 0xe2, 0x39, 0x6a, 0x38, 0xfb, 0xe7, 0x38, 0x7b, 0x4e, 0xf0, 0x70, 0x08, 0xdb, 0xb2, 0x3b, - 0x06, 0x49, 0x60, 0xc3, 0x21, 0xfe, 0xaa, 0x80, 0x10, 0x3c, 0x1c, 0xe2, 0x04, 0x6a, 0x7d, 0x53, - 0x40, 0xb8, 0x21, 0x7d, 0xbe, 0x00, 0x39, 0xcb, 0x34, 0x8e, 0x2c, 0x73, 0x14, 0x21, 0xde, 0xe2, - 0x08, 0xc0, 0x59, 0x08, 0xc0, 0x55, 0xc8, 0x8e, 0xba, 0x10, 0x7f, 0xed, 0x7b, 0xc2, 0x3d, 0xc4, - 0x0a, 0xac, 0xc0, 0xa4, 0x08, 0x50, 0xba, 0x65, 0x8e, 0x00, 0xf1, 0xd7, 0x39, 0x44, 0x21, 0xc4, - 0xc6, 0xa7, 0xe1, 0x61, 0xd7, 0x6b, 0xe1, 0x51, 0x40, 0xbe, 0x20, 0xa6, 0xc1, 0x59, 0xb8, 0x2a, - 0x77, 0xb0, 0xa9, 0xed, 0x8d, 0x86, 0xf0, 0xf3, 0x42, 0x95, 0x82, 0x87, 0x40, 0x2c, 0xc3, 0x44, - 0x5b, 0x75, 0xdc, 0x3d, 0xd5, 0x18, 0x69, 0x39, 0xfe, 0x06, 0xc7, 0xc8, 0xfb, 0x4c, 0x5c, 0x23, - 0x1d, 0xf3, 0x24, 0x30, 0x5f, 0x14, 0x1a, 0x09, 0xb1, 0x71, 0xd7, 0x73, 0x3d, 0x7a, 0xc8, 0x76, - 0x12, 0xb4, 0xbf, 0x29, 0x5c, 0x8f, 0xf1, 0xae, 0x87, 0x11, 0xaf, 0x42, 0xd6, 0xd5, 0x5f, 0x1f, - 0x09, 0xe6, 0x4b, 0x62, 0xa5, 0x29, 0x03, 0x61, 0x7e, 0x05, 0xce, 0xf6, 0x4d, 0x13, 0x23, 0x80, - 0xfd, 0x2d, 0x0e, 0x76, 0xba, 0x4f, 0xaa, 0xe0, 0x21, 0xe1, 0xa4, 0x90, 0x7f, 0x5b, 0x84, 0x04, - 0xdc, 0x85, 0x55, 0x27, 0xbb, 0x06, 0x57, 0xdd, 0x3d, 0x99, 0xd6, 0xfe, 0x8e, 0xd0, 0x1a, 0xe3, - 0x8d, 0x68, 0x6d, 0x0b, 0x4e, 0x73, 0xc4, 0x93, 0xad, 0xeb, 0x2f, 0x88, 0xc0, 0xca, 0xb8, 0xb7, - 0xa3, 0xab, 0xfb, 0x63, 0x30, 0xeb, 0xab, 0x53, 0x94, 0xa7, 0xae, 0xd2, 0x56, 0xed, 0x11, 0x90, - 0x7f, 0x91, 0x23, 0x8b, 0x88, 0xef, 0xd7, 0xb7, 0xee, 0xba, 0x6a, 0x13, 0xf0, 0x97, 0xa1, 0x28, - 0xc0, 0x3b, 0xa6, 0x83, 0x35, 0xab, 0x65, 0xea, 0xaf, 0xe3, 0xe6, 0x08, 0xd0, 0xbf, 0xd4, 0xb5, - 0x54, 0xdb, 0x21, 0x76, 0x82, 0xbc, 0x0a, 0x92, 0x5f, 0xab, 0x28, 0x7a, 0xdb, 0xb6, 0x1c, 0x6f, - 0x08, 0xe2, 0x97, 0xc5, 0x4a, 0xf9, 0x7c, 0xab, 0x94, 0xad, 0x5c, 0x03, 0x76, 0xf3, 0x3c, 0xaa, - 0x49, 0x7e, 0x85, 0x03, 0x4d, 0x04, 0x5c, 0x3c, 0x70, 0x68, 0x56, 0xdb, 0x56, 0x9d, 0x51, 0xe2, - 0xdf, 0xdf, 0x15, 0x81, 0x83, 0xb3, 0xf0, 0xc0, 0x41, 0x2a, 0x3a, 0x92, 0xed, 0x47, 0x40, 0xf8, - 0xaa, 0x08, 0x1c, 0x82, 0x87, 0x43, 0x88, 0x82, 0x61, 0x04, 0x88, 0xbf, 0x27, 0x20, 0x04, 0x0f, - 0x81, 0x78, 0x31, 0x48, 0xb4, 0x0e, 0x6e, 0xe9, 0xae, 0xe7, 0xb0, 0xa2, 0xf8, 0x78, 0xa8, 0xbf, - 0xff, 0xbd, 0x68, 0x11, 0x26, 0x87, 0x58, 0x49, 0x24, 0xe2, 0xc7, 0xae, 0x74, 0xcf, 0x34, 0x5c, - 0xb0, 0x5f, 0x16, 0x91, 0x28, 0xc4, 0x46, 0x64, 0x0b, 0x55, 0x88, 0x44, 0xed, 0x1a, 0xd9, 0x29, - 0x8c, 0x00, 0xf7, 0x0f, 0xba, 0x84, 0x6b, 0x08, 0x5e, 0x82, 0x19, 0xaa, 0x7f, 0x3a, 0xe6, 0x3e, - 0x3e, 0x1a, 0xc9, 0x3a, 0x7f, 0xa5, 0xab, 0xfe, 0xd9, 0x66, 0x9c, 0x2c, 0x86, 0x4c, 0x76, 0xd5, - 0x53, 0x68, 0xd8, 0x7b, 0x46, 0xc5, 0x8f, 0xbd, 0xcb, 0xe7, 0x1b, 0x2d, 0xa7, 0xca, 0x6b, 0xc4, - 0xc8, 0xa3, 0x45, 0xcf, 0x70, 0xb0, 0x8f, 0xbf, 0xeb, 0xdb, 0x79, 0xa4, 0xe6, 0x29, 0x5f, 0x83, - 0x89, 0x48, 0xc1, 0x33, 0x1c, 0xea, 0x4f, 0x71, 0xa8, 0x7c, 0xb8, 0xde, 0x29, 0x5f, 0x84, 0x24, - 0x29, 0x5e, 0x86, 0xb3, 0xff, 0x69, 0xce, 0x4e, 0xc9, 0xcb, 0x1f, 0x82, 0x8c, 0x28, 0x5a, 0x86, - 0xb3, 0xfe, 0x19, 0xce, 0xea, 0xb3, 0x10, 0x76, 0x51, 0xb0, 0x0c, 0x67, 0xff, 0xb3, 0x82, 0x5d, - 0xb0, 0x10, 0xf6, 0xd1, 0x55, 0xf8, 0xb5, 0x3f, 0x97, 0xe4, 0x49, 0x47, 0xe8, 0xee, 0x2a, 0x8c, - 0xf3, 0x4a, 0x65, 0x38, 0xf7, 0x27, 0xf9, 0xc3, 0x05, 0x47, 0xf9, 0x32, 0xa4, 0x46, 0x54, 0xf8, - 0x9f, 0xe7, 0xac, 0x8c, 0xbe, 0xbc, 0x0c, 0xb9, 0x50, 0x75, 0x32, 0x9c, 0xfd, 0x2f, 0x70, 0xf6, - 0x30, 0x17, 0x11, 0x9d, 0x57, 0x27, 0xc3, 0x01, 0xfe, 0xa2, 0x10, 0x9d, 0x73, 0x10, 0xb5, 0x89, - 0xc2, 0x64, 0x38, 0xf7, 0xa7, 0x84, 0xd6, 0x05, 0x4b, 0xf9, 0x05, 0xc8, 0xfa, 0xc9, 0x66, 0x38, - 0xff, 0x4f, 0x70, 0xfe, 0x80, 0x87, 0x68, 0x20, 0x94, 0xec, 0x86, 0x43, 0xfc, 0x25, 0xa1, 0x81, - 0x10, 0x17, 0x71, 0xa3, 0xee, 0x02, 0x66, 0x38, 0xd2, 0x4f, 0x0a, 0x37, 0xea, 0xaa, 0x5f, 0xc8, - 0x6a, 0xd2, 0x98, 0x3f, 0x1c, 0xe2, 0x2f, 0x8b, 0xd5, 0xa4, 0xf4, 0x44, 0x8c, 0xee, 0x8a, 0x60, - 0x38, 0xc6, 0x4f, 0x09, 0x31, 0xba, 0x0a, 0x82, 0x72, 0x1d, 0x50, 0x6f, 0x35, 0x30, 0x1c, 0xef, - 0xd3, 0x1c, 0x6f, 0xaa, 0xa7, 0x18, 0x28, 0xbf, 0x04, 0xa7, 0xfb, 0x57, 0x02, 0xc3, 0x51, 0x7f, - 0xfa, 0xdd, 0xae, 0xbd, 0x5b, 0xb8, 0x10, 0x28, 0x6f, 0x05, 0x29, 0x25, 0x5c, 0x05, 0x0c, 0x87, - 0xfd, 0xcc, 0xbb, 0xd1, 0xc0, 0x1d, 0x2e, 0x02, 0xca, 0x15, 0x80, 0x20, 0x01, 0x0f, 0xc7, 0xfa, - 0x2c, 0xc7, 0x0a, 0x31, 0x11, 0xd7, 0xe0, 0xf9, 0x77, 0x38, 0xff, 0x5d, 0xe1, 0x1a, 0x9c, 0x83, - 0xb8, 0x86, 0x48, 0xbd, 0xc3, 0xb9, 0x3f, 0x27, 0x5c, 0x43, 0xb0, 0x10, 0xcb, 0x0e, 0x65, 0xb7, - 0xe1, 0x08, 0x6f, 0x09, 0xcb, 0x0e, 0x71, 0x95, 0x37, 0x60, 0xaa, 0x27, 0x21, 0x0e, 0x87, 0xfa, - 0x59, 0x0e, 0x25, 0x75, 0xe7, 0xc3, 0x70, 0xf2, 0xe2, 0xc9, 0x70, 0x38, 0xda, 0xe7, 0xbb, 0x92, - 0x17, 0xcf, 0x85, 0xe5, 0xab, 0x90, 0x31, 0x3b, 0x86, 0x41, 0x9c, 0x07, 0x1d, 0xff, 0x6e, 0x60, - 0xf1, 0xbf, 0xfe, 0x90, 0x6b, 0x47, 0x30, 0x94, 0x2f, 0x42, 0x0a, 0xb7, 0x77, 0x70, 0x73, 0x18, - 0xe7, 0x77, 0x7f, 0x28, 0x02, 0x26, 0xa1, 0x2e, 0xbf, 0x00, 0xc0, 0x8e, 0x46, 0xe8, 0x65, 0xe0, - 0x10, 0xde, 0xff, 0xf6, 0x43, 0xfe, 0x32, 0x4e, 0xc0, 0x12, 0x00, 0xb0, 0x57, 0x7b, 0x8e, 0x07, - 0xf8, 0x5e, 0x14, 0x80, 0xae, 0xc8, 0x15, 0x18, 0x7f, 0xcd, 0xb5, 0x4c, 0x4f, 0x6d, 0x0d, 0xe3, - 0xfe, 0x1d, 0xce, 0x2d, 0xe8, 0x89, 0xc2, 0xda, 0x96, 0x83, 0x3d, 0xb5, 0xe5, 0x0e, 0xe3, 0xfd, - 0xef, 0x9c, 0xd7, 0x67, 0x20, 0xcc, 0x9a, 0xea, 0x7a, 0xa3, 0xcc, 0xfb, 0x7f, 0x08, 0x66, 0xc1, - 0x40, 0x84, 0x26, 0x7f, 0xef, 0xe3, 0xa3, 0x61, 0xbc, 0xdf, 0x17, 0x42, 0x73, 0xfa, 0xf2, 0x87, - 0x20, 0x4b, 0xfe, 0x64, 0x6f, 0xd8, 0x0d, 0x61, 0xfe, 0x9f, 0x9c, 0x39, 0xe0, 0x20, 0x4f, 0x76, - 0xbd, 0xa6, 0xa7, 0x0f, 0x57, 0xf6, 0x0f, 0xf8, 0x4a, 0x0b, 0xfa, 0x72, 0x05, 0x72, 0xae, 0xd7, - 0x6c, 0x76, 0x78, 0x7d, 0x3a, 0x84, 0xfd, 0x7f, 0xfd, 0xd0, 0x3f, 0xb2, 0xf0, 0x79, 0xc8, 0x6a, - 0xdf, 0xde, 0xf7, 0x6c, 0x8b, 0x5e, 0x78, 0x0c, 0x43, 0x78, 0x97, 0x23, 0x84, 0x58, 0xca, 0xcb, - 0x90, 0x27, 0x73, 0x71, 0xb0, 0x8d, 0xe9, 0xed, 0xd4, 0x10, 0x88, 0xff, 0xcd, 0x15, 0x10, 0x61, - 0x5a, 0xfa, 0xe3, 0x5f, 0x7f, 0x67, 0x2e, 0xf6, 0xcd, 0x77, 0xe6, 0x62, 0xbf, 0xfd, 0xce, 0x5c, - 0xec, 0x53, 0xdf, 0x9a, 0x1b, 0xfb, 0xe6, 0xb7, 0xe6, 0xc6, 0x7e, 0xe3, 0x5b, 0x73, 0x63, 0xfd, - 0x4f, 0x89, 0x61, 0xc5, 0x5a, 0xb1, 0xd8, 0xf9, 0xf0, 0xab, 0x0f, 0xb7, 0x74, 0x6f, 0xaf, 0xb3, - 0xb3, 0xa8, 0x59, 0xed, 0xf3, 0x9a, 0xe5, 0xb6, 0x2d, 0xf7, 0x7c, 0xf4, 0x5c, 0x97, 0xfe, 0x05, - 0x1f, 0x8b, 0x93, 0x3d, 0x73, 0xf4, 0x38, 0x57, 0x35, 0x8f, 0x06, 0x7c, 0xae, 0x33, 0xdb, 0xf7, - 0x6c, 0xb8, 0x74, 0x1d, 0x12, 0x15, 0xf3, 0x08, 0x9d, 0x65, 0x61, 0x4f, 0xe9, 0x38, 0x06, 0x7f, - 0xf9, 0x6b, 0x9c, 0xb4, 0xb7, 0x1d, 0x03, 0xcd, 0x04, 0x6f, 0x68, 0xc6, 0xce, 0xe5, 0xf9, 0x6b, - 0x97, 0x65, 0xe9, 0xd3, 0x6f, 0xce, 0x8f, 0xfd, 0xc2, 0x9b, 0xf3, 0x63, 0xdf, 0x7f, 0x6b, 0x7e, - 0xec, 0x8d, 0xdf, 0x5a, 0x18, 0x5b, 0xda, 0xef, 0x9e, 0xf0, 0xd7, 0x86, 0x4e, 0x3a, 0x53, 0x31, - 0x8f, 0xe8, 0x9c, 0xeb, 0xb1, 0x57, 0x53, 0xf4, 0xdc, 0x5b, 0x9c, 0x73, 0xcf, 0x75, 0x9f, 0x73, - 0xbf, 0x84, 0x0d, 0xe3, 0xa6, 0x69, 0xdd, 0x36, 0xb7, 0x08, 0xd9, 0x4e, 0x9a, 0xbd, 0x55, 0x0c, - 0x3f, 0x19, 0x87, 0xb9, 0x9e, 0x23, 0x6d, 0x6e, 0x08, 0x83, 0xbe, 0x5b, 0x2a, 0x43, 0xa6, 0x2a, - 0xec, 0xab, 0x08, 0xe3, 0x2e, 0xd6, 0x2c, 0xb3, 0xe9, 0xd2, 0x69, 0x27, 0x64, 0xd1, 0x24, 0xd3, - 0x36, 0x55, 0xd3, 0x72, 0xf9, 0xcb, 0x92, 0xac, 0xb1, 0xf4, 0x33, 0xb1, 0x93, 0x2d, 0xeb, 0x84, - 0x78, 0x92, 0x98, 0xe6, 0x33, 0x43, 0x4f, 0xfe, 0xf7, 0xc9, 0x2c, 0xfd, 0x49, 0x44, 0x4e, 0xff, - 0x47, 0xd5, 0xca, 0x4f, 0xc5, 0x61, 0xbe, 0x5b, 0x2b, 0xc4, 0xbb, 0x5c, 0x4f, 0x6d, 0xdb, 0x83, - 0xd4, 0x72, 0x15, 0xb2, 0x5b, 0x82, 0xe6, 0xc4, 0x7a, 0xb9, 0x7b, 0x42, 0xbd, 0x14, 0xfc, 0x47, - 0x09, 0xc5, 0x5c, 0x18, 0x51, 0x31, 0xfe, 0x3c, 0xde, 0x93, 0x66, 0xfe, 0x6f, 0x1a, 0xce, 0x32, - 0x97, 0x52, 0x98, 0x2b, 0xb0, 0x06, 0xd7, 0x49, 0x3e, 0x3c, 0x34, 0xfc, 0xae, 0xa4, 0x74, 0x13, - 0xa6, 0x57, 0x49, 0xc4, 0x20, 0x3b, 0xa1, 0xe0, 0x96, 0xa7, 0xef, 0xfb, 0xa4, 0x0b, 0x91, 0xa2, - 0x9f, 0xdf, 0x32, 0x85, 0xbb, 0x4a, 0x1f, 0x8b, 0x81, 0xd4, 0xd0, 0x54, 0x43, 0x75, 0x7e, 0xaf, - 0x50, 0xe8, 0x32, 0x00, 0xfd, 0x0e, 0x29, 0xf8, 0x70, 0xa8, 0x70, 0xa1, 0xb8, 0x18, 0x9e, 0xdc, - 0x22, 0x7b, 0x12, 0xfd, 0x2a, 0x21, 0x4b, 0x69, 0xc9, 0x9f, 0x8f, 0xbf, 0x0c, 0x10, 0x0c, 0xa0, - 0xfb, 0xe0, 0x4c, 0x63, 0xb9, 0xb2, 0x56, 0x91, 0x15, 0xf6, 0x82, 0xfb, 0x46, 0xa3, 0x5e, 0x5b, - 0x5e, 0xbd, 0xb6, 0x5a, 0xab, 0x4a, 0x63, 0xe8, 0x34, 0xa0, 0xf0, 0xa0, 0xff, 0x6e, 0xca, 0x29, - 0x98, 0x0a, 0xf7, 0xb3, 0xb7, 0xe4, 0xe3, 0xa4, 0x5a, 0xd4, 0xdb, 0xb6, 0x81, 0xe9, 0xf5, 0x9f, - 0xa2, 0x0b, 0xad, 0x0d, 0x2f, 0x44, 0xfe, 0xd5, 0xbf, 0x65, 0x6f, 0x4e, 0x4f, 0x07, 0xec, 0xbe, - 0xce, 0xcb, 0x6b, 0x30, 0xa5, 0x6a, 0x1a, 0xb6, 0x23, 0x90, 0x43, 0xc2, 0x35, 0x01, 0xa4, 0x17, - 0x9a, 0x9c, 0x33, 0x40, 0xbb, 0x0c, 0x69, 0x97, 0xce, 0x7e, 0x18, 0xc4, 0x37, 0x38, 0x04, 0x27, - 0x2f, 0x9b, 0x30, 0x45, 0xaa, 0x3f, 0xd5, 0xc1, 0x21, 0x31, 0x8e, 0x3f, 0x6b, 0xf8, 0x87, 0x5f, - 0x7e, 0x9a, 0x5e, 0x6f, 0x3e, 0x18, 0x5d, 0x96, 0x3e, 0xe6, 0x24, 0x4b, 0x1c, 0x3b, 0x10, 0x14, - 0x43, 0x41, 0x3c, 0x8f, 0x0b, 0x7c, 0xfc, 0xc3, 0xfe, 0x11, 0x7f, 0xd8, 0x5c, 0x3f, 0x1b, 0x08, - 0x3d, 0x69, 0x82, 0xa3, 0xb2, 0x81, 0xa5, 0xda, 0x20, 0x9f, 0x7e, 0xf5, 0x89, 0xde, 0x0c, 0xc5, - 0xfe, 0x79, 0x8a, 0x22, 0x5f, 0x0d, 0x3f, 0xc6, 0xf7, 0xbd, 0x5f, 0x4f, 0xc0, 0x1c, 0x27, 0xde, - 0x51, 0x5d, 0x7c, 0xfe, 0xe0, 0x99, 0x1d, 0xec, 0xa9, 0xcf, 0x9c, 0xd7, 0x2c, 0x5d, 0xc4, 0xea, - 0x69, 0xee, 0x8e, 0x64, 0x7c, 0x91, 0x8f, 0xf7, 0x4f, 0x5c, 0xb3, 0x83, 0xdd, 0xb8, 0xb4, 0x0d, - 0xc9, 0x65, 0x4b, 0x37, 0x49, 0xa8, 0x6a, 0x62, 0xd3, 0x6a, 0x73, 0xef, 0x61, 0x0d, 0xf4, 0x0c, - 0xa4, 0xd5, 0xb6, 0xd5, 0x31, 0x3d, 0xe6, 0x39, 0x4b, 0x67, 0xbf, 0xfe, 0xf6, 0xfc, 0xd8, 0xbf, - 0x7b, 0x7b, 0x3e, 0xb1, 0x6a, 0x7a, 0xbf, 0xf6, 0x95, 0xa7, 0x80, 0x43, 0xad, 0x9a, 0x9e, 0xcc, - 0x09, 0xcb, 0xc9, 0xef, 0xbc, 0x39, 0x1f, 0x2b, 0xbd, 0x0c, 0xe3, 0x55, 0xac, 0xbd, 0x17, 0xe4, - 0x2a, 0xd6, 0x42, 0xc8, 0x55, 0xac, 0x75, 0x21, 0x5f, 0x86, 0xcc, 0xaa, 0xe9, 0xb1, 0x97, 0xd1, - 0x9f, 0x80, 0x84, 0x6e, 0xb2, 0xf7, 0x1b, 0x8f, 0x95, 0x8d, 0x50, 0x11, 0xc6, 0x2a, 0xd6, 0x7c, - 0xc6, 0x26, 0xd6, 0xba, 0x19, 0x7b, 0x1f, 0x4d, 0xa8, 0x96, 0xaa, 0xbf, 0xf1, 0x9f, 0xe6, 0xc6, - 0xde, 0x78, 0x67, 0x6e, 0x6c, 0xe0, 0x12, 0x97, 0x06, 0x2e, 0xb1, 0xdb, 0xdc, 0x67, 0x11, 0xd9, - 0x5f, 0xd9, 0x2f, 0x26, 0xe1, 0x01, 0xfa, 0x8d, 0x92, 0xd3, 0xd6, 0x4d, 0xef, 0xbc, 0xe6, 0x1c, - 0xd9, 0x9e, 0x45, 0xe2, 0xa6, 0xb5, 0xcb, 0x17, 0x76, 0x2a, 0x18, 0x5e, 0x64, 0xc3, 0x03, 0xea, - 0x91, 0x5d, 0x48, 0xd5, 0x09, 0x1f, 0x51, 0xb1, 0x67, 0x79, 0xaa, 0xc1, 0xf3, 0x0f, 0x6b, 0x90, - 0x5e, 0xf6, 0x5d, 0x53, 0x9c, 0xf5, 0xea, 0xe2, 0x93, 0x26, 0x03, 0xab, 0xbb, 0xec, 0xf5, 0xf0, - 0x04, 0x2d, 0x53, 0x32, 0xa4, 0x83, 0xbe, 0x09, 0x3e, 0x03, 0x29, 0xb5, 0xc3, 0xde, 0x63, 0x48, - 0x90, 0xfa, 0x85, 0x36, 0x4a, 0x37, 0x61, 0x9c, 0xdf, 0xa6, 0x22, 0x09, 0x12, 0xfb, 0xf8, 0x88, - 0x3e, 0x27, 0x2f, 0x93, 0x3f, 0xd1, 0x22, 0xa4, 0xa8, 0xf0, 0xfc, 0xbb, 0x97, 0xe2, 0x62, 0x8f, - 0xf4, 0x8b, 0x54, 0x48, 0x99, 0x91, 0x95, 0x6e, 0x40, 0xa6, 0x6a, 0xb5, 0x75, 0xd3, 0x8a, 0xa2, - 0x65, 0x19, 0x1a, 0x95, 0xd9, 0xee, 0x70, 0xab, 0x90, 0x59, 0x03, 0x9d, 0x86, 0x34, 0xfb, 0x5c, - 0x80, 0xbf, 0x8b, 0xc1, 0x5b, 0xa5, 0x65, 0x18, 0xa7, 0xd8, 0x9b, 0x36, 0x09, 0xfe, 0xfe, 0x9b, - 0x99, 0x59, 0xfe, 0xf1, 0x18, 0x87, 0x8f, 0x07, 0xc2, 0x22, 0x48, 0x36, 0x55, 0x4f, 0xe5, 0xf3, - 0xa6, 0x7f, 0x97, 0x3e, 0x0c, 0x19, 0x0e, 0xe2, 0xa2, 0x0b, 0x90, 0xb0, 0x6c, 0x97, 0xbf, 0x4d, - 0x31, 0x3b, 0x68, 0x2a, 0x9b, 0xf6, 0x52, 0x92, 0xd8, 0x8c, 0x4c, 0x88, 0x97, 0xe4, 0x81, 0x66, - 0xf1, 0x7c, 0xc8, 0x2c, 0x42, 0x4b, 0x1e, 0xfa, 0x93, 0x2d, 0x69, 0x8f, 0x39, 0xf8, 0xc6, 0xf2, - 0x56, 0x1c, 0xe6, 0x42, 0xa3, 0x07, 0xd8, 0x71, 0x75, 0xcb, 0x64, 0x16, 0xc5, 0xad, 0x05, 0x85, - 0x84, 0xe4, 0xe3, 0x03, 0xcc, 0xe5, 0x43, 0x90, 0xa8, 0xd8, 0x36, 0x9a, 0x85, 0x0c, 0x6d, 0x6b, - 0x16, 0xb3, 0x97, 0xa4, 0xec, 0xb7, 0xc9, 0x98, 0x6b, 0xed, 0x7a, 0xb7, 0x55, 0xc7, 0xff, 0xa2, - 0x4e, 0xb4, 0x4b, 0x57, 0x20, 0xbb, 0x6c, 0x99, 0x2e, 0x36, 0xdd, 0x0e, 0xad, 0x6c, 0x76, 0x0c, - 0x4b, 0xdb, 0xe7, 0x08, 0xac, 0x41, 0x14, 0xae, 0xda, 0x36, 0xe5, 0x4c, 0xca, 0xe4, 0x4f, 0xe6, - 0xb3, 0x4b, 0x8d, 0x81, 0x2a, 0xba, 0x72, 0x72, 0x15, 0xf1, 0x49, 0xfa, 0x3a, 0xfa, 0xdd, 0x18, - 0xdc, 0xdf, 0xeb, 0x50, 0xfb, 0xf8, 0xc8, 0x3d, 0xa9, 0x3f, 0xbd, 0x0c, 0xd9, 0x3a, 0xfd, 0xac, - 0xfd, 0x26, 0x3e, 0x42, 0xb3, 0x30, 0x8e, 0x9b, 0x17, 0x2e, 0x5e, 0x7c, 0xe6, 0x0a, 0xb3, 0xf6, - 0xeb, 0x63, 0xb2, 0xe8, 0x40, 0x73, 0x90, 0x75, 0xb1, 0x66, 0x5f, 0xb8, 0x78, 0x69, 0xff, 0x19, - 0x66, 0x5e, 0xd7, 0xc7, 0xe4, 0xa0, 0xab, 0x9c, 0x21, 0xb3, 0xfe, 0xce, 0x5b, 0xf3, 0xb1, 0xa5, - 0x14, 0x24, 0xdc, 0x4e, 0xfb, 0x7d, 0xb5, 0x91, 0xcf, 0xa4, 0x60, 0x21, 0xcc, 0x49, 0xeb, 0xbf, - 0x03, 0xd5, 0xd0, 0x9b, 0x6a, 0xf0, 0x83, 0x04, 0x52, 0x48, 0x07, 0x94, 0x62, 0x40, 0xa6, 0x38, - 0x56, 0x93, 0xa5, 0x5f, 0x8a, 0x41, 0xfe, 0x96, 0x40, 0x6e, 0x60, 0x0f, 0x5d, 0x05, 0xf0, 0x9f, - 0x24, 0xdc, 0xe6, 0xbe, 0xc5, 0xee, 0x67, 0x2d, 0xfa, 0x3c, 0x72, 0x88, 0x1c, 0x5d, 0xa6, 0x86, - 0x68, 0x5b, 0x2e, 0xff, 0xca, 0x6a, 0x08, 0xab, 0x4f, 0x8c, 0x9e, 0x04, 0x44, 0x23, 0x9c, 0x72, - 0x60, 0x79, 0xba, 0xd9, 0x52, 0x6c, 0xeb, 0x36, 0xff, 0x76, 0x35, 0x21, 0x4b, 0x74, 0xe4, 0x16, - 0x1d, 0xa8, 0x93, 0x7e, 0x22, 0x74, 0xd6, 0x47, 0x21, 0xc5, 0xba, 0xda, 0x6c, 0x3a, 0xd8, 0x75, - 0x79, 0x10, 0x13, 0x4d, 0x74, 0x15, 0xc6, 0xed, 0xce, 0x8e, 0x22, 0x22, 0x46, 0xee, 0xc2, 0xfd, - 0xfd, 0xfc, 0x5f, 0xd8, 0x07, 0x8f, 0x00, 0x69, 0xbb, 0xb3, 0x43, 0xac, 0xe5, 0x41, 0xc8, 0xf7, - 0x11, 0x26, 0x77, 0x10, 0xc8, 0x41, 0x7f, 0x4d, 0x81, 0xcf, 0x40, 0xb1, 0x1d, 0xdd, 0x72, 0x74, - 0xef, 0x88, 0xbe, 0x12, 0x95, 0x90, 0x25, 0x31, 0x50, 0xe7, 0xfd, 0xa5, 0x7d, 0x98, 0x6c, 0xd0, - 0x22, 0x2e, 0x90, 0xfc, 0x62, 0x20, 0x5f, 0x6c, 0xb8, 0x7c, 0x03, 0x25, 0x8b, 0xf7, 0x48, 0xb6, - 0xf4, 0xe2, 0x40, 0xeb, 0xbc, 0x7c, 0x72, 0xeb, 0x8c, 0x66, 0xbb, 0xef, 0x3e, 0x1c, 0x71, 0x4e, - 0x66, 0x9c, 0xe1, 0xf0, 0x35, 0xaa, 0x61, 0x0e, 0xdb, 0xa3, 0xcd, 0x1e, 0x9f, 0x54, 0x67, 0x87, - 0x84, 0xd1, 0xd9, 0xa1, 0x2e, 0x54, 0xba, 0x02, 0x13, 0x75, 0xd5, 0xf1, 0x1a, 0xd8, 0xbb, 0x8e, - 0xd5, 0x26, 0x76, 0xa2, 0x59, 0x77, 0x42, 0x64, 0x5d, 0x04, 0x49, 0x9a, 0x5a, 0x59, 0xd6, 0xa1, - 0x7f, 0x97, 0xf6, 0x20, 0x49, 0x5f, 0x8b, 0xf4, 0x33, 0x32, 0xe7, 0x60, 0x19, 0x99, 0xc4, 0xd2, - 0x23, 0x0f, 0xbb, 0xe2, 0xd0, 0x80, 0x36, 0xd0, 0x73, 0x22, 0xaf, 0x26, 0x8e, 0xcf, 0xab, 0xdc, - 0x10, 0x79, 0x76, 0x35, 0x60, 0x7c, 0x89, 0x84, 0xe2, 0xd5, 0xaa, 0x2f, 0x48, 0x2c, 0x10, 0x04, - 0xad, 0xc3, 0xa4, 0xad, 0x3a, 0x1e, 0xfd, 0x42, 0x64, 0x8f, 0xce, 0x82, 0xdb, 0xfa, 0x7c, 0xaf, - 0xe7, 0x45, 0x26, 0xcb, 0x9f, 0x32, 0x61, 0x87, 0x3b, 0x4b, 0xff, 0x39, 0x09, 0x69, 0xae, 0x8c, - 0x0f, 0xc1, 0x38, 0x57, 0x2b, 0xb7, 0xce, 0x07, 0x16, 0x7b, 0x13, 0xd3, 0xa2, 0x9f, 0x40, 0x38, - 0x9e, 0xe0, 0x41, 0x8f, 0x40, 0x46, 0xdb, 0x53, 0x75, 0x53, 0xd1, 0x9b, 0xbc, 0x20, 0xcc, 0xbd, - 0xf3, 0xf6, 0xfc, 0xf8, 0x32, 0xe9, 0x5b, 0xad, 0xca, 0xe3, 0x74, 0x70, 0xb5, 0x49, 0x2a, 0x81, - 0x3d, 0xac, 0xb7, 0xf6, 0x3c, 0xee, 0x61, 0xbc, 0x85, 0x9e, 0x87, 0x24, 0x31, 0x08, 0xfe, 0xfd, - 0xe0, 0x6c, 0x4f, 0x85, 0xef, 0x6f, 0xa1, 0x97, 0x32, 0xe4, 0xc1, 0x9f, 0xfa, 0x8f, 0xf3, 0x31, - 0x99, 0x72, 0xa0, 0x65, 0x98, 0x30, 0x54, 0xd7, 0x53, 0x68, 0x06, 0x23, 0x8f, 0x4f, 0x51, 0x88, - 0xb3, 0xbd, 0x0a, 0xe1, 0x8a, 0xe5, 0xa2, 0xe7, 0x08, 0x17, 0xeb, 0x6a, 0xa2, 0x73, 0x20, 0x51, - 0x10, 0xcd, 0x6a, 0xb7, 0x75, 0x8f, 0xd5, 0x56, 0x69, 0xaa, 0xf7, 0x02, 0xe9, 0x5f, 0xa6, 0xdd, - 0xb4, 0xc2, 0xba, 0x0f, 0xb2, 0xf4, 0x8b, 0x25, 0x4a, 0xc2, 0xde, 0xc5, 0xcd, 0x90, 0x0e, 0x3a, - 0xf8, 0x28, 0x4c, 0x06, 0xf1, 0x91, 0x91, 0x64, 0x18, 0x4a, 0xd0, 0x4d, 0x09, 0x9f, 0x86, 0x19, - 0x13, 0x1f, 0xd2, 0xb7, 0x83, 0x23, 0xd4, 0x59, 0x4a, 0x8d, 0xc8, 0xd8, 0xad, 0x28, 0xc7, 0xc3, - 0x50, 0xd0, 0x84, 0xf2, 0x19, 0x2d, 0x50, 0xda, 0x09, 0xbf, 0x97, 0x92, 0x9d, 0x85, 0x8c, 0x6a, - 0xdb, 0x8c, 0x20, 0xc7, 0xe3, 0xa3, 0x6d, 0xd3, 0xa1, 0xc7, 0x61, 0x8a, 0xce, 0xd1, 0xc1, 0x6e, - 0xc7, 0xf0, 0x38, 0x48, 0x9e, 0xd2, 0x4c, 0x92, 0x01, 0x99, 0xf5, 0x53, 0xda, 0x0f, 0xc0, 0x04, - 0x3e, 0xd0, 0x9b, 0xd8, 0xd4, 0x30, 0xa3, 0x9b, 0xa0, 0x74, 0x79, 0xd1, 0x49, 0x89, 0x1e, 0x03, - 0x3f, 0xee, 0x29, 0x22, 0x26, 0x17, 0x18, 0x9e, 0xe8, 0xaf, 0xb0, 0xee, 0xd2, 0xdb, 0x31, 0x48, - 0x56, 0x55, 0x4f, 0x25, 0x15, 0x86, 0x77, 0xc8, 0x32, 0x4d, 0x5e, 0x26, 0x7f, 0xa2, 0x8f, 0x40, - 0x46, 0xa0, 0x72, 0x57, 0x99, 0xeb, 0x5d, 0xba, 0x1a, 0xa7, 0x58, 0xd3, 0x5d, 0x8f, 0xaf, 0x9f, - 0xcf, 0x85, 0x3e, 0x08, 0x19, 0x7e, 0xa3, 0xe0, 0xfa, 0xf6, 0xd3, 0x83, 0xc0, 0x77, 0xda, 0xc2, - 0x70, 0x7d, 0x0e, 0xb2, 0x14, 0x96, 0xa3, 0xb7, 0x74, 0x53, 0x35, 0x14, 0xf7, 0xa3, 0x1d, 0xba, - 0xcf, 0xd4, 0x5f, 0x67, 0xaf, 0x6c, 0x27, 0x65, 0x24, 0xc6, 0x1a, 0x74, 0xa8, 0xa1, 0xbf, 0x8e, - 0x7d, 0xc7, 0x4c, 0x87, 0x22, 0xc4, 0xa7, 0xe2, 0x70, 0xaa, 0xda, 0xb1, 0x0d, 0x5d, 0x53, 0x3d, - 0x7c, 0xcb, 0xf2, 0xb0, 0x90, 0x18, 0x3d, 0x05, 0xe9, 0x03, 0xcb, 0xc3, 0x8a, 0xca, 0xfd, 0xea, - 0x74, 0x9f, 0x1c, 0x69, 0x79, 0x58, 0x4e, 0x11, 0xaa, 0x8a, 0x4f, 0xbe, 0xc3, 0x1d, 0xfb, 0x58, - 0xf2, 0xa5, 0x93, 0xa5, 0xd2, 0x88, 0x7d, 0x72, 0x52, 0x96, 0xc0, 0x02, 0xfb, 0x64, 0x84, 0x4b, - 0x90, 0xf5, 0xe3, 0x33, 0x77, 0xa8, 0xd1, 0x7c, 0x32, 0x60, 0x2b, 0xfd, 0xeb, 0x38, 0x9c, 0x5d, - 0x23, 0xce, 0xbd, 0x4c, 0x3f, 0xe1, 0xad, 0x78, 0x9e, 0xaa, 0xed, 0xfb, 0x6a, 0x59, 0x85, 0x29, - 0xcd, 0x32, 0x77, 0x0d, 0x5d, 0xa3, 0x72, 0x07, 0xc5, 0x68, 0x57, 0x5e, 0x64, 0x53, 0xa6, 0x38, - 0xd4, 0x59, 0x65, 0x29, 0xc4, 0x46, 0x7b, 0x88, 0xb1, 0x12, 0xbf, 0xb5, 0x4c, 0x85, 0x87, 0x16, - 0x96, 0x22, 0xf3, 0xac, 0xf3, 0x3a, 0x0b, 0x30, 0x1b, 0x30, 0xb3, 0x73, 0xf4, 0xba, 0x6a, 0x7a, - 0xba, 0x89, 0x43, 0x6e, 0xc7, 0x7f, 0x69, 0xe6, 0xd8, 0xc2, 0x65, 0xda, 0x67, 0x0c, 0x7c, 0x72, - 0x80, 0xe2, 0x93, 0x03, 0x14, 0x7f, 0x2f, 0xf4, 0xf9, 0xed, 0x18, 0x64, 0x7c, 0xf5, 0xa9, 0x70, - 0xa6, 0x29, 0xcc, 0x4d, 0xa1, 0x06, 0xe3, 0x3b, 0x11, 0x53, 0xe2, 0xa3, 0xbd, 0x33, 0xea, 0x6b, - 0x9f, 0xd7, 0xc7, 0xe4, 0x53, 0xcd, 0xbe, 0x86, 0x6b, 0xc2, 0xfd, 0x06, 0x51, 0x9d, 0xc2, 0xbf, - 0xd0, 0x56, 0xe9, 0x02, 0x06, 0xcf, 0x61, 0xf6, 0xf9, 0xc4, 0x80, 0xc5, 0xea, 0xb7, 0xe8, 0xd7, - 0xc7, 0xe4, 0xb3, 0xc6, 0xa0, 0x41, 0x5e, 0x6a, 0x97, 0xd6, 0x20, 0x1f, 0xf6, 0x76, 0xe2, 0xdd, - 0xa1, 0xa9, 0x25, 0xfa, 0x7b, 0xb7, 0x0f, 0xd2, 0x15, 0x1b, 0xc8, 0x6e, 0x55, 0x78, 0x3e, 0xfa, - 0x30, 0x4c, 0x08, 0xaf, 0x57, 0x0c, 0xdd, 0xf5, 0x38, 0xdc, 0xd9, 0x81, 0xc1, 0x42, 0x16, 0x3f, - 0x74, 0xe5, 0x12, 0x49, 0x4a, 0x1f, 0x81, 0x71, 0x3e, 0x40, 0x8a, 0x32, 0xff, 0x93, 0x55, 0x92, - 0x73, 0x58, 0x8e, 0xce, 0xf9, 0x7d, 0xab, 0x4d, 0x7f, 0xab, 0x1a, 0x0f, 0x6d, 0x55, 0x5f, 0x86, - 0xd3, 0x24, 0x0a, 0x56, 0x0e, 0x54, 0xdd, 0x50, 0x77, 0x74, 0x43, 0xf7, 0x8e, 0x78, 0xfa, 0xbd, - 0x0f, 0xb2, 0x8e, 0x75, 0x5b, 0x71, 0x2c, 0xcb, 0x13, 0xd1, 0x31, 0xe3, 0x58, 0xb7, 0x65, 0xd2, - 0x26, 0x4f, 0xd3, 0x2c, 0xa3, 0xd3, 0x36, 0xf9, 0x78, 0x9c, 0x8e, 0xe7, 0x58, 0x1f, 0x25, 0x29, - 0x7d, 0x27, 0x0e, 0x49, 0xb2, 0x7a, 0xe8, 0xd9, 0xd0, 0x3e, 0xba, 0xd0, 0xaf, 0x2c, 0x68, 0xe8, - 0x2d, 0x13, 0x37, 0xd7, 0xdd, 0x56, 0xe8, 0x57, 0x5a, 0x82, 0xac, 0x1c, 0x8f, 0x64, 0xe5, 0x19, - 0x48, 0x39, 0x56, 0xc7, 0x6c, 0x8a, 0xaf, 0x01, 0x68, 0x03, 0xd5, 0x20, 0xe3, 0x27, 0xdb, 0xe4, - 0xb0, 0x64, 0x3b, 0x49, 0x16, 0x84, 0x94, 0x02, 0xbc, 0x43, 0x1e, 0xdf, 0xe1, 0x39, 0xf7, 0x1e, - 0xf8, 0x04, 0xa9, 0xc9, 0x83, 0x80, 0x26, 0x72, 0x10, 0x8b, 0xcb, 0x92, 0x3f, 0xc0, 0x93, 0x50, - 0x34, 0xfa, 0xb1, 0x3a, 0x6e, 0x9c, 0xce, 0x2b, 0x88, 0x7e, 0xec, 0x57, 0x63, 0xee, 0x87, 0xac, - 0xab, 0xb7, 0x4c, 0xd5, 0xeb, 0x38, 0x98, 0x27, 0xf0, 0xa0, 0xa3, 0xf4, 0xb5, 0x18, 0xa4, 0x59, - 0x41, 0x10, 0xd2, 0x5b, 0xac, 0xbf, 0xde, 0xe2, 0x83, 0xf4, 0x96, 0x78, 0xef, 0x7a, 0xab, 0x00, - 0xf8, 0xc2, 0xb8, 0xfc, 0x87, 0x3c, 0xfa, 0xc4, 0x2f, 0x26, 0x62, 0x43, 0x6f, 0x71, 0x9f, 0x08, - 0x31, 0x95, 0xfe, 0x43, 0x0c, 0xb2, 0xfe, 0x38, 0xaa, 0xc0, 0x84, 0x90, 0x4b, 0xd9, 0x35, 0xd4, - 0x16, 0xb7, 0x9d, 0x07, 0x06, 0x0a, 0x77, 0xcd, 0x50, 0x5b, 0x72, 0x8e, 0xcb, 0x43, 0x1a, 0xfd, - 0xd7, 0x21, 0x3e, 0x60, 0x1d, 0x22, 0x0b, 0x9f, 0x78, 0x6f, 0x0b, 0x1f, 0x59, 0xa2, 0x64, 0xf7, - 0x12, 0x7d, 0x39, 0x4e, 0xcf, 0x84, 0x6c, 0xcb, 0x55, 0x8d, 0x1f, 0x85, 0x47, 0xdc, 0x07, 0x59, - 0xdb, 0x32, 0x14, 0x36, 0xc2, 0xbe, 0x92, 0xc9, 0xd8, 0x96, 0x21, 0xf7, 0x2c, 0x7b, 0xea, 0x1e, - 0xb9, 0x4b, 0xfa, 0x1e, 0x68, 0x6d, 0xbc, 0x5b, 0x6b, 0x0e, 0xe4, 0x99, 0x2a, 0x78, 0x4c, 0x7a, - 0x9a, 0xe8, 0x80, 0xee, 0x31, 0x62, 0xbd, 0x5b, 0x18, 0x26, 0x36, 0xa3, 0x94, 0x39, 0x1d, 0xe1, - 0x60, 0x15, 0x74, 0xbf, 0xc3, 0xc4, 0xb0, 0x59, 0xca, 0x9c, 0xae, 0xf4, 0x57, 0x62, 0x00, 0x41, - 0x72, 0x27, 0xc5, 0xbc, 0x4b, 0x45, 0x50, 0x22, 0x4f, 0x9e, 0x1b, 0xb4, 0x68, 0xfc, 0xf9, 0x79, - 0x37, 0x2c, 0xf7, 0x32, 0x4c, 0x04, 0xc6, 0xe8, 0x62, 0x21, 0xcc, 0xdc, 0x31, 0x39, 0xbe, 0x81, - 0x3d, 0x39, 0x7f, 0x10, 0x6a, 0x95, 0xfe, 0x69, 0x0c, 0xb2, 0x54, 0xa6, 0x75, 0xec, 0xa9, 0x91, - 0x35, 0x8c, 0xbd, 0xf7, 0x35, 0x7c, 0x00, 0x80, 0xc1, 0xd0, 0x0a, 0x93, 0x59, 0x56, 0x96, 0xf6, - 0xd0, 0xc2, 0xf2, 0x92, 0xaf, 0xf0, 0xc4, 0xf1, 0x0a, 0x17, 0x87, 0x17, 0x5c, 0xed, 0x67, 0x60, - 0x9c, 0xfe, 0xf0, 0xdd, 0xa1, 0xcb, 0x0b, 0x90, 0xb4, 0xd9, 0x69, 0x6f, 0x1d, 0xba, 0x25, 0x13, - 0xc6, 0xb7, 0x0e, 0xd9, 0x11, 0xf3, 0xb1, 0x09, 0x26, 0xc8, 0x55, 0x09, 0x91, 0xab, 0xd0, 0x05, - 0x48, 0xd3, 0x2d, 0xa9, 0x28, 0x91, 0xfa, 0x64, 0xdd, 0x8d, 0xf5, 0x2d, 0x76, 0x34, 0xcc, 0x29, - 0x4b, 0x2b, 0x90, 0x5b, 0x57, 0x0d, 0x83, 0xbe, 0x14, 0xb0, 0x45, 0x7f, 0x34, 0xc2, 0x2f, 0xad, - 0xbd, 0x43, 0x25, 0xb4, 0x9b, 0x2d, 0x88, 0xfe, 0xad, 0x43, 0xba, 0x95, 0x28, 0x40, 0xdc, 0x3b, - 0xe4, 0x01, 0x23, 0xee, 0x1d, 0x96, 0x30, 0x64, 0x04, 0xf8, 0xc8, 0xbf, 0x15, 0x37, 0x03, 0x29, - 0xd3, 0x6a, 0x62, 0x26, 0x6f, 0x5e, 0x66, 0x8d, 0xe8, 0x71, 0x79, 0x32, 0x7a, 0x5c, 0xfe, 0xf8, - 0xaf, 0xc7, 0x20, 0x17, 0x8a, 0x69, 0xe8, 0x19, 0x38, 0xb5, 0xb4, 0xb6, 0xb9, 0x7c, 0x53, 0x59, - 0xad, 0x2a, 0xd7, 0xd6, 0x2a, 0x2b, 0xc1, 0xb7, 0xab, 0xb3, 0xa7, 0xef, 0xdc, 0x5d, 0x40, 0x21, - 0xda, 0x6d, 0x93, 0x5e, 0xd1, 0xa2, 0xf3, 0x30, 0x13, 0x65, 0xa9, 0x2c, 0x35, 0x6a, 0x1b, 0x5b, - 0x52, 0x6c, 0xf6, 0xd4, 0x9d, 0xbb, 0x0b, 0x53, 0x21, 0x8e, 0xca, 0x8e, 0x8b, 0x4d, 0xaf, 0x97, - 0x61, 0x79, 0x73, 0x7d, 0x7d, 0x75, 0x4b, 0x8a, 0xf7, 0x30, 0xf0, 0x24, 0xf3, 0x18, 0x4c, 0x45, - 0x19, 0x36, 0x56, 0xd7, 0xa4, 0xc4, 0x2c, 0xba, 0x73, 0x77, 0xa1, 0x10, 0xa2, 0xde, 0xd0, 0x8d, - 0xd9, 0xcc, 0x27, 0x3e, 0x3f, 0x37, 0xf6, 0xf3, 0x3f, 0x37, 0x17, 0x23, 0x33, 0x9b, 0x88, 0xc4, - 0x35, 0xf4, 0x24, 0x9c, 0x69, 0xac, 0xae, 0x6c, 0xd4, 0xaa, 0xca, 0x7a, 0x63, 0x45, 0x5c, 0x72, - 0x8a, 0xd9, 0x4d, 0xde, 0xb9, 0xbb, 0x90, 0xe3, 0x53, 0x1a, 0x44, 0x5d, 0x97, 0x6b, 0xb7, 0x36, - 0xb7, 0x6a, 0x52, 0x8c, 0x51, 0xd7, 0x1d, 0x4c, 0xea, 0x4e, 0x4a, 0xfd, 0x34, 0x9c, 0xed, 0x43, - 0xed, 0x4f, 0x6c, 0xea, 0xce, 0xdd, 0x85, 0x89, 0xba, 0x83, 0x99, 0xcf, 0x53, 0x8e, 0x45, 0x28, - 0xf6, 0x72, 0x6c, 0xd6, 0x37, 0x1b, 0x95, 0x35, 0x69, 0x61, 0x56, 0xba, 0x73, 0x77, 0x21, 0x2f, - 0x02, 0x38, 0xa1, 0x0f, 0x66, 0xf6, 0x7e, 0x1e, 0x76, 0x7d, 0xf2, 0x49, 0x78, 0x88, 0x5f, 0xff, - 0xb8, 0x9e, 0xba, 0xaf, 0x9b, 0x2d, 0xff, 0xde, 0x8e, 0xb7, 0xf9, 0xa1, 0xd7, 0x69, 0x7e, 0xc5, - 0x24, 0x7a, 0x87, 0xdc, 0xde, 0x0d, 0x7c, 0x71, 0x65, 0x76, 0xc8, 0xfb, 0x1c, 0xc3, 0x4f, 0xcd, - 0x06, 0xdf, 0x0c, 0xce, 0x0e, 0xb9, 0x7f, 0x9c, 0x3d, 0xf6, 0x5c, 0xaf, 0xf4, 0xc9, 0x18, 0x14, - 0xae, 0xeb, 0xae, 0x67, 0x39, 0xba, 0xa6, 0x1a, 0xf4, 0x8b, 0xd5, 0x4b, 0xa3, 0xe6, 0x83, 0xae, - 0xf0, 0xf4, 0x02, 0xa4, 0x0f, 0x54, 0x83, 0x05, 0xe2, 0xf0, 0x35, 0x70, 0xb7, 0xfa, 0x82, 0x70, - 0x2c, 0x00, 0x18, 0x5b, 0xe9, 0x4b, 0x71, 0x98, 0xa4, 0xce, 0xe0, 0xb2, 0x1f, 0x63, 0xf4, 0xb0, - 0x8b, 0xea, 0x90, 0x74, 0x54, 0x8f, 0xdf, 0x17, 0x2d, 0x7d, 0x90, 0x5f, 0x01, 0x3e, 0x32, 0xfc, - 0x22, 0x6f, 0xb1, 0xf7, 0x96, 0x90, 0x22, 0xa1, 0x97, 0x20, 0xd3, 0x56, 0x0f, 0x15, 0x8a, 0x1a, - 0xbf, 0x07, 0xa8, 0xe3, 0x6d, 0xf5, 0x90, 0xc8, 0x8a, 0x9a, 0x30, 0x49, 0x80, 0xb5, 0x3d, 0xd5, - 0x6c, 0x61, 0x86, 0x9f, 0xb8, 0x07, 0xf8, 0x13, 0x6d, 0xf5, 0x70, 0x99, 0x62, 0x92, 0xa7, 0x94, - 0x33, 0x9f, 0x7e, 0x73, 0x7e, 0x8c, 0xde, 0xb0, 0xfe, 0x4a, 0x0c, 0x20, 0x50, 0x17, 0xfa, 0x23, - 0x20, 0x69, 0x7e, 0x8b, 0x3e, 0xde, 0xf5, 0xf7, 0x88, 0x03, 0x16, 0xa2, 0x4b, 0xd9, 0xac, 0x98, - 0xf8, 0xe6, 0xdb, 0xf3, 0x31, 0x79, 0x52, 0xeb, 0x5a, 0x87, 0x1a, 0xe4, 0x3a, 0x76, 0x93, 0xec, - 0x42, 0xe9, 0xf9, 0x5d, 0xfc, 0x04, 0x85, 0x09, 0x30, 0x46, 0x32, 0x14, 0x92, 0xfe, 0x4b, 0x31, - 0xc8, 0x55, 0x43, 0xef, 0x77, 0x14, 0x61, 0xbc, 0x6d, 0x99, 0xfa, 0x3e, 0x37, 0xbb, 0xac, 0x2c, - 0x9a, 0x68, 0x16, 0x32, 0xec, 0x5b, 0x7d, 0xef, 0x48, 0x5c, 0x76, 0x89, 0x36, 0xe1, 0xba, 0x8d, - 0x77, 0x5c, 0x5d, 0xe8, 0x5a, 0x16, 0x4d, 0xf4, 0x18, 0x48, 0x2e, 0xd6, 0x3a, 0x8e, 0xee, 0x1d, - 0x29, 0x9a, 0x65, 0x7a, 0xaa, 0xe6, 0xf1, 0xaf, 0xbe, 0x27, 0x45, 0xff, 0x32, 0xeb, 0x26, 0x20, - 0x4d, 0xec, 0xa9, 0xba, 0xe1, 0x16, 0xd9, 0x3b, 0x10, 0xa2, 0x19, 0x12, 0xf7, 0xbb, 0xe9, 0xf0, - 0xed, 0xc4, 0x32, 0x48, 0x96, 0x8d, 0x9d, 0x48, 0x19, 0xcc, 0x2c, 0xb4, 0xf8, 0x6b, 0x5f, 0x79, - 0x6a, 0x86, 0xab, 0x9b, 0x17, 0xc2, 0xec, 0xb3, 0x06, 0x79, 0x52, 0x70, 0x88, 0xfa, 0xf8, 0x15, - 0xb2, 0x60, 0xe2, 0xa8, 0xcf, 0xee, 0xec, 0x04, 0x37, 0x1a, 0x33, 0x3d, 0x7a, 0xad, 0x98, 0x47, - 0x4b, 0xc5, 0x6f, 0x04, 0xd0, 0xc1, 0x35, 0xc2, 0x4d, 0x7c, 0x44, 0x56, 0x8b, 0xe3, 0xd4, 0x29, - 0x0c, 0x29, 0x6b, 0x5f, 0x53, 0x75, 0x43, 0xfc, 0x04, 0x89, 0xcc, 0x5b, 0xa8, 0x0c, 0x69, 0xd7, - 0x53, 0xbd, 0x8e, 0xcb, 0x7f, 0x2a, 0xb4, 0x34, 0xc8, 0x32, 0x96, 0x2c, 0xb3, 0xd9, 0xa0, 0x94, - 0x32, 0xe7, 0x40, 0x5b, 0x90, 0xf6, 0xac, 0x7d, 0x6c, 0x72, 0x25, 0x9d, 0xc8, 0xaa, 0xfb, 0xbc, - 0x86, 0xc0, 0xb0, 0x50, 0x0b, 0xa4, 0x26, 0x36, 0x70, 0x8b, 0x15, 0x71, 0x7b, 0x2a, 0xd9, 0xeb, - 0xa4, 0xef, 0x81, 0xd7, 0x4c, 0xfa, 0xa8, 0x0d, 0x0a, 0x8a, 0x6e, 0x46, 0xdf, 0x30, 0x62, 0xbf, - 0xab, 0xfb, 0x81, 0x41, 0xf3, 0x0f, 0x59, 0xa6, 0x38, 0x47, 0x0e, 0xbf, 0x8c, 0xf4, 0x18, 0x48, - 0x1d, 0x73, 0xc7, 0x32, 0xe9, 0x0f, 0x05, 0xf0, 0x0d, 0x44, 0x86, 0x96, 0x64, 0x93, 0x7e, 0x3f, - 0x3f, 0x90, 0xba, 0x09, 0x85, 0x80, 0x94, 0xfa, 0x4e, 0xf6, 0x04, 0xbe, 0x33, 0xe1, 0xf3, 0x92, - 0x51, 0x74, 0x1d, 0x20, 0x70, 0x4c, 0x7a, 0x32, 0x9c, 0x1b, 0xbc, 0x86, 0x81, 0x77, 0x8b, 0xad, - 0x61, 0xc0, 0x8b, 0x0c, 0x98, 0x6e, 0xeb, 0xa6, 0xe2, 0x62, 0x63, 0x57, 0xe1, 0xaa, 0x22, 0x90, - 0xb9, 0x7b, 0xb0, 0xb4, 0x53, 0x6d, 0xdd, 0x6c, 0x60, 0x63, 0xb7, 0xea, 0xc3, 0xa2, 0x79, 0xc8, - 0xe1, 0x83, 0xb6, 0xef, 0x2a, 0xec, 0xd7, 0xab, 0x01, 0x1f, 0xb4, 0xb9, 0x2f, 0x94, 0xf3, 0x9f, - 0x78, 0x73, 0x7e, 0x8c, 0x3b, 0xdb, 0x58, 0xa9, 0x4e, 0xaf, 0x2f, 0xf9, 0x18, 0x76, 0xd1, 0x25, - 0xc8, 0xaa, 0xa2, 0x41, 0x8b, 0xda, 0xe3, 0xfc, 0x2c, 0x20, 0x65, 0xee, 0xfb, 0xc6, 0x6f, 0x2d, - 0xc4, 0x4a, 0x3f, 0x17, 0x83, 0x74, 0xf5, 0x56, 0x5d, 0xd5, 0x1d, 0x54, 0x83, 0xa9, 0xc0, 0xe2, - 0x46, 0x75, 0xde, 0xc0, 0x48, 0x85, 0xf7, 0xd6, 0x06, 0x6d, 0x85, 0x8f, 0x85, 0xe9, 0xde, 0x24, - 0x77, 0x4d, 0xbc, 0x06, 0xe3, 0x4c, 0x4a, 0x17, 0x95, 0x21, 0x65, 0x93, 0x3f, 0xf8, 0xe9, 0xd5, - 0xdc, 0x40, 0x4b, 0xa5, 0xf4, 0xfe, 0xed, 0x12, 0x61, 0x29, 0xfd, 0x6e, 0x0c, 0xa0, 0x7a, 0xeb, - 0xd6, 0x96, 0xa3, 0xdb, 0x06, 0xf6, 0xee, 0xd5, 0x8c, 0xd7, 0xe0, 0x54, 0x68, 0xbf, 0xe5, 0x68, - 0x23, 0xcf, 0x7a, 0x3a, 0xd8, 0x71, 0x39, 0x5a, 0x5f, 0xb4, 0xa6, 0xeb, 0xf9, 0x68, 0x89, 0x91, - 0xd1, 0xaa, 0xae, 0xd7, 0x5f, 0x8d, 0x0d, 0xc8, 0x05, 0xd3, 0x77, 0x51, 0x15, 0x32, 0x1e, 0xff, - 0x9b, 0x6b, 0xb3, 0x34, 0x58, 0x9b, 0x82, 0x4d, 0x1c, 0x31, 0x0a, 0xce, 0xd2, 0xff, 0x23, 0x4a, - 0x0d, 0x4c, 0xfa, 0x0f, 0x94, 0x19, 0x91, 0xe0, 0xcc, 0x83, 0xe7, 0xbd, 0x28, 0x39, 0x38, 0x56, - 0x97, 0x56, 0x3f, 0x1e, 0x87, 0xe9, 0x6d, 0x11, 0x8e, 0xfe, 0xc0, 0x6a, 0xa2, 0x0e, 0xe3, 0xd8, - 0xf4, 0x1c, 0x1d, 0x8b, 0x0d, 0xed, 0xd3, 0x83, 0xd6, 0xba, 0xcf, 0x5c, 0xe8, 0x4f, 0xda, 0x89, - 0x3b, 0x4f, 0x0e, 0xd3, 0xa5, 0x85, 0x7f, 0x1f, 0x87, 0xe2, 0x20, 0x4e, 0xf4, 0x28, 0x4c, 0x6a, - 0x0e, 0xa6, 0x1d, 0x4a, 0xe4, 0xc4, 0xb0, 0x20, 0xba, 0x79, 0x56, 0x58, 0x07, 0x52, 0x61, 0x11, - 0xc3, 0x22, 0xa4, 0x27, 0x2e, 0xa9, 0x0a, 0x01, 0x33, 0xcd, 0x0b, 0x18, 0x26, 0x75, 0x53, 0xf7, - 0x74, 0xd5, 0x50, 0x76, 0x54, 0x43, 0x15, 0x77, 0x6c, 0xbf, 0xd7, 0x48, 0x5e, 0xe0, 0xa0, 0x4b, - 0x0c, 0x13, 0xdd, 0x82, 0x71, 0x01, 0x9f, 0xbc, 0x07, 0xf0, 0x02, 0x2c, 0x54, 0x66, 0xfd, 0x66, - 0x1c, 0xa6, 0x64, 0xdc, 0xfc, 0xc3, 0xa5, 0xd6, 0x1f, 0x03, 0x60, 0x0e, 0x47, 0xe2, 0xe0, 0x7b, - 0xd0, 0x6c, 0xaf, 0x03, 0x67, 0x19, 0x5e, 0xd5, 0xf5, 0x42, 0xba, 0xfd, 0x46, 0x1c, 0xf2, 0x61, - 0xdd, 0xfe, 0x21, 0xc8, 0x0b, 0x68, 0x35, 0x88, 0x06, 0x49, 0xfe, 0x63, 0xdc, 0x03, 0xa2, 0x41, - 0x8f, 0xd5, 0x1d, 0x1f, 0x06, 0x7e, 0x10, 0x87, 0x74, 0x5d, 0x75, 0xd4, 0xb6, 0x8b, 0x6e, 0xf4, - 0x54, 0x78, 0xe2, 0xe8, 0xb0, 0xe7, 0xbf, 0x5c, 0xe0, 0xbb, 0x7e, 0x66, 0x72, 0x9f, 0xee, 0x53, - 0xe0, 0x3d, 0x0c, 0x05, 0xb2, 0x87, 0x0c, 0x5d, 0x5c, 0xc6, 0xe9, 0x2b, 0x28, 0x64, 0x13, 0x18, - 0xba, 0x95, 0x9c, 0x87, 0x1c, 0x21, 0x0b, 0x02, 0x1d, 0xa1, 0x81, 0xb6, 0x7a, 0x58, 0x63, 0x3d, - 0xe8, 0x29, 0x40, 0x7b, 0xfe, 0xae, 0x5e, 0x09, 0x54, 0x40, 0xe8, 0xa6, 0x82, 0x11, 0x41, 0xfe, - 0x00, 0x00, 0x91, 0x42, 0x61, 0x2f, 0x00, 0xb3, 0x4d, 0x50, 0x96, 0xf4, 0x54, 0xe9, 0x4b, 0xc0, - 0x3f, 0xce, 0x8a, 0xc5, 0xae, 0xed, 0x25, 0xaf, 0xd3, 0xd7, 0x4e, 0x66, 0xa9, 0x3f, 0x78, 0x7b, - 0x7e, 0xf6, 0x48, 0x6d, 0x1b, 0xe5, 0x52, 0x1f, 0xc8, 0x12, 0x2d, 0x1e, 0xa3, 0xdb, 0xd2, 0x90, - 0x05, 0x7f, 0x3e, 0x06, 0x28, 0x08, 0xb9, 0x32, 0x76, 0x6d, 0xb2, 0xef, 0x21, 0x55, 0x71, 0xa8, - 0x84, 0x8d, 0x1d, 0x5f, 0x15, 0x07, 0xfc, 0xa2, 0x2a, 0x0e, 0x79, 0xc4, 0x95, 0x20, 0xc0, 0xc5, - 0xf9, 0x1a, 0xf6, 0x79, 0x7b, 0x7b, 0x71, 0xd9, 0xd2, 0x05, 0x77, 0x4f, 0x0c, 0x1b, 0x2b, 0xfd, - 0x66, 0x0c, 0xce, 0xf6, 0x58, 0x93, 0x2f, 0xec, 0x1f, 0x03, 0xe4, 0x84, 0x06, 0xf9, 0xaf, 0xaa, - 0x32, 0xa1, 0x4f, 0x6c, 0x9c, 0x53, 0x4e, 0x4f, 0xac, 0x7c, 0xbf, 0x62, 0x34, 0x7b, 0xab, 0xfb, - 0x1f, 0xc7, 0x60, 0x26, 0x2c, 0x8c, 0x3f, 0xad, 0x0d, 0xc8, 0x87, 0x65, 0xe1, 0x13, 0x7a, 0x68, - 0x94, 0x09, 0xf1, 0xb9, 0x44, 0xf8, 0xd1, 0x8b, 0x81, 0xe3, 0xb2, 0xd3, 0xa4, 0x67, 0x46, 0xd6, - 0x8d, 0x90, 0xa9, 0xdb, 0x81, 0x93, 0xa2, 0x8a, 0x49, 0xd6, 0x2d, 0xcb, 0x40, 0x7f, 0x02, 0xa6, - 0x4c, 0xcb, 0x53, 0x88, 0x95, 0xe3, 0xa6, 0xc2, 0xb7, 0xb6, 0x2c, 0xfa, 0xbd, 0x78, 0x32, 0x95, - 0x7d, 0xf7, 0xed, 0xf9, 0x5e, 0xa8, 0x2e, 0x3d, 0x4e, 0x9a, 0x96, 0xb7, 0x44, 0xc7, 0xb7, 0xd8, - 0xc6, 0xd7, 0x81, 0x89, 0xe8, 0xa3, 0x59, 0xb4, 0x5c, 0x3f, 0xf1, 0xa3, 0x27, 0x8e, 0x7b, 0x6c, - 0x7e, 0x27, 0xf4, 0x4c, 0xf6, 0xbe, 0xeb, 0xf7, 0xdf, 0x9c, 0x8f, 0x3d, 0xfe, 0xd5, 0x18, 0x40, - 0xb0, 0xc7, 0x47, 0x4f, 0xc2, 0x99, 0xa5, 0xcd, 0x8d, 0xaa, 0xd2, 0xd8, 0xaa, 0x6c, 0x6d, 0x37, - 0xa2, 0x5f, 0xc5, 0x88, 0x43, 0x63, 0xd7, 0xc6, 0x9a, 0xbe, 0xab, 0xe3, 0x26, 0x7a, 0x04, 0x66, - 0xa2, 0xd4, 0xa4, 0x55, 0xab, 0x4a, 0xb1, 0xd9, 0xfc, 0x9d, 0xbb, 0x0b, 0x19, 0x56, 0x1d, 0xe1, - 0x26, 0x3a, 0x07, 0xa7, 0x7a, 0xe9, 0x56, 0x37, 0x56, 0xa4, 0xf8, 0xec, 0xc4, 0x9d, 0xbb, 0x0b, - 0x59, 0xbf, 0x8c, 0x42, 0x25, 0x40, 0x61, 0x4a, 0x8e, 0x97, 0x98, 0x85, 0x3b, 0x77, 0x17, 0xd2, - 0x4c, 0x6d, 0xb3, 0xc9, 0x4f, 0x7c, 0x7e, 0x6e, 0x6c, 0xe9, 0xda, 0xc0, 0x63, 0xe1, 0x27, 0x8f, - 0xd5, 0xd8, 0xa1, 0x7f, 0xd4, 0x1b, 0x39, 0x0b, 0xfe, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xcf, - 0x4a, 0xb7, 0xed, 0x27, 0x6c, 0x00, 0x00, + // 7537 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x6b, 0x90, 0x24, 0xd9, + 0x75, 0x56, 0xd7, 0xa3, 0xab, 0xab, 0x4e, 0x55, 0x77, 0x67, 0xdf, 0xee, 0x99, 0xa9, 0xe9, 0xdd, + 0xed, 0xee, 0xad, 0x7d, 0xcc, 0xec, 0xab, 0x67, 0x77, 0x76, 0x67, 0x66, 0xa7, 0xc6, 0xd2, 0x52, + 0xaf, 0xe9, 0xe9, 0x99, 0x7e, 0xd4, 0x66, 0x75, 0xcf, 0x3e, 0x0c, 0x24, 0xd9, 0x59, 0xb7, 0xab, + 0x73, 0x3b, 0x2b, 0x33, 0x9d, 0x99, 0xd5, 0x33, 0xbd, 0x61, 0x88, 0x55, 0x88, 0x87, 0x34, 0x04, + 0x20, 0x63, 0x02, 0xcb, 0xb2, 0x46, 0xec, 0x5a, 0x06, 0x19, 0x21, 0xc0, 0xb6, 0x84, 0xc0, 0x38, + 0x00, 0x01, 0x01, 0x08, 0xfd, 0x20, 0x64, 0xff, 0xc0, 0x36, 0x98, 0xc5, 0xac, 0x14, 0x20, 0x84, + 0x8c, 0x85, 0x58, 0x22, 0x20, 0x14, 0x26, 0x88, 0xfb, 0xca, 0x47, 0x3d, 0xba, 0xaa, 0x87, 0xd9, + 0xb5, 0x23, 0xfc, 0xab, 0x2b, 0xcf, 0x3d, 0xdf, 0x97, 0xe7, 0x9e, 0x7b, 0xee, 0xb9, 0xe7, 0xde, + 0xcc, 0x6c, 0xf8, 0xe7, 0x57, 0x60, 0xa9, 0x65, 0x59, 0x2d, 0x03, 0x9f, 0xb3, 0x1d, 0xcb, 0xb3, + 0x76, 0x3a, 0xbb, 0xe7, 0x9a, 0xd8, 0xd5, 0x1c, 0xdd, 0xf6, 0x2c, 0x67, 0x99, 0xca, 0xd0, 0x34, + 0xd3, 0x58, 0x16, 0x1a, 0x85, 0x75, 0x98, 0xb9, 0xaa, 0x1b, 0xb8, 0xea, 0x2b, 0x36, 0xb0, 0x87, + 0x5e, 0x84, 0xe4, 0xae, 0x6e, 0xe0, 0x7c, 0x6c, 0x29, 0x71, 0x36, 0x7b, 0xfe, 0xd1, 0xe5, 0x2e, + 0xd0, 0x72, 0x14, 0x51, 0x27, 0x62, 0x99, 0x22, 0x0a, 0xdf, 0x4e, 0xc2, 0x6c, 0x9f, 0x56, 0x84, + 0x20, 0x69, 0xaa, 0x6d, 0xc2, 0x18, 0x3b, 0x9b, 0x91, 0xe9, 0x6f, 0x94, 0x87, 0x09, 0x5b, 0xd5, + 0xf6, 0xd5, 0x16, 0xce, 0xc7, 0xa9, 0x58, 0x5c, 0xa2, 0x05, 0x80, 0x26, 0xb6, 0xb1, 0xd9, 0xc4, + 0xa6, 0x76, 0x98, 0x4f, 0x2c, 0x25, 0xce, 0x66, 0xe4, 0x90, 0x04, 0x3d, 0x05, 0x33, 0x76, 0x67, + 0xc7, 0xd0, 0x35, 0x25, 0xa4, 0x06, 0x4b, 0x89, 0xb3, 0xe3, 0xb2, 0xc4, 0x1a, 0xaa, 0x81, 0xf2, + 0x19, 0x98, 0xbe, 0x85, 0xd5, 0xfd, 0xb0, 0x6a, 0x96, 0xaa, 0x4e, 0x11, 0x71, 0x48, 0xb1, 0x02, + 0xb9, 0x36, 0x76, 0x5d, 0xb5, 0x85, 0x15, 0xef, 0xd0, 0xc6, 0xf9, 0x24, 0xed, 0xfd, 0x52, 0x4f, + 0xef, 0xbb, 0x7b, 0x9e, 0xe5, 0xa8, 0xad, 0x43, 0x1b, 0xa3, 0x12, 0x64, 0xb0, 0xd9, 0x69, 0x33, + 0x86, 0xf1, 0x01, 0xfe, 0xab, 0x99, 0x9d, 0x76, 0x37, 0x4b, 0x9a, 0xc0, 0x38, 0xc5, 0x84, 0x8b, + 0x9d, 0x03, 0x5d, 0xc3, 0xf9, 0x14, 0x25, 0x38, 0xd3, 0x43, 0xd0, 0x60, 0xed, 0xdd, 0x1c, 0x02, + 0x87, 0x2a, 0x90, 0xc1, 0xb7, 0x3d, 0x6c, 0xba, 0xba, 0x65, 0xe6, 0x27, 0x28, 0xc9, 0x63, 0x7d, + 0x46, 0x11, 0x1b, 0xcd, 0x6e, 0x8a, 0x00, 0x87, 0x2e, 0xc2, 0x84, 0x65, 0x7b, 0xba, 0x65, 0xba, + 0xf9, 0xf4, 0x52, 0xec, 0x6c, 0xf6, 0xfc, 0x83, 0x7d, 0x03, 0x61, 0x93, 0xe9, 0xc8, 0x42, 0x19, + 0xad, 0x82, 0xe4, 0x5a, 0x1d, 0x47, 0xc3, 0x8a, 0x66, 0x35, 0xb1, 0xa2, 0x9b, 0xbb, 0x56, 0x3e, + 0x43, 0x09, 0x16, 0x7b, 0x3b, 0x42, 0x15, 0x2b, 0x56, 0x13, 0xaf, 0x9a, 0xbb, 0x96, 0x3c, 0xe5, + 0x46, 0xae, 0xd1, 0x49, 0x48, 0xb9, 0x87, 0xa6, 0xa7, 0xde, 0xce, 0xe7, 0x68, 0x84, 0xf0, 0xab, + 0xc2, 0x2f, 0xa7, 0x60, 0x7a, 0x94, 0x10, 0xbb, 0x02, 0xe3, 0xbb, 0xa4, 0x97, 0xf9, 0xf8, 0x71, + 0x7c, 0xc0, 0x30, 0x51, 0x27, 0xa6, 0xee, 0xd1, 0x89, 0x25, 0xc8, 0x9a, 0xd8, 0xf5, 0x70, 0x93, + 0x45, 0x44, 0x62, 0xc4, 0x98, 0x02, 0x06, 0xea, 0x0d, 0xa9, 0xe4, 0x3d, 0x85, 0xd4, 0xab, 0x30, + 0xed, 0x9b, 0xa4, 0x38, 0xaa, 0xd9, 0x12, 0xb1, 0x79, 0x6e, 0x98, 0x25, 0xcb, 0x35, 0x81, 0x93, + 0x09, 0x4c, 0x9e, 0xc2, 0x91, 0x6b, 0x54, 0x05, 0xb0, 0x4c, 0x6c, 0xed, 0x2a, 0x4d, 0xac, 0x19, + 0xf9, 0xf4, 0x00, 0x2f, 0x6d, 0x12, 0x95, 0x1e, 0x2f, 0x59, 0x4c, 0xaa, 0x19, 0xe8, 0x72, 0x10, + 0x6a, 0x13, 0x03, 0x22, 0x65, 0x9d, 0x4d, 0xb2, 0x9e, 0x68, 0xdb, 0x86, 0x29, 0x07, 0x93, 0xb8, + 0xc7, 0x4d, 0xde, 0xb3, 0x0c, 0x35, 0x62, 0x79, 0x68, 0xcf, 0x64, 0x0e, 0x63, 0x1d, 0x9b, 0x74, + 0xc2, 0x97, 0xe8, 0x11, 0xf0, 0x05, 0x0a, 0x0d, 0x2b, 0xa0, 0x59, 0x28, 0x27, 0x84, 0x1b, 0x6a, + 0x1b, 0xcf, 0xbf, 0x09, 0x53, 0x51, 0xf7, 0xa0, 0x39, 0x18, 0x77, 0x3d, 0xd5, 0xf1, 0x68, 0x14, + 0x8e, 0xcb, 0xec, 0x02, 0x49, 0x90, 0xc0, 0x66, 0x93, 0x66, 0xb9, 0x71, 0x99, 0xfc, 0x44, 0x7f, + 0x24, 0xe8, 0x70, 0x82, 0x76, 0xf8, 0xf1, 0xde, 0x11, 0x8d, 0x30, 0x77, 0xf7, 0x7b, 0xfe, 0x12, + 0x4c, 0x46, 0x3a, 0x30, 0xea, 0xad, 0x0b, 0x3f, 0x0e, 0x27, 0xfa, 0x52, 0xa3, 0x57, 0x61, 0xae, + 0x63, 0xea, 0xa6, 0x87, 0x1d, 0xdb, 0xc1, 0x24, 0x62, 0xd9, 0xad, 0xf2, 0xff, 0x65, 0x62, 0x40, + 0xcc, 0x6d, 0x87, 0xb5, 0x19, 0x8b, 0x3c, 0xdb, 0xe9, 0x15, 0x3e, 0x99, 0x49, 0x7f, 0x67, 0x42, + 0x7a, 0xeb, 0xad, 0xb7, 0xde, 0x8a, 0x17, 0xfe, 0x69, 0x0a, 0xe6, 0xfa, 0xcd, 0x99, 0xbe, 0xd3, + 0xf7, 0x24, 0xa4, 0xcc, 0x4e, 0x7b, 0x07, 0x3b, 0xd4, 0x49, 0xe3, 0x32, 0xbf, 0x42, 0x25, 0x18, + 0x37, 0xd4, 0x1d, 0x6c, 0xe4, 0x93, 0x4b, 0xb1, 0xb3, 0x53, 0xe7, 0x9f, 0x1a, 0x69, 0x56, 0x2e, + 0xaf, 0x11, 0x88, 0xcc, 0x90, 0xe8, 0xa3, 0x90, 0xe4, 0x29, 0x9a, 0x30, 0x3c, 0x39, 0x1a, 0x03, + 0x99, 0x4b, 0x32, 0xc5, 0xa1, 0x07, 0x20, 0x43, 0xfe, 0xb2, 0xd8, 0x48, 0x51, 0x9b, 0xd3, 0x44, + 0x40, 0xe2, 0x02, 0xcd, 0x43, 0x9a, 0x4e, 0x93, 0x26, 0x16, 0x4b, 0x9b, 0x7f, 0x4d, 0x02, 0xab, + 0x89, 0x77, 0xd5, 0x8e, 0xe1, 0x29, 0x07, 0xaa, 0xd1, 0xc1, 0x34, 0xe0, 0x33, 0x72, 0x8e, 0x0b, + 0x6f, 0x12, 0x19, 0x5a, 0x84, 0x2c, 0x9b, 0x55, 0xba, 0xd9, 0xc4, 0xb7, 0x69, 0xf6, 0x1c, 0x97, + 0xd9, 0x44, 0x5b, 0x25, 0x12, 0x72, 0xfb, 0x37, 0x5c, 0xcb, 0x14, 0xa1, 0x49, 0x6f, 0x41, 0x04, + 0xf4, 0xf6, 0x97, 0xba, 0x13, 0xf7, 0x43, 0xfd, 0xbb, 0xd7, 0x33, 0x97, 0xce, 0xc0, 0x34, 0xd5, + 0x78, 0x9e, 0x0f, 0xbd, 0x6a, 0xe4, 0x67, 0x96, 0x62, 0x67, 0xd3, 0xf2, 0x14, 0x13, 0x6f, 0x72, + 0x69, 0xe1, 0xab, 0x71, 0x48, 0xd2, 0xc4, 0x32, 0x0d, 0xd9, 0xad, 0xd7, 0xea, 0x35, 0xa5, 0xba, + 0xb9, 0x5d, 0x5e, 0xab, 0x49, 0x31, 0x34, 0x05, 0x40, 0x05, 0x57, 0xd7, 0x36, 0x4b, 0x5b, 0x52, + 0xdc, 0xbf, 0x5e, 0xdd, 0xd8, 0xba, 0xf8, 0x82, 0x94, 0xf0, 0x01, 0xdb, 0x4c, 0x90, 0x0c, 0x2b, + 0x3c, 0x7f, 0x5e, 0x1a, 0x47, 0x12, 0xe4, 0x18, 0xc1, 0xea, 0xab, 0xb5, 0xea, 0xc5, 0x17, 0xa4, + 0x54, 0x54, 0xf2, 0xfc, 0x79, 0x69, 0x02, 0x4d, 0x42, 0x86, 0x4a, 0xca, 0x9b, 0x9b, 0x6b, 0x52, + 0xda, 0xe7, 0x6c, 0x6c, 0xc9, 0xab, 0x1b, 0x2b, 0x52, 0xc6, 0xe7, 0x5c, 0x91, 0x37, 0xb7, 0xeb, + 0x12, 0xf8, 0x0c, 0xeb, 0xb5, 0x46, 0xa3, 0xb4, 0x52, 0x93, 0xb2, 0xbe, 0x46, 0xf9, 0xb5, 0xad, + 0x5a, 0x43, 0xca, 0x45, 0xcc, 0x7a, 0xfe, 0xbc, 0x34, 0xe9, 0xdf, 0xa2, 0xb6, 0xb1, 0xbd, 0x2e, + 0x4d, 0xa1, 0x19, 0x98, 0x64, 0xb7, 0x10, 0x46, 0x4c, 0x77, 0x89, 0x2e, 0xbe, 0x20, 0x49, 0x81, + 0x21, 0x8c, 0x65, 0x26, 0x22, 0xb8, 0xf8, 0x82, 0x84, 0x0a, 0x15, 0x18, 0xa7, 0x61, 0x88, 0x10, + 0x4c, 0xad, 0x95, 0xca, 0xb5, 0x35, 0x65, 0xb3, 0xbe, 0xb5, 0xba, 0xb9, 0x51, 0x5a, 0x93, 0x62, + 0x81, 0x4c, 0xae, 0xbd, 0xbc, 0xbd, 0x2a, 0xd7, 0xaa, 0x52, 0x3c, 0x2c, 0xab, 0xd7, 0x4a, 0x5b, + 0xb5, 0xaa, 0x94, 0x28, 0x68, 0x30, 0xd7, 0x2f, 0xa1, 0xf6, 0x9d, 0x42, 0xa1, 0x58, 0x88, 0x0f, + 0x88, 0x05, 0xca, 0xd5, 0x1d, 0x0b, 0x85, 0x6f, 0xc5, 0x61, 0xb6, 0xcf, 0xa2, 0xd2, 0xf7, 0x26, + 0x2f, 0xc1, 0x38, 0x8b, 0x65, 0xb6, 0xcc, 0x3e, 0xd1, 0x77, 0x75, 0xa2, 0x91, 0xdd, 0xb3, 0xd4, + 0x52, 0x5c, 0xb8, 0xd4, 0x48, 0x0c, 0x28, 0x35, 0x08, 0x45, 0x4f, 0xc0, 0xfe, 0xb1, 0x9e, 0xe4, + 0xcf, 0xd6, 0xc7, 0x8b, 0xa3, 0xac, 0x8f, 0x54, 0x76, 0xbc, 0x45, 0x60, 0xbc, 0xcf, 0x22, 0x70, + 0x05, 0x66, 0x7a, 0x88, 0x46, 0x4e, 0xc6, 0x1f, 0x8f, 0x41, 0x7e, 0x90, 0x73, 0x86, 0xa4, 0xc4, + 0x78, 0x24, 0x25, 0x5e, 0xe9, 0xf6, 0xe0, 0xc3, 0x83, 0x07, 0xa1, 0x67, 0xac, 0xbf, 0x10, 0x83, + 0x93, 0xfd, 0x4b, 0xca, 0xbe, 0x36, 0x7c, 0x14, 0x52, 0x6d, 0xec, 0xed, 0x59, 0xa2, 0xac, 0x7a, + 0xbc, 0xcf, 0x62, 0x4d, 0x9a, 0xbb, 0x07, 0x9b, 0xa3, 0xc2, 0xab, 0x7d, 0x62, 0x50, 0x5d, 0xc8, + 0xac, 0xe9, 0xb1, 0xf4, 0x93, 0x71, 0x38, 0xd1, 0x97, 0xbc, 0xaf, 0xa1, 0x0f, 0x01, 0xe8, 0xa6, + 0xdd, 0xf1, 0x58, 0xe9, 0xc4, 0x32, 0x71, 0x86, 0x4a, 0x68, 0xf2, 0x22, 0x59, 0xb6, 0xe3, 0xf9, + 0xed, 0x09, 0xda, 0x0e, 0x4c, 0x44, 0x15, 0x5e, 0x0c, 0x0c, 0x4d, 0x52, 0x43, 0x17, 0x06, 0xf4, + 0xb4, 0x27, 0x30, 0x9f, 0x05, 0x49, 0x33, 0x74, 0x6c, 0x7a, 0x8a, 0xeb, 0x39, 0x58, 0x6d, 0xeb, + 0x66, 0x8b, 0x2e, 0x35, 0xe9, 0xe2, 0xf8, 0xae, 0x6a, 0xb8, 0x58, 0x9e, 0x66, 0xcd, 0x0d, 0xd1, + 0x4a, 0x10, 0x34, 0x80, 0x9c, 0x10, 0x22, 0x15, 0x41, 0xb0, 0x66, 0x1f, 0x51, 0xf8, 0x89, 0x0c, + 0x64, 0x43, 0x05, 0x38, 0x7a, 0x18, 0x72, 0x6f, 0xa8, 0x07, 0xaa, 0x22, 0x36, 0x55, 0xcc, 0x13, + 0x59, 0x22, 0xab, 0xf3, 0x8d, 0xd5, 0xb3, 0x30, 0x47, 0x55, 0xac, 0x8e, 0x87, 0x1d, 0x45, 0x33, + 0x54, 0xd7, 0xa5, 0x4e, 0x4b, 0x53, 0x55, 0x44, 0xda, 0x36, 0x49, 0x53, 0x45, 0xb4, 0xa0, 0x0b, + 0x30, 0x4b, 0x11, 0xed, 0x8e, 0xe1, 0xe9, 0xb6, 0x81, 0x15, 0xb2, 0xcd, 0x73, 0xe9, 0x92, 0xe3, + 0x5b, 0x36, 0x43, 0x34, 0xd6, 0xb9, 0x02, 0xb1, 0xc8, 0x45, 0x55, 0x78, 0x88, 0xc2, 0x5a, 0xd8, + 0xc4, 0x8e, 0xea, 0x61, 0x05, 0xff, 0x58, 0x47, 0x35, 0x5c, 0x45, 0x35, 0x9b, 0xca, 0x9e, 0xea, + 0xee, 0xe5, 0xe7, 0x08, 0x41, 0x39, 0x9e, 0x8f, 0xc9, 0xa7, 0x89, 0xe2, 0x0a, 0xd7, 0xab, 0x51, + 0xb5, 0x92, 0xd9, 0xbc, 0xa6, 0xba, 0x7b, 0xa8, 0x08, 0x27, 0x29, 0x8b, 0xeb, 0x39, 0xba, 0xd9, + 0x52, 0xb4, 0x3d, 0xac, 0xed, 0x2b, 0x1d, 0x6f, 0xf7, 0xc5, 0xfc, 0x03, 0xe1, 0xfb, 0x53, 0x0b, + 0x1b, 0x54, 0xa7, 0x42, 0x54, 0xb6, 0xbd, 0xdd, 0x17, 0x51, 0x03, 0x72, 0x64, 0x30, 0xda, 0xfa, + 0x9b, 0x58, 0xd9, 0xb5, 0x1c, 0xba, 0x86, 0x4e, 0xf5, 0x49, 0x4d, 0x21, 0x0f, 0x2e, 0x6f, 0x72, + 0xc0, 0xba, 0xd5, 0xc4, 0xc5, 0xf1, 0x46, 0xbd, 0x56, 0xab, 0xca, 0x59, 0xc1, 0x72, 0xd5, 0x72, + 0x48, 0x40, 0xb5, 0x2c, 0xdf, 0xc1, 0x59, 0x16, 0x50, 0x2d, 0x4b, 0xb8, 0xf7, 0x02, 0xcc, 0x6a, + 0x1a, 0xeb, 0xb3, 0xae, 0x29, 0x7c, 0x33, 0xe6, 0xe6, 0xa5, 0x88, 0xb3, 0x34, 0x6d, 0x85, 0x29, + 0xf0, 0x18, 0x77, 0xd1, 0x65, 0x38, 0x11, 0x38, 0x2b, 0x0c, 0x9c, 0xe9, 0xe9, 0x65, 0x37, 0xf4, + 0x02, 0xcc, 0xda, 0x87, 0xbd, 0x40, 0x14, 0xb9, 0xa3, 0x7d, 0xd8, 0x0d, 0xbb, 0x04, 0x73, 0xf6, + 0x9e, 0xdd, 0x8b, 0x7b, 0x32, 0x8c, 0x43, 0xf6, 0x9e, 0xdd, 0x0d, 0x7c, 0x8c, 0xee, 0xcc, 0x1d, + 0xac, 0xa9, 0x1e, 0x6e, 0xe6, 0x4f, 0x85, 0xd5, 0x43, 0x0d, 0x68, 0x19, 0x24, 0x4d, 0x53, 0xb0, + 0xa9, 0xee, 0x18, 0x58, 0x51, 0x1d, 0x6c, 0xaa, 0x6e, 0x7e, 0x91, 0x2a, 0x27, 0x3d, 0xa7, 0x83, + 0xe5, 0x29, 0x4d, 0xab, 0xd1, 0xc6, 0x12, 0x6d, 0x43, 0x4f, 0xc2, 0x8c, 0xb5, 0xf3, 0x86, 0xc6, + 0x22, 0x52, 0xb1, 0x1d, 0xbc, 0xab, 0xdf, 0xce, 0x3f, 0x4a, 0xdd, 0x3b, 0x4d, 0x1a, 0x68, 0x3c, + 0xd6, 0xa9, 0x18, 0x3d, 0x01, 0x92, 0xe6, 0xee, 0xa9, 0x8e, 0x4d, 0x53, 0xb2, 0x6b, 0xab, 0x1a, + 0xce, 0x3f, 0xc6, 0x54, 0x99, 0x7c, 0x43, 0x88, 0xc9, 0x8c, 0x70, 0x6f, 0xe9, 0xbb, 0x9e, 0x60, + 0x3c, 0xc3, 0x66, 0x04, 0x95, 0x71, 0xb6, 0xb3, 0x20, 0x11, 0x4f, 0x44, 0x6e, 0x7c, 0x96, 0xaa, + 0x4d, 0xd9, 0x7b, 0x76, 0xf8, 0xbe, 0x8f, 0xc0, 0x24, 0xd1, 0x0c, 0x6e, 0xfa, 0x04, 0x2b, 0xdc, + 0xec, 0xbd, 0xd0, 0x1d, 0x5f, 0x80, 0x93, 0x44, 0xa9, 0x8d, 0x3d, 0xb5, 0xa9, 0x7a, 0x6a, 0x48, + 0xfb, 0x69, 0xaa, 0x4d, 0xdc, 0xbe, 0xce, 0x1b, 0x23, 0x76, 0x3a, 0x9d, 0x9d, 0x43, 0x3f, 0xb0, + 0x9e, 0x61, 0x76, 0x12, 0x99, 0x08, 0xad, 0x0f, 0xac, 0x38, 0x2f, 0x14, 0x21, 0x17, 0x8e, 0x7b, + 0x94, 0x01, 0x16, 0xf9, 0x52, 0x8c, 0x14, 0x41, 0x95, 0xcd, 0x2a, 0x29, 0x5f, 0x5e, 0xaf, 0x49, + 0x71, 0x52, 0x46, 0xad, 0xad, 0x6e, 0xd5, 0x14, 0x79, 0x7b, 0x63, 0x6b, 0x75, 0xbd, 0x26, 0x25, + 0x42, 0x85, 0xfd, 0xf5, 0x64, 0xfa, 0x71, 0xe9, 0x0c, 0xa9, 0x1a, 0xa6, 0xa2, 0x3b, 0x35, 0xf4, + 0x23, 0x70, 0x4a, 0x1c, 0xab, 0xb8, 0xd8, 0x53, 0x6e, 0xe9, 0x0e, 0x9d, 0x90, 0x6d, 0x95, 0x2d, + 0x8e, 0x7e, 0xfc, 0xcc, 0x71, 0xad, 0x06, 0xf6, 0x5e, 0xd1, 0x1d, 0x32, 0xdd, 0xda, 0xaa, 0x87, + 0xd6, 0x60, 0xd1, 0xb4, 0x14, 0xd7, 0x53, 0xcd, 0xa6, 0xea, 0x34, 0x95, 0xe0, 0x40, 0x4b, 0x51, + 0x35, 0x0d, 0xbb, 0xae, 0xc5, 0x16, 0x42, 0x9f, 0xe5, 0x41, 0xd3, 0x6a, 0x70, 0xe5, 0x60, 0x85, + 0x28, 0x71, 0xd5, 0xae, 0xf0, 0x4d, 0x0c, 0x0a, 0xdf, 0x07, 0x20, 0xd3, 0x56, 0x6d, 0x05, 0x9b, + 0x9e, 0x73, 0x48, 0xeb, 0xf3, 0xb4, 0x9c, 0x6e, 0xab, 0x76, 0x8d, 0x5c, 0x7f, 0x28, 0xdb, 0xa4, + 0xeb, 0xc9, 0x74, 0x52, 0x1a, 0xbf, 0x9e, 0x4c, 0x8f, 0x4b, 0xa9, 0xeb, 0xc9, 0x74, 0x4a, 0x9a, + 0xb8, 0x9e, 0x4c, 0xa7, 0xa5, 0xcc, 0xf5, 0x64, 0x3a, 0x23, 0x41, 0xe1, 0xbd, 0x04, 0xe4, 0xc2, + 0x15, 0x3c, 0xd9, 0x10, 0x69, 0x74, 0x0d, 0x8b, 0xd1, 0x2c, 0xf7, 0xc8, 0x91, 0xf5, 0xfe, 0x72, + 0x85, 0x2c, 0x6e, 0xc5, 0x14, 0x2b, 0x97, 0x65, 0x86, 0x24, 0x85, 0x05, 0x09, 0x3f, 0xcc, 0xca, + 0x93, 0xb4, 0xcc, 0xaf, 0xd0, 0x0a, 0xa4, 0xde, 0x70, 0x29, 0x77, 0x8a, 0x72, 0x3f, 0x7a, 0x34, + 0xf7, 0xf5, 0x06, 0x25, 0xcf, 0x5c, 0x6f, 0x28, 0x1b, 0x9b, 0xf2, 0x7a, 0x69, 0x4d, 0xe6, 0x70, + 0x74, 0x1a, 0x92, 0x86, 0xfa, 0xe6, 0x61, 0x74, 0x19, 0xa4, 0xa2, 0x51, 0x87, 0xe5, 0x34, 0x24, + 0x6f, 0x61, 0x75, 0x3f, 0xba, 0xf8, 0x50, 0xd1, 0x07, 0x38, 0x3d, 0xce, 0xc1, 0x38, 0xf5, 0x17, + 0x02, 0xe0, 0x1e, 0x93, 0xc6, 0x50, 0x1a, 0x92, 0x95, 0x4d, 0x99, 0x4c, 0x11, 0x09, 0x72, 0x4c, + 0xaa, 0xd4, 0x57, 0x6b, 0x95, 0x9a, 0x14, 0x2f, 0x5c, 0x80, 0x14, 0x73, 0x02, 0x99, 0x3e, 0xbe, + 0x1b, 0xa4, 0x31, 0x7e, 0xc9, 0x39, 0x62, 0xa2, 0x75, 0x7b, 0xbd, 0x5c, 0x93, 0xa5, 0x78, 0xcf, + 0xe0, 0x17, 0x5c, 0xc8, 0x85, 0x2b, 0xf3, 0x0f, 0x67, 0x7b, 0xfe, 0xb5, 0x18, 0x64, 0x43, 0x95, + 0x36, 0x29, 0x91, 0x54, 0xc3, 0xb0, 0x6e, 0x29, 0xaa, 0xa1, 0xab, 0x2e, 0x0f, 0x0d, 0xa0, 0xa2, + 0x12, 0x91, 0x8c, 0x3a, 0x74, 0x1f, 0xd2, 0xa4, 0x19, 0x97, 0x52, 0x85, 0xcf, 0xc5, 0x40, 0xea, + 0x2e, 0x75, 0xbb, 0xcc, 0x8c, 0xfd, 0x7e, 0x9a, 0x59, 0xf8, 0x6c, 0x0c, 0xa6, 0xa2, 0xf5, 0x6d, + 0x97, 0x79, 0x0f, 0xff, 0xbe, 0x9a, 0xf7, 0xdb, 0x71, 0x98, 0x8c, 0x54, 0xb5, 0xa3, 0x5a, 0xf7, + 0x63, 0x30, 0xa3, 0x37, 0x71, 0xdb, 0xb6, 0x3c, 0x6c, 0x6a, 0x87, 0x8a, 0x81, 0x0f, 0xb0, 0x91, + 0x2f, 0xd0, 0xa4, 0x71, 0xee, 0xe8, 0xba, 0x79, 0x79, 0x35, 0xc0, 0xad, 0x11, 0x58, 0x71, 0x76, + 0xb5, 0x5a, 0x5b, 0xaf, 0x6f, 0x6e, 0xd5, 0x36, 0x2a, 0xaf, 0x29, 0xdb, 0x1b, 0x37, 0x36, 0x36, + 0x5f, 0xd9, 0x90, 0x25, 0xbd, 0x4b, 0xed, 0x03, 0x9c, 0xf6, 0x75, 0x90, 0xba, 0x8d, 0x42, 0xa7, + 0xa0, 0x9f, 0x59, 0xd2, 0x18, 0x9a, 0x85, 0xe9, 0x8d, 0x4d, 0xa5, 0xb1, 0x5a, 0xad, 0x29, 0xb5, + 0xab, 0x57, 0x6b, 0x95, 0xad, 0x06, 0x3b, 0x09, 0xf1, 0xb5, 0xb7, 0x22, 0x13, 0xbc, 0xf0, 0x99, + 0x04, 0xcc, 0xf6, 0xb1, 0x04, 0x95, 0xf8, 0x1e, 0x86, 0x6d, 0xab, 0x9e, 0x19, 0xc5, 0xfa, 0x65, + 0x52, 0x45, 0xd4, 0x55, 0xc7, 0xe3, 0x5b, 0x9e, 0x27, 0x80, 0x78, 0xc9, 0xf4, 0xf4, 0x5d, 0x1d, + 0x3b, 0xfc, 0x84, 0x89, 0x6d, 0x6c, 0xa6, 0x03, 0x39, 0x3b, 0x64, 0x7a, 0x1a, 0x90, 0x6d, 0xb9, + 0xba, 0xa7, 0x1f, 0x60, 0x45, 0x37, 0xc5, 0x71, 0x14, 0xd9, 0xe8, 0x24, 0x65, 0x49, 0xb4, 0xac, + 0x9a, 0x9e, 0xaf, 0x6d, 0xe2, 0x96, 0xda, 0xa5, 0x4d, 0x92, 0x79, 0x42, 0x96, 0x44, 0x8b, 0xaf, + 0xfd, 0x30, 0xe4, 0x9a, 0x56, 0x87, 0x54, 0x7f, 0x4c, 0x8f, 0xac, 0x1d, 0x31, 0x39, 0xcb, 0x64, + 0xbe, 0x0a, 0xaf, 0xeb, 0x83, 0x73, 0xb0, 0x9c, 0x9c, 0x65, 0x32, 0xa6, 0x72, 0x06, 0xa6, 0xd5, + 0x56, 0xcb, 0x21, 0xe4, 0x82, 0x88, 0xed, 0x54, 0xa6, 0x7c, 0x31, 0x55, 0x9c, 0xbf, 0x0e, 0x69, + 0xe1, 0x07, 0xb2, 0x78, 0x13, 0x4f, 0x28, 0x36, 0xdb, 0x7e, 0xc7, 0xcf, 0x66, 0xe4, 0xb4, 0x29, + 0x1a, 0x1f, 0x86, 0x9c, 0xee, 0x2a, 0xc1, 0xb1, 0x7e, 0x7c, 0x29, 0x7e, 0x36, 0x2d, 0x67, 0x75, + 0xd7, 0x3f, 0x12, 0x2d, 0x7c, 0x21, 0x0e, 0x53, 0xd1, 0xc7, 0x12, 0xa8, 0x0a, 0x69, 0xc3, 0xd2, + 0x54, 0x1a, 0x5a, 0xec, 0x99, 0xd8, 0xd9, 0x21, 0x4f, 0x32, 0x96, 0xd7, 0xb8, 0xbe, 0xec, 0x23, + 0xe7, 0xff, 0x4d, 0x0c, 0xd2, 0x42, 0x8c, 0x4e, 0x42, 0xd2, 0x56, 0xbd, 0x3d, 0x4a, 0x37, 0x5e, + 0x8e, 0x4b, 0x31, 0x99, 0x5e, 0x13, 0xb9, 0x6b, 0xab, 0x26, 0x0d, 0x01, 0x2e, 0x27, 0xd7, 0x64, + 0x5c, 0x0d, 0xac, 0x36, 0xe9, 0x36, 0xc8, 0x6a, 0xb7, 0xb1, 0xe9, 0xb9, 0x62, 0x5c, 0xb9, 0xbc, + 0xc2, 0xc5, 0xe8, 0x29, 0x98, 0xf1, 0x1c, 0x55, 0x37, 0x22, 0xba, 0x49, 0xaa, 0x2b, 0x89, 0x06, + 0x5f, 0xb9, 0x08, 0xa7, 0x05, 0x6f, 0x13, 0x7b, 0xaa, 0xb6, 0x87, 0x9b, 0x01, 0x28, 0x45, 0x8f, + 0x3b, 0x4e, 0x71, 0x85, 0x2a, 0x6f, 0x17, 0xd8, 0xc2, 0xaf, 0xc6, 0x60, 0x46, 0x6c, 0xdc, 0x9a, + 0xbe, 0xb3, 0xd6, 0x01, 0x54, 0xd3, 0xb4, 0xbc, 0xb0, 0xbb, 0x7a, 0x43, 0xb9, 0x07, 0xb7, 0x5c, + 0xf2, 0x41, 0x72, 0x88, 0x60, 0xbe, 0x0d, 0x10, 0xb4, 0x0c, 0x74, 0xdb, 0x22, 0x64, 0xf9, 0x33, + 0x27, 0xfa, 0xe0, 0x92, 0x6d, 0xf5, 0x81, 0x89, 0xc8, 0x0e, 0x0f, 0xcd, 0xc1, 0xf8, 0x0e, 0x6e, + 0xe9, 0x26, 0x3f, 0x49, 0x66, 0x17, 0xe2, 0x40, 0x26, 0xe9, 0x1f, 0xc8, 0x94, 0xff, 0x14, 0xcc, + 0x6a, 0x56, 0xbb, 0xdb, 0xdc, 0xb2, 0xd4, 0x75, 0xdc, 0xe0, 0x5e, 0x8b, 0xbd, 0xfe, 0x0c, 0x57, + 0x6a, 0x59, 0x86, 0x6a, 0xb6, 0x96, 0x2d, 0xa7, 0x15, 0x3c, 0x78, 0x25, 0x15, 0x8f, 0x1b, 0x7a, + 0xfc, 0x6a, 0xef, 0xfc, 0xef, 0x58, 0xec, 0x67, 0xe3, 0x89, 0x95, 0x7a, 0xf9, 0x8b, 0xf1, 0xf9, + 0x15, 0x06, 0xac, 0x0b, 0x67, 0xc8, 0x78, 0xd7, 0xc0, 0x1a, 0xe9, 0x20, 0xfc, 0xce, 0x53, 0x30, + 0xd7, 0xb2, 0x5a, 0x16, 0x65, 0x3a, 0x47, 0x7e, 0xf1, 0x27, 0xb7, 0x19, 0x5f, 0x3a, 0x3f, 0xf4, + 0x31, 0x6f, 0x71, 0x03, 0x66, 0xb9, 0xb2, 0x42, 0x1f, 0x1d, 0xb1, 0x8d, 0x0d, 0x3a, 0xf2, 0x54, + 0x2d, 0xff, 0x8b, 0xdf, 0xa6, 0xcb, 0xb7, 0x3c, 0xc3, 0xa1, 0xa4, 0x8d, 0xed, 0x7d, 0x8a, 0x32, + 0x9c, 0x88, 0xf0, 0xb1, 0x49, 0x8a, 0x9d, 0x21, 0x8c, 0xff, 0x82, 0x33, 0xce, 0x86, 0x18, 0x1b, + 0x1c, 0x5a, 0xac, 0xc0, 0xe4, 0x71, 0xb8, 0xfe, 0x25, 0xe7, 0xca, 0xe1, 0x30, 0xc9, 0x0a, 0x4c, + 0x53, 0x12, 0xad, 0xe3, 0x7a, 0x56, 0x9b, 0x66, 0xc0, 0xa3, 0x69, 0xfe, 0xd5, 0xb7, 0xd9, 0xac, + 0x99, 0x22, 0xb0, 0x8a, 0x8f, 0x2a, 0x16, 0x81, 0x3e, 0x2d, 0x6b, 0x62, 0xcd, 0x18, 0xc2, 0xf0, + 0x75, 0x6e, 0x88, 0xaf, 0x5f, 0xbc, 0x09, 0x73, 0xe4, 0x37, 0x4d, 0x50, 0x61, 0x4b, 0x86, 0x1f, + 0xc1, 0xe5, 0x7f, 0xf5, 0xe3, 0x6c, 0x62, 0xce, 0xfa, 0x04, 0x21, 0x9b, 0x42, 0xa3, 0xd8, 0xc2, + 0x9e, 0x87, 0x1d, 0x57, 0x51, 0x8d, 0x7e, 0xe6, 0x85, 0xce, 0x30, 0xf2, 0x3f, 0xfd, 0xbd, 0xe8, + 0x28, 0xae, 0x30, 0x64, 0xc9, 0x30, 0x8a, 0xdb, 0x70, 0xaa, 0x4f, 0x54, 0x8c, 0xc0, 0xf9, 0x19, + 0xce, 0x39, 0xd7, 0x13, 0x19, 0x84, 0xb6, 0x0e, 0x42, 0xee, 0x8f, 0xe5, 0x08, 0x9c, 0x3f, 0xc3, + 0x39, 0x11, 0xc7, 0x8a, 0x21, 0x25, 0x8c, 0xd7, 0x61, 0xe6, 0x00, 0x3b, 0x3b, 0x96, 0xcb, 0xcf, + 0x8d, 0x46, 0xa0, 0xfb, 0x2c, 0xa7, 0x9b, 0xe6, 0x40, 0x7a, 0x90, 0x44, 0xb8, 0x2e, 0x43, 0x7a, + 0x57, 0xd5, 0xf0, 0x08, 0x14, 0x77, 0x39, 0xc5, 0x04, 0xd1, 0x27, 0xd0, 0x12, 0xe4, 0x5a, 0x16, + 0x5f, 0xa3, 0x86, 0xc3, 0x3f, 0xc7, 0xe1, 0x59, 0x81, 0xe1, 0x14, 0xb6, 0x65, 0x77, 0x0c, 0xb2, + 0x80, 0x0d, 0xa7, 0xf8, 0x6b, 0x82, 0x42, 0x60, 0x38, 0xc5, 0x31, 0xdc, 0xfa, 0xb6, 0xa0, 0x70, + 0x43, 0xfe, 0x7c, 0x09, 0xb2, 0x96, 0x69, 0x1c, 0x5a, 0xe6, 0x28, 0x46, 0xbc, 0xc3, 0x19, 0x80, + 0x43, 0x08, 0xc1, 0x15, 0xc8, 0x8c, 0x3a, 0x10, 0x7f, 0xfd, 0x7b, 0x62, 0x7a, 0x88, 0x11, 0x58, + 0x81, 0x69, 0x91, 0xa0, 0x74, 0xcb, 0x1c, 0x81, 0xe2, 0x6f, 0x70, 0x8a, 0xa9, 0x10, 0x8c, 0x77, + 0xc3, 0xc3, 0xae, 0xd7, 0xc2, 0xa3, 0x90, 0x7c, 0x41, 0x74, 0x83, 0x43, 0xb8, 0x2b, 0x77, 0xb0, + 0xa9, 0xed, 0x8d, 0xc6, 0xf0, 0xf3, 0xc2, 0x95, 0x02, 0x43, 0x28, 0x2a, 0x30, 0xd9, 0x56, 0x1d, + 0x77, 0x4f, 0x35, 0x46, 0x1a, 0x8e, 0xbf, 0xc9, 0x39, 0x72, 0x3e, 0x88, 0x7b, 0xa4, 0x63, 0x1e, + 0x87, 0xe6, 0x8b, 0xc2, 0x23, 0x21, 0x18, 0x9f, 0x7a, 0xae, 0x47, 0x0f, 0xd9, 0x8e, 0xc3, 0xf6, + 0xb7, 0xc4, 0xd4, 0x63, 0xd8, 0xf5, 0x30, 0xe3, 0x15, 0xc8, 0xb8, 0xfa, 0x9b, 0x23, 0xd1, 0x7c, + 0x49, 0x8c, 0x34, 0x05, 0x10, 0xf0, 0x6b, 0x70, 0xba, 0xef, 0x32, 0x31, 0x02, 0xd9, 0xdf, 0xe6, + 0x64, 0x27, 0xfb, 0x2c, 0x15, 0x3c, 0x25, 0x1c, 0x97, 0xf2, 0xef, 0x88, 0x94, 0x80, 0xbb, 0xb8, + 0xea, 0x64, 0xd7, 0xe0, 0xaa, 0xbb, 0xc7, 0xf3, 0xda, 0xdf, 0x15, 0x5e, 0x63, 0xd8, 0x88, 0xd7, + 0xb6, 0xe0, 0x24, 0x67, 0x3c, 0xde, 0xb8, 0xfe, 0x82, 0x48, 0xac, 0x0c, 0xbd, 0x1d, 0x1d, 0xdd, + 0x1f, 0x85, 0x79, 0xdf, 0x9d, 0xa2, 0x3c, 0x75, 0x95, 0xb6, 0x6a, 0x8f, 0xc0, 0xfc, 0x8b, 0x9c, + 0x59, 0x64, 0x7c, 0xbf, 0xbe, 0x75, 0xd7, 0x55, 0x9b, 0x90, 0xbf, 0x0a, 0x79, 0x41, 0xde, 0x31, + 0x1d, 0xac, 0x59, 0x2d, 0x53, 0x7f, 0x13, 0x37, 0x47, 0xa0, 0xfe, 0xa5, 0xae, 0xa1, 0xda, 0x0e, + 0xc1, 0x09, 0xf3, 0x2a, 0x48, 0x7e, 0xad, 0xa2, 0xe8, 0x6d, 0xdb, 0x72, 0xbc, 0x21, 0x8c, 0x5f, + 0x16, 0x23, 0xe5, 0xe3, 0x56, 0x29, 0xac, 0x58, 0x03, 0xf6, 0xe4, 0x79, 0xd4, 0x90, 0xfc, 0x0a, + 0x27, 0x9a, 0x0c, 0x50, 0x3c, 0x71, 0x68, 0x56, 0xdb, 0x56, 0x9d, 0x51, 0xf2, 0xdf, 0xdf, 0x13, + 0x89, 0x83, 0x43, 0x78, 0xe2, 0x20, 0x15, 0x1d, 0x59, 0xed, 0x47, 0x60, 0xf8, 0xaa, 0x48, 0x1c, + 0x02, 0xc3, 0x29, 0x44, 0xc1, 0x30, 0x02, 0xc5, 0xdf, 0x17, 0x14, 0x02, 0x43, 0x28, 0x5e, 0x0e, + 0x16, 0x5a, 0x07, 0xb7, 0x74, 0xd7, 0x73, 0x58, 0x51, 0x7c, 0x34, 0xd5, 0x3f, 0xf8, 0x5e, 0xb4, + 0x08, 0x93, 0x43, 0x50, 0x92, 0x89, 0xf8, 0xb1, 0x2b, 0xdd, 0x33, 0x0d, 0x37, 0xec, 0x97, 0x45, + 0x26, 0x0a, 0xc1, 0x88, 0x6d, 0xa1, 0x0a, 0x91, 0xb8, 0x5d, 0x23, 0x3b, 0x85, 0x11, 0xe8, 0xfe, + 0x61, 0x97, 0x71, 0x0d, 0x81, 0x25, 0x9c, 0xa1, 0xfa, 0xa7, 0x63, 0xee, 0xe3, 0xc3, 0x91, 0xa2, + 0xf3, 0x57, 0xba, 0xea, 0x9f, 0x6d, 0x86, 0x64, 0x39, 0x64, 0xba, 0xab, 0x9e, 0x42, 0xc3, 0xde, + 0x33, 0xca, 0x7f, 0xec, 0x7d, 0xde, 0xdf, 0x68, 0x39, 0x55, 0x5c, 0x23, 0x41, 0x1e, 0x2d, 0x7a, + 0x86, 0x93, 0x7d, 0xfc, 0x7d, 0x3f, 0xce, 0x23, 0x35, 0x4f, 0xf1, 0x2a, 0x4c, 0x46, 0x0a, 0x9e, + 0xe1, 0x54, 0x7f, 0x9a, 0x53, 0xe5, 0xc2, 0xf5, 0x4e, 0xf1, 0x02, 0x24, 0x49, 0xf1, 0x32, 0x1c, + 0xfe, 0x67, 0x38, 0x9c, 0xaa, 0x17, 0x3f, 0x02, 0x69, 0x51, 0xb4, 0x0c, 0x87, 0xfe, 0x59, 0x0e, + 0xf5, 0x21, 0x04, 0x2e, 0x0a, 0x96, 0xe1, 0xf0, 0x3f, 0x27, 0xe0, 0x02, 0x42, 0xe0, 0xa3, 0xbb, + 0xf0, 0x6b, 0x7f, 0x3e, 0xc9, 0x17, 0x1d, 0xe1, 0xbb, 0x2b, 0x30, 0xc1, 0x2b, 0x95, 0xe1, 0xe8, + 0x4f, 0xf2, 0x9b, 0x0b, 0x44, 0xf1, 0x12, 0x8c, 0x8f, 0xe8, 0xf0, 0xbf, 0xc0, 0xa1, 0x4c, 0xbf, + 0x58, 0x81, 0x6c, 0xa8, 0x3a, 0x19, 0x0e, 0xff, 0x8b, 0x1c, 0x1e, 0x46, 0x11, 0xd3, 0x79, 0x75, + 0x32, 0x9c, 0xe0, 0x2f, 0x09, 0xd3, 0x39, 0x82, 0xb8, 0x4d, 0x14, 0x26, 0xc3, 0xd1, 0x9f, 0x12, + 0x5e, 0x17, 0x90, 0xe2, 0x4b, 0x90, 0xf1, 0x17, 0x9b, 0xe1, 0xf8, 0x9f, 0xe0, 0xf8, 0x00, 0x43, + 0x3c, 0x10, 0x5a, 0xec, 0x86, 0x53, 0xfc, 0x65, 0xe1, 0x81, 0x10, 0x8a, 0x4c, 0xa3, 0xee, 0x02, + 0x66, 0x38, 0xd3, 0x4f, 0x8a, 0x69, 0xd4, 0x55, 0xbf, 0x90, 0xd1, 0xa4, 0x39, 0x7f, 0x38, 0xc5, + 0x5f, 0x11, 0xa3, 0x49, 0xf5, 0x89, 0x19, 0xdd, 0x15, 0xc1, 0x70, 0x8e, 0x9f, 0x12, 0x66, 0x74, + 0x15, 0x04, 0xc5, 0x3a, 0xa0, 0xde, 0x6a, 0x60, 0x38, 0xdf, 0xa7, 0x39, 0xdf, 0x4c, 0x4f, 0x31, + 0x50, 0x7c, 0x05, 0x4e, 0xf6, 0xaf, 0x04, 0x86, 0xb3, 0xfe, 0xf4, 0xfb, 0x5d, 0x7b, 0xb7, 0x70, + 0x21, 0x50, 0xdc, 0x0a, 0x96, 0x94, 0x70, 0x15, 0x30, 0x9c, 0xf6, 0x33, 0xef, 0x47, 0x13, 0x77, + 0xb8, 0x08, 0x28, 0x96, 0x00, 0x82, 0x05, 0x78, 0x38, 0xd7, 0x67, 0x39, 0x57, 0x08, 0x44, 0xa6, + 0x06, 0x5f, 0x7f, 0x87, 0xe3, 0xef, 0x8a, 0xa9, 0xc1, 0x11, 0x64, 0x6a, 0x88, 0xa5, 0x77, 0x38, + 0xfa, 0x73, 0x62, 0x6a, 0x08, 0x08, 0x89, 0xec, 0xd0, 0xea, 0x36, 0x9c, 0xe1, 0x1d, 0x11, 0xd9, + 0x21, 0x54, 0x71, 0x03, 0x66, 0x7a, 0x16, 0xc4, 0xe1, 0x54, 0x3f, 0xcb, 0xa9, 0xa4, 0xee, 0xf5, + 0x30, 0xbc, 0x78, 0xf1, 0xc5, 0x70, 0x38, 0xdb, 0xe7, 0xbb, 0x16, 0x2f, 0xbe, 0x16, 0x16, 0xaf, + 0x40, 0xda, 0xec, 0x18, 0x06, 0x99, 0x3c, 0xe8, 0xe8, 0x77, 0x03, 0xf3, 0xff, 0xf5, 0x87, 0xdc, + 0x3b, 0x02, 0x50, 0xbc, 0x00, 0xe3, 0xb8, 0xbd, 0x83, 0x9b, 0xc3, 0x90, 0xdf, 0xfd, 0xa1, 0x48, + 0x98, 0x44, 0xbb, 0xf8, 0x12, 0x00, 0x3b, 0x1a, 0xa1, 0x0f, 0x03, 0x87, 0x60, 0xff, 0xdb, 0x0f, + 0xf9, 0xcb, 0x38, 0x01, 0x24, 0x20, 0x60, 0xaf, 0xf6, 0x1c, 0x4d, 0xf0, 0xbd, 0x28, 0x01, 0x1d, + 0x91, 0xcb, 0x30, 0xf1, 0x86, 0x6b, 0x99, 0x9e, 0xda, 0x1a, 0x86, 0xfe, 0x1d, 0x8e, 0x16, 0xfa, + 0xc4, 0x61, 0x6d, 0xcb, 0xc1, 0x9e, 0xda, 0x72, 0x87, 0x61, 0xff, 0x3b, 0xc7, 0xfa, 0x00, 0x02, + 0xd6, 0x54, 0xd7, 0x1b, 0xa5, 0xdf, 0xbf, 0x2b, 0xc0, 0x02, 0x40, 0x8c, 0x26, 0xbf, 0xf7, 0xf1, + 0xe1, 0x30, 0xec, 0xf7, 0x85, 0xd1, 0x5c, 0xbf, 0xf8, 0x11, 0xc8, 0x90, 0x9f, 0xec, 0x0d, 0xbb, + 0x21, 0xe0, 0xff, 0xc1, 0xc1, 0x01, 0x82, 0xdc, 0xd9, 0xf5, 0x9a, 0x9e, 0x3e, 0xdc, 0xd9, 0x3f, + 0xe0, 0x23, 0x2d, 0xf4, 0x8b, 0x25, 0xc8, 0xba, 0x5e, 0xb3, 0xd9, 0xe1, 0xf5, 0xe9, 0x10, 0xf8, + 0xff, 0xfc, 0xa1, 0x7f, 0x64, 0xe1, 0x63, 0xc8, 0x68, 0xdf, 0xda, 0xf7, 0x6c, 0x8b, 0x3e, 0xf0, + 0x18, 0xc6, 0xf0, 0x3e, 0x67, 0x08, 0x41, 0x8a, 0x15, 0xc8, 0x91, 0xbe, 0x38, 0xd8, 0xc6, 0xf4, + 0xe9, 0xd4, 0x10, 0x8a, 0xff, 0xc5, 0x1d, 0x10, 0x01, 0x95, 0xff, 0xc4, 0xd7, 0xdf, 0x5b, 0x88, + 0x7d, 0xf3, 0xbd, 0x85, 0xd8, 0x6f, 0xbf, 0xb7, 0x10, 0xfb, 0xd4, 0xb7, 0x16, 0xc6, 0xbe, 0xf9, + 0xad, 0x85, 0xb1, 0xdf, 0xf8, 0xd6, 0xc2, 0x58, 0xff, 0x53, 0x62, 0x58, 0xb1, 0x56, 0x2c, 0x76, + 0x3e, 0xfc, 0xfa, 0x63, 0x2d, 0xdd, 0xdb, 0xeb, 0xec, 0x2c, 0x6b, 0x56, 0xfb, 0x9c, 0x66, 0xb9, + 0x6d, 0xcb, 0x3d, 0x17, 0x3d, 0xd7, 0xa5, 0xbf, 0xe0, 0x63, 0x71, 0xb2, 0x67, 0x8e, 0x1e, 0xe7, + 0xaa, 0xe6, 0xe1, 0x80, 0xcf, 0x75, 0xe6, 0xfb, 0x9e, 0x0d, 0x17, 0xae, 0x41, 0xa2, 0x64, 0x1e, + 0xa2, 0xd3, 0x2c, 0xed, 0x29, 0x1d, 0xc7, 0xe0, 0x2f, 0x7f, 0x4d, 0x90, 0xeb, 0x6d, 0xc7, 0x40, + 0x73, 0xc1, 0x1b, 0x9a, 0xb1, 0xb3, 0x39, 0xfe, 0xda, 0x65, 0x51, 0xfa, 0xf4, 0xdb, 0x8b, 0x63, + 0xbf, 0xf0, 0xf6, 0xe2, 0xd8, 0xf7, 0xdf, 0x59, 0x1c, 0x7b, 0xeb, 0xb7, 0x96, 0xc6, 0xca, 0xfb, + 0xdd, 0x1d, 0xfe, 0xda, 0xd0, 0x4e, 0xa7, 0x4b, 0xe6, 0x21, 0xed, 0x73, 0x3d, 0xf6, 0xfa, 0x38, + 0x3d, 0xf7, 0x16, 0xe7, 0xdc, 0x0b, 0xdd, 0xe7, 0xdc, 0xaf, 0x60, 0xc3, 0xb8, 0x61, 0x5a, 0xb7, + 0xcc, 0x2d, 0xa2, 0xb6, 0x93, 0x62, 0x6f, 0x15, 0xc3, 0x4f, 0xc6, 0x61, 0xa1, 0xe7, 0x48, 0x9b, + 0x07, 0xc2, 0xa0, 0xef, 0x96, 0x8a, 0x90, 0xae, 0x8a, 0xf8, 0xca, 0xc3, 0x84, 0x8b, 0x35, 0xcb, + 0x6c, 0xba, 0xb4, 0xdb, 0x09, 0x59, 0x5c, 0x92, 0x6e, 0x9b, 0xaa, 0x69, 0xb9, 0xfc, 0x65, 0x49, + 0x76, 0x51, 0xfe, 0x99, 0xd8, 0xf1, 0x86, 0x75, 0x52, 0xdc, 0x49, 0x74, 0xf3, 0xb9, 0xa1, 0x27, + 0xff, 0xfb, 0xa4, 0x97, 0x7e, 0x27, 0x22, 0xa7, 0xff, 0xa3, 0x7a, 0xe5, 0xa7, 0xe2, 0xb0, 0xd8, + 0xed, 0x15, 0x32, 0xbb, 0x5c, 0x4f, 0x6d, 0xdb, 0x83, 0xdc, 0x72, 0x05, 0x32, 0x5b, 0x42, 0xe7, + 0xd8, 0x7e, 0xb9, 0x7b, 0x4c, 0xbf, 0x4c, 0xf9, 0xb7, 0x12, 0x8e, 0x39, 0x3f, 0xa2, 0x63, 0xfc, + 0x7e, 0xdc, 0x93, 0x67, 0xfe, 0x4f, 0x0a, 0x4e, 0xb3, 0x29, 0xa5, 0xb0, 0xa9, 0xc0, 0x2e, 0xb8, + 0x4f, 0x72, 0xe1, 0xa6, 0xe1, 0xcf, 0x4a, 0x0a, 0x37, 0x60, 0x76, 0x95, 0x64, 0x0c, 0xb2, 0x13, + 0x0a, 0x9e, 0xf2, 0xf4, 0x7d, 0x9f, 0x74, 0x29, 0x52, 0xf4, 0xf3, 0xa7, 0x4c, 0x61, 0x51, 0xe1, + 0x63, 0x31, 0x90, 0x1a, 0x9a, 0x6a, 0xa8, 0xce, 0xff, 0x2f, 0x15, 0xba, 0x04, 0x40, 0xbf, 0x43, + 0x0a, 0x3e, 0x1c, 0x9a, 0x3a, 0x9f, 0x5f, 0x0e, 0x77, 0x6e, 0x99, 0xdd, 0x89, 0x7e, 0x95, 0x90, + 0xa1, 0xba, 0xe4, 0xe7, 0x93, 0xaf, 0x02, 0x04, 0x0d, 0xe8, 0x01, 0x38, 0xd5, 0xa8, 0x94, 0xd6, + 0x4a, 0xb2, 0xc2, 0x5e, 0x70, 0xdf, 0x68, 0xd4, 0x6b, 0x95, 0xd5, 0xab, 0xab, 0xb5, 0xaa, 0x34, + 0x86, 0x4e, 0x02, 0x0a, 0x37, 0xfa, 0xef, 0xa6, 0x9c, 0x80, 0x99, 0xb0, 0x9c, 0xbd, 0x25, 0x1f, + 0x27, 0xd5, 0xa2, 0xde, 0xb6, 0x0d, 0x4c, 0x1f, 0xff, 0x29, 0xba, 0xf0, 0xda, 0xf0, 0x42, 0xe4, + 0x5f, 0xff, 0x5b, 0xf6, 0xe6, 0xf4, 0x6c, 0x00, 0xf7, 0x7d, 0x5e, 0x5c, 0x83, 0x19, 0x55, 0xd3, + 0xb0, 0x1d, 0xa1, 0x1c, 0x92, 0xae, 0x09, 0x21, 0x7d, 0xa0, 0xc9, 0x91, 0x01, 0xdb, 0x25, 0x48, + 0xb9, 0xb4, 0xf7, 0xc3, 0x28, 0xbe, 0xc1, 0x29, 0xb8, 0x7a, 0xd1, 0x84, 0x19, 0x52, 0xfd, 0xa9, + 0x0e, 0x0e, 0x99, 0x71, 0xf4, 0x59, 0xc3, 0x3f, 0xfa, 0xf2, 0xb3, 0xf4, 0xf1, 0xe6, 0xc3, 0xd1, + 0x61, 0xe9, 0x13, 0x4e, 0xb2, 0xc4, 0xb9, 0x03, 0x43, 0x31, 0x4c, 0x89, 0xfb, 0x71, 0x83, 0x8f, + 0xbe, 0xd9, 0x3f, 0xe6, 0x37, 0x5b, 0xe8, 0x17, 0x03, 0xa1, 0x3b, 0x4d, 0x72, 0x56, 0xd6, 0x50, + 0xae, 0x0d, 0x9a, 0xd3, 0xaf, 0x3f, 0xd5, 0xbb, 0x42, 0xb1, 0x3f, 0xcf, 0x50, 0xe6, 0x2b, 0xe1, + 0xdb, 0xf8, 0x73, 0xef, 0xd7, 0x13, 0xb0, 0xc0, 0x95, 0x77, 0x54, 0x17, 0x9f, 0x3b, 0x78, 0x6e, + 0x07, 0x7b, 0xea, 0x73, 0xe7, 0x34, 0x4b, 0x17, 0xb9, 0x7a, 0x96, 0x4f, 0x47, 0xd2, 0xbe, 0xcc, + 0xdb, 0xfb, 0x2f, 0x5c, 0xf3, 0x83, 0xa7, 0x71, 0x61, 0x1b, 0x92, 0x15, 0x4b, 0x37, 0x49, 0xaa, + 0x6a, 0x62, 0xd3, 0x6a, 0xf3, 0xd9, 0xc3, 0x2e, 0xd0, 0x73, 0x90, 0x52, 0xdb, 0x56, 0xc7, 0xf4, + 0xd8, 0xcc, 0x29, 0x9f, 0xfe, 0xfa, 0xbb, 0x8b, 0x63, 0xff, 0xee, 0xdd, 0xc5, 0xc4, 0xaa, 0xe9, + 0xfd, 0xda, 0x57, 0x9e, 0x01, 0x4e, 0xb5, 0x6a, 0x7a, 0x32, 0x57, 0x2c, 0x26, 0xbf, 0xf3, 0xf6, + 0x62, 0xac, 0xf0, 0x2a, 0x4c, 0x54, 0xb1, 0x76, 0x2f, 0xcc, 0x55, 0xac, 0x85, 0x98, 0xab, 0x58, + 0xeb, 0x62, 0xbe, 0x04, 0xe9, 0x55, 0xd3, 0x63, 0x2f, 0xa3, 0x3f, 0x05, 0x09, 0xdd, 0x64, 0xef, + 0x37, 0x1e, 0x69, 0x1b, 0xd1, 0x22, 0xc0, 0x2a, 0xd6, 0x7c, 0x60, 0x13, 0x6b, 0xdd, 0xc0, 0xde, + 0x5b, 0x13, 0xad, 0x72, 0xf5, 0x37, 0xfe, 0xd3, 0xc2, 0xd8, 0x5b, 0xef, 0x2d, 0x8c, 0x0d, 0x1c, + 0xe2, 0xc2, 0xc0, 0x21, 0x76, 0x9b, 0xfb, 0x2c, 0x23, 0xfb, 0x23, 0xfb, 0xc5, 0x24, 0x3c, 0x44, + 0xbf, 0x51, 0x72, 0xda, 0xba, 0xe9, 0x9d, 0xd3, 0x9c, 0x43, 0xdb, 0xb3, 0x48, 0xde, 0xb4, 0x76, + 0xf9, 0xc0, 0xce, 0x04, 0xcd, 0xcb, 0xac, 0x79, 0x40, 0x3d, 0xb2, 0x0b, 0xe3, 0x75, 0x82, 0x23, + 0x2e, 0xf6, 0x2c, 0x4f, 0x35, 0xf8, 0xfa, 0xc3, 0x2e, 0x88, 0x94, 0x7d, 0xd7, 0x14, 0x67, 0x52, + 0x5d, 0x7c, 0xd2, 0x64, 0x60, 0x75, 0x97, 0xbd, 0x1e, 0x9e, 0xa0, 0x65, 0x4a, 0x9a, 0x08, 0xe8, + 0x9b, 0xe0, 0x73, 0x30, 0xae, 0x76, 0xd8, 0x7b, 0x0c, 0x09, 0x52, 0xbf, 0xd0, 0x8b, 0xc2, 0x0d, + 0x98, 0xe0, 0x4f, 0x53, 0x91, 0x04, 0x89, 0x7d, 0x7c, 0x48, 0xef, 0x93, 0x93, 0xc9, 0x4f, 0xb4, + 0x0c, 0xe3, 0xd4, 0x78, 0xfe, 0xdd, 0x4b, 0x7e, 0xb9, 0xc7, 0xfa, 0x65, 0x6a, 0xa4, 0xcc, 0xd4, + 0x0a, 0xd7, 0x21, 0x5d, 0xb5, 0xda, 0xba, 0x69, 0x45, 0xd9, 0x32, 0x8c, 0x8d, 0xda, 0x6c, 0x77, + 0x78, 0x54, 0xc8, 0xec, 0x02, 0x9d, 0x84, 0x14, 0xfb, 0x5c, 0x80, 0xbf, 0x8b, 0xc1, 0xaf, 0x0a, + 0x15, 0x98, 0xa0, 0xdc, 0x9b, 0x36, 0x49, 0xfe, 0xfe, 0x9b, 0x99, 0x19, 0xfe, 0xf1, 0x18, 0xa7, + 0x8f, 0x07, 0xc6, 0x22, 0x48, 0x36, 0x55, 0x4f, 0xe5, 0xfd, 0xa6, 0xbf, 0x0b, 0x1f, 0x85, 0x34, + 0x27, 0x71, 0xd1, 0x79, 0x48, 0x58, 0xb6, 0xcb, 0xdf, 0xa6, 0x98, 0x1f, 0xd4, 0x95, 0x4d, 0xbb, + 0x9c, 0x24, 0x31, 0x23, 0x13, 0xe5, 0xb2, 0x3c, 0x30, 0x2c, 0x5e, 0x0c, 0x85, 0x45, 0x68, 0xc8, + 0x43, 0x3f, 0xd9, 0x90, 0xf6, 0x84, 0x83, 0x1f, 0x2c, 0xef, 0xc4, 0x61, 0x21, 0xd4, 0x7a, 0x80, + 0x1d, 0x57, 0xb7, 0x4c, 0x16, 0x51, 0x3c, 0x5a, 0x50, 0xc8, 0x48, 0xde, 0x3e, 0x20, 0x5c, 0x3e, + 0x02, 0x89, 0x92, 0x6d, 0xa3, 0x79, 0x48, 0xd3, 0x6b, 0xcd, 0x62, 0xf1, 0x92, 0x94, 0xfd, 0x6b, + 0xd2, 0xe6, 0x5a, 0xbb, 0xde, 0x2d, 0xd5, 0xf1, 0xbf, 0xa8, 0x13, 0xd7, 0x85, 0xcb, 0x90, 0xa9, + 0x58, 0xa6, 0x8b, 0x4d, 0xb7, 0x43, 0x2b, 0x9b, 0x1d, 0xc3, 0xd2, 0xf6, 0x39, 0x03, 0xbb, 0x20, + 0x0e, 0x57, 0x6d, 0x9b, 0x22, 0x93, 0x32, 0xf9, 0xc9, 0xe6, 0x6c, 0xb9, 0x31, 0xd0, 0x45, 0x97, + 0x8f, 0xef, 0x22, 0xde, 0x49, 0xdf, 0x47, 0xbf, 0x17, 0x83, 0x07, 0x7b, 0x27, 0xd4, 0x3e, 0x3e, + 0x74, 0x8f, 0x3b, 0x9f, 0x5e, 0x85, 0x4c, 0x9d, 0x7e, 0xd6, 0x7e, 0x03, 0x1f, 0xa2, 0x79, 0x98, + 0xc0, 0xcd, 0xf3, 0x17, 0x2e, 0x3c, 0x77, 0x99, 0x45, 0xfb, 0xb5, 0x31, 0x59, 0x08, 0xd0, 0x02, + 0x64, 0x5c, 0xac, 0xd9, 0xe7, 0x2f, 0x5c, 0xdc, 0x7f, 0x8e, 0x85, 0xd7, 0xb5, 0x31, 0x39, 0x10, + 0x15, 0xd3, 0xa4, 0xd7, 0xdf, 0x79, 0x67, 0x31, 0x56, 0x1e, 0x87, 0x84, 0xdb, 0x69, 0x7f, 0xa0, + 0x31, 0xf2, 0x99, 0x71, 0x58, 0x0a, 0x23, 0x69, 0xfd, 0x77, 0xa0, 0x1a, 0x7a, 0x53, 0x0d, 0xfe, + 0x21, 0x81, 0x14, 0xf2, 0x01, 0xd5, 0x18, 0xb0, 0x52, 0x1c, 0xe9, 0xc9, 0xc2, 0x2f, 0xc5, 0x20, + 0x77, 0x53, 0x30, 0x37, 0xb0, 0x87, 0xae, 0x00, 0xf8, 0x77, 0x12, 0xd3, 0xe6, 0x81, 0xe5, 0xee, + 0x7b, 0x2d, 0xfb, 0x18, 0x39, 0xa4, 0x8e, 0x2e, 0xd1, 0x40, 0xb4, 0x2d, 0x97, 0x7f, 0x65, 0x35, + 0x04, 0xea, 0x2b, 0xa3, 0xa7, 0x01, 0xd1, 0x0c, 0xa7, 0x1c, 0x58, 0x9e, 0x6e, 0xb6, 0x14, 0xdb, + 0xba, 0xc5, 0xbf, 0x5d, 0x4d, 0xc8, 0x12, 0x6d, 0xb9, 0x49, 0x1b, 0xea, 0x44, 0x4e, 0x8c, 0xce, + 0xf8, 0x2c, 0xa4, 0x58, 0x57, 0x9b, 0x4d, 0x07, 0xbb, 0x2e, 0x4f, 0x62, 0xe2, 0x12, 0x5d, 0x81, + 0x09, 0xbb, 0xb3, 0xa3, 0x88, 0x8c, 0x91, 0x3d, 0xff, 0x60, 0xbf, 0xf9, 0x2f, 0xe2, 0x83, 0x67, + 0x80, 0x94, 0xdd, 0xd9, 0x21, 0xd1, 0xf2, 0x30, 0xe4, 0xfa, 0x18, 0x93, 0x3d, 0x08, 0xec, 0xa0, + 0xff, 0x4d, 0x81, 0xf7, 0x40, 0xb1, 0x1d, 0xdd, 0x72, 0x74, 0xef, 0x90, 0xbe, 0x12, 0x95, 0x90, + 0x25, 0xd1, 0x50, 0xe7, 0xf2, 0xc2, 0x3e, 0x4c, 0x37, 0x68, 0x11, 0x17, 0x58, 0x7e, 0x21, 0xb0, + 0x2f, 0x36, 0xdc, 0xbe, 0x81, 0x96, 0xc5, 0x7b, 0x2c, 0x2b, 0xbf, 0x3c, 0x30, 0x3a, 0x2f, 0x1d, + 0x3f, 0x3a, 0xa3, 0xab, 0xdd, 0xef, 0x9e, 0x8e, 0x4c, 0x4e, 0x16, 0x9c, 0xe1, 0xf4, 0x35, 0x6a, + 0x60, 0x0e, 0xdb, 0xa3, 0xcd, 0x1f, 0xbd, 0xa8, 0xce, 0x0f, 0x49, 0xa3, 0xf3, 0x43, 0xa7, 0x50, + 0xe1, 0x32, 0x4c, 0xd6, 0x55, 0xc7, 0x6b, 0x60, 0xef, 0x1a, 0x56, 0x9b, 0xd8, 0x89, 0xae, 0xba, + 0x93, 0x62, 0xd5, 0x45, 0x90, 0xa4, 0x4b, 0x2b, 0x5b, 0x75, 0xe8, 0xef, 0xc2, 0x1e, 0x24, 0xe9, + 0x6b, 0x91, 0xfe, 0x8a, 0xcc, 0x11, 0x6c, 0x45, 0x26, 0xb9, 0xf4, 0xd0, 0xc3, 0xae, 0x38, 0x34, + 0xa0, 0x17, 0xe8, 0x05, 0xb1, 0xae, 0x26, 0x8e, 0x5e, 0x57, 0x79, 0x20, 0xf2, 0xd5, 0xd5, 0x80, + 0x89, 0x32, 0x49, 0xc5, 0xab, 0x55, 0xdf, 0x90, 0x58, 0x60, 0x08, 0x5a, 0x87, 0x69, 0x5b, 0x75, + 0x3c, 0xfa, 0x85, 0xc8, 0x1e, 0xed, 0x05, 0x8f, 0xf5, 0xc5, 0xde, 0x99, 0x17, 0xe9, 0x2c, 0xbf, + 0xcb, 0xa4, 0x1d, 0x16, 0x16, 0xfe, 0x73, 0x12, 0x52, 0xdc, 0x19, 0x1f, 0x81, 0x09, 0xee, 0x56, + 0x1e, 0x9d, 0x0f, 0x2d, 0xf7, 0x2e, 0x4c, 0xcb, 0xfe, 0x02, 0xc2, 0xf9, 0x04, 0x06, 0x3d, 0x0e, + 0x69, 0x6d, 0x4f, 0xd5, 0x4d, 0x45, 0x6f, 0xf2, 0x82, 0x30, 0xfb, 0xde, 0xbb, 0x8b, 0x13, 0x15, + 0x22, 0x5b, 0xad, 0xca, 0x13, 0xb4, 0x71, 0xb5, 0x49, 0x2a, 0x81, 0x3d, 0xac, 0xb7, 0xf6, 0x3c, + 0x3e, 0xc3, 0xf8, 0x15, 0x7a, 0x11, 0x92, 0x24, 0x20, 0xf8, 0xf7, 0x83, 0xf3, 0x3d, 0x15, 0xbe, + 0xbf, 0x85, 0x2e, 0xa7, 0xc9, 0x8d, 0x3f, 0xf5, 0x1f, 0x17, 0x63, 0x32, 0x45, 0xa0, 0x0a, 0x4c, + 0x1a, 0xaa, 0xeb, 0x29, 0x74, 0x05, 0x23, 0xb7, 0x1f, 0xa7, 0x14, 0xa7, 0x7b, 0x1d, 0xc2, 0x1d, + 0xcb, 0x4d, 0xcf, 0x12, 0x14, 0x13, 0x35, 0xd1, 0x59, 0x90, 0x28, 0x89, 0x66, 0xb5, 0xdb, 0xba, + 0xc7, 0x6a, 0xab, 0x14, 0xf5, 0xfb, 0x14, 0x91, 0x57, 0xa8, 0x98, 0x56, 0x58, 0x0f, 0x40, 0x86, + 0x7e, 0xb1, 0x44, 0x55, 0xd8, 0xbb, 0xb8, 0x69, 0x22, 0xa0, 0x8d, 0x67, 0x60, 0x3a, 0xc8, 0x8f, + 0x4c, 0x25, 0xcd, 0x58, 0x02, 0x31, 0x55, 0x7c, 0x16, 0xe6, 0x4c, 0x7c, 0x9b, 0xbe, 0x1d, 0x1c, + 0xd1, 0xce, 0x50, 0x6d, 0x44, 0xda, 0x6e, 0x46, 0x11, 0x8f, 0xc1, 0x94, 0x26, 0x9c, 0xcf, 0x74, + 0x81, 0xea, 0x4e, 0xfa, 0x52, 0xaa, 0x76, 0x1a, 0xd2, 0xaa, 0x6d, 0x33, 0x85, 0x2c, 0xcf, 0x8f, + 0xb6, 0x4d, 0x9b, 0x9e, 0x84, 0x19, 0xda, 0x47, 0x07, 0xbb, 0x1d, 0xc3, 0xe3, 0x24, 0x39, 0xaa, + 0x33, 0x4d, 0x1a, 0x64, 0x26, 0xa7, 0xba, 0x8f, 0xc0, 0x24, 0x3e, 0xd0, 0x9b, 0xd8, 0xd4, 0x30, + 0xd3, 0x9b, 0xa4, 0x7a, 0x39, 0x21, 0xa4, 0x4a, 0x4f, 0x80, 0x9f, 0xf7, 0x14, 0x91, 0x93, 0xa7, + 0x18, 0x9f, 0x90, 0x97, 0x98, 0xb8, 0x90, 0x87, 0x64, 0x55, 0xf5, 0x54, 0x52, 0x60, 0x78, 0xb7, + 0xd9, 0x42, 0x93, 0x93, 0xc9, 0xcf, 0xc2, 0x77, 0xe2, 0x90, 0xbc, 0x69, 0x79, 0x18, 0x3d, 0x1f, + 0x2a, 0x00, 0xa7, 0xfa, 0xc5, 0x73, 0x43, 0x6f, 0x99, 0xb8, 0xb9, 0xee, 0xb6, 0x42, 0xff, 0x5e, + 0x20, 0x08, 0xa7, 0x78, 0x24, 0x9c, 0xe6, 0x60, 0xdc, 0xb1, 0x3a, 0x66, 0x53, 0xbc, 0xc6, 0x4a, + 0x2f, 0x50, 0x0d, 0xd2, 0x7e, 0x94, 0x24, 0x87, 0x45, 0xc9, 0x34, 0x89, 0x12, 0x12, 0xc3, 0x5c, + 0x20, 0x4f, 0xec, 0xf0, 0x60, 0x29, 0x43, 0xc6, 0x4f, 0x5e, 0x3c, 0xda, 0x46, 0x0b, 0xd8, 0x00, + 0x46, 0x16, 0x13, 0x7f, 0xec, 0x7d, 0xe7, 0xb1, 0x88, 0x93, 0xfc, 0x06, 0xee, 0xbd, 0x48, 0x58, + 0xf1, 0x7f, 0x75, 0x30, 0x41, 0xfb, 0x15, 0x84, 0x15, 0xfb, 0x77, 0x07, 0x0f, 0x42, 0xc6, 0xd5, + 0x5b, 0xa6, 0xea, 0x75, 0x1c, 0xcc, 0x23, 0x2f, 0x10, 0x14, 0xbe, 0x16, 0x83, 0x14, 0x8b, 0xe4, + 0x90, 0xdf, 0x62, 0xfd, 0xfd, 0x16, 0x1f, 0xe4, 0xb7, 0xc4, 0xbd, 0xfb, 0xad, 0x04, 0xe0, 0x1b, + 0xe3, 0xf2, 0x2f, 0xd0, 0xfb, 0x54, 0x0c, 0xcc, 0xc4, 0x86, 0xde, 0xe2, 0x13, 0x35, 0x04, 0x2a, + 0xfc, 0x87, 0x18, 0x29, 0x62, 0x79, 0x3b, 0x2a, 0xc1, 0xa4, 0xb0, 0x4b, 0xd9, 0x35, 0xd4, 0x16, + 0x8f, 0x9d, 0x87, 0x06, 0x1a, 0x77, 0xd5, 0x50, 0x5b, 0x72, 0x96, 0xdb, 0x43, 0x2e, 0xfa, 0x8f, + 0x43, 0x7c, 0xc0, 0x38, 0x44, 0x06, 0x3e, 0x71, 0x6f, 0x03, 0x1f, 0x19, 0xa2, 0x64, 0xf7, 0x10, + 0x7d, 0x39, 0x4e, 0x37, 0x33, 0xb6, 0xe5, 0xaa, 0xc6, 0x87, 0x31, 0x23, 0x1e, 0x80, 0x8c, 0x6d, + 0x19, 0x0a, 0x6b, 0x61, 0xaf, 0x77, 0xa7, 0x6d, 0xcb, 0x90, 0x7b, 0x86, 0x7d, 0xfc, 0x3e, 0x4d, + 0x97, 0xd4, 0x7d, 0xf0, 0xda, 0x44, 0xb7, 0xd7, 0x1c, 0xc8, 0x31, 0x57, 0xf0, 0xb5, 0xec, 0x59, + 0xe2, 0x03, 0xba, 0x38, 0xc6, 0x7a, 0xd7, 0x5e, 0x66, 0x36, 0xd3, 0x94, 0xb9, 0x1e, 0x41, 0xb0, + 0xd4, 0xdf, 0x6f, 0x17, 0x1c, 0x0e, 0x4b, 0x99, 0xeb, 0x15, 0xfe, 0x6a, 0x0c, 0x60, 0x8d, 0x78, + 0x96, 0xf6, 0x97, 0xac, 0x42, 0x2e, 0x35, 0x41, 0x89, 0xdc, 0x79, 0x61, 0xd0, 0xa0, 0xf1, 0xfb, + 0xe7, 0xdc, 0xb0, 0xdd, 0x15, 0x98, 0x0c, 0x82, 0xd1, 0xc5, 0xc2, 0x98, 0x85, 0x23, 0xaa, 0xea, + 0x06, 0xf6, 0xe4, 0xdc, 0x41, 0xe8, 0xaa, 0xf0, 0xcf, 0x62, 0x90, 0xa1, 0x36, 0xad, 0x63, 0x4f, + 0x8d, 0x8c, 0x61, 0xec, 0xde, 0xc7, 0xf0, 0x21, 0x00, 0x46, 0xe3, 0xea, 0x6f, 0x62, 0x1e, 0x59, + 0x19, 0x2a, 0x69, 0xe8, 0x6f, 0x62, 0x74, 0xd1, 0x77, 0x78, 0xe2, 0x68, 0x87, 0x8b, 0xaa, 0x9b, + 0xbb, 0xfd, 0x14, 0x4c, 0xd0, 0xff, 0xd8, 0x74, 0xdb, 0xe5, 0x85, 0x74, 0xca, 0xec, 0xb4, 0xb7, + 0x6e, 0xbb, 0x85, 0x37, 0x60, 0x62, 0xeb, 0x36, 0x3b, 0x1b, 0x79, 0x00, 0x32, 0x8e, 0x65, 0xf1, + 0x35, 0x99, 0xd5, 0x42, 0x69, 0x22, 0xa0, 0x4b, 0x90, 0x38, 0x0f, 0x88, 0x07, 0xe7, 0x01, 0xc1, + 0x81, 0x46, 0x62, 0xa4, 0x03, 0x8d, 0x27, 0x7f, 0x3d, 0x06, 0xd9, 0x50, 0x7e, 0x40, 0xcf, 0xc1, + 0x89, 0xf2, 0xda, 0x66, 0xe5, 0x86, 0xb2, 0x5a, 0x55, 0xae, 0xae, 0x95, 0x56, 0x82, 0x0f, 0x98, + 0xe6, 0x4f, 0xde, 0xb9, 0xbb, 0x84, 0x42, 0xba, 0xdb, 0x26, 0x3d, 0xa7, 0x47, 0xe7, 0x60, 0x2e, + 0x0a, 0x29, 0x95, 0x1b, 0xb5, 0x8d, 0x2d, 0x29, 0x36, 0x7f, 0xe2, 0xce, 0xdd, 0xa5, 0x99, 0x10, + 0xa2, 0xb4, 0xe3, 0x62, 0xd3, 0xeb, 0x05, 0x54, 0x36, 0xd7, 0xd7, 0x57, 0xb7, 0xa4, 0x78, 0x0f, + 0x80, 0x27, 0xec, 0x27, 0x60, 0x26, 0x0a, 0xd8, 0x58, 0x5d, 0x93, 0x12, 0xf3, 0xe8, 0xce, 0xdd, + 0xa5, 0xa9, 0x90, 0xf6, 0x86, 0x6e, 0xcc, 0xa7, 0x3f, 0xf1, 0xf9, 0x85, 0xb1, 0x9f, 0xff, 0xb9, + 0x85, 0x18, 0xe9, 0xd9, 0x64, 0x24, 0x47, 0xa0, 0xa7, 0xe1, 0x54, 0x63, 0x75, 0x65, 0xa3, 0x56, + 0x55, 0xd6, 0x1b, 0x2b, 0xe2, 0xa4, 0x5b, 0xf4, 0x6e, 0xfa, 0xce, 0xdd, 0xa5, 0x2c, 0xef, 0xd2, + 0x20, 0xed, 0xba, 0x5c, 0xbb, 0xb9, 0xb9, 0x55, 0x93, 0x62, 0x4c, 0xbb, 0xee, 0xe0, 0x03, 0xcb, + 0x63, 0xff, 0xd2, 0xed, 0x59, 0x38, 0xdd, 0x47, 0xdb, 0xef, 0xd8, 0xcc, 0x9d, 0xbb, 0x4b, 0x93, + 0x75, 0x07, 0xb3, 0xf9, 0x43, 0x11, 0xcb, 0x90, 0xef, 0x45, 0x6c, 0xd6, 0x37, 0x1b, 0xa5, 0x35, + 0x69, 0x69, 0x5e, 0xba, 0x73, 0x77, 0x29, 0x27, 0x92, 0x21, 0xd1, 0x0f, 0x7a, 0xf6, 0x41, 0xee, + 0x78, 0x3e, 0xf9, 0x34, 0x3c, 0xca, 0xcf, 0x00, 0x5d, 0x4f, 0xdd, 0xd7, 0xcd, 0x96, 0x7f, 0x78, + 0xcb, 0xaf, 0xf9, 0xce, 0xe7, 0x24, 0x3f, 0x67, 0x14, 0xd2, 0x21, 0x47, 0xb8, 0x03, 0x9f, 0x5e, + 0xce, 0x0f, 0x79, 0xa8, 0x37, 0x7c, 0xeb, 0x34, 0xf8, 0x78, 0x78, 0x7e, 0xc8, 0x21, 0xf4, 0xfc, + 0x91, 0x9b, 0xbb, 0xc2, 0x27, 0x63, 0x30, 0x75, 0x4d, 0x77, 0x3d, 0xcb, 0xd1, 0x35, 0xd5, 0xa0, + 0x9f, 0x2d, 0x5d, 0x1c, 0x35, 0xb7, 0x76, 0x4d, 0xf5, 0x97, 0x20, 0x75, 0xa0, 0x1a, 0x2c, 0xa9, + 0x85, 0x9f, 0x05, 0x74, 0xbb, 0x2f, 0x48, 0x6d, 0x82, 0x80, 0xc1, 0x0a, 0x5f, 0x8a, 0xc3, 0x34, + 0x9d, 0x0c, 0x2e, 0xfb, 0x8f, 0x5c, 0x64, 0x8f, 0x55, 0x87, 0xa4, 0xa3, 0x7a, 0xfc, 0xd0, 0xb0, + 0xfc, 0x23, 0xfc, 0x1c, 0xf8, 0xf1, 0xe1, 0xa7, 0xb9, 0xcb, 0xbd, 0x47, 0xc5, 0x94, 0x09, 0xbd, + 0x02, 0xe9, 0xb6, 0x7a, 0x5b, 0xa1, 0xac, 0xf1, 0xfb, 0xc0, 0x3a, 0xd1, 0x56, 0x6f, 0x13, 0x5b, + 0x51, 0x13, 0xa6, 0x09, 0xb1, 0xb6, 0xa7, 0x9a, 0x2d, 0xcc, 0xf8, 0x13, 0xf7, 0x81, 0x7f, 0xb2, + 0xad, 0xde, 0xae, 0x50, 0x4e, 0x72, 0x97, 0x62, 0xfa, 0xd3, 0x6f, 0x2f, 0x8e, 0xd1, 0x63, 0xf6, + 0x5f, 0x89, 0x01, 0x04, 0xee, 0x42, 0x7f, 0x14, 0x24, 0xcd, 0xbf, 0xa2, 0xb7, 0x77, 0xf9, 0x00, + 0x9e, 0x19, 0x34, 0x10, 0x5d, 0xce, 0x66, 0x0b, 0xf3, 0x37, 0xdf, 0x5d, 0x8c, 0xc9, 0xd3, 0x5a, + 0xd7, 0x38, 0xd4, 0x20, 0xdb, 0xb1, 0x9b, 0xaa, 0x87, 0x15, 0xba, 0x89, 0x8b, 0x1f, 0x63, 0x91, + 0x07, 0x06, 0x24, 0x4d, 0x21, 0xeb, 0xbf, 0x14, 0x83, 0x6c, 0x35, 0xf4, 0x90, 0x2f, 0x0f, 0x13, + 0x6d, 0xcb, 0xd4, 0xf7, 0x79, 0xd8, 0x65, 0x64, 0x71, 0x89, 0xe6, 0x21, 0xcd, 0x3e, 0xd8, 0xf4, + 0x0e, 0xc5, 0x89, 0xa7, 0xb8, 0x26, 0xa8, 0x5b, 0x78, 0xc7, 0xd5, 0x85, 0xaf, 0x65, 0x71, 0x49, + 0xb6, 0x2e, 0x2e, 0xd6, 0x3a, 0x8e, 0xee, 0x1d, 0x2a, 0x9a, 0x65, 0x7a, 0xaa, 0xe6, 0xf1, 0x4f, + 0xff, 0xa6, 0x85, 0xbc, 0xc2, 0xc4, 0x84, 0xa4, 0x89, 0x3d, 0x55, 0x37, 0xdc, 0x3c, 0x7b, 0x10, + 0x26, 0x2e, 0x43, 0xe6, 0x7e, 0x37, 0x15, 0x3e, 0xa2, 0xaa, 0x80, 0x64, 0xd9, 0xd8, 0x89, 0x94, + 0x94, 0x2c, 0x42, 0xf3, 0xbf, 0xf6, 0x95, 0x67, 0xe6, 0xb8, 0xbb, 0x79, 0x51, 0xc9, 0xde, 0x6d, + 0x95, 0xa7, 0x05, 0x42, 0xd4, 0x9a, 0xaf, 0x91, 0x01, 0x13, 0xfb, 0x3d, 0xbb, 0xb3, 0x13, 0x1c, + 0x6b, 0xcd, 0xf5, 0xf8, 0xb5, 0x64, 0x1e, 0x96, 0xf3, 0xdf, 0x08, 0xa8, 0x83, 0xb3, 0xa4, 0x1b, + 0xf8, 0x90, 0x8c, 0x16, 0xe7, 0xa9, 0x53, 0x1a, 0x52, 0x22, 0xbe, 0xa1, 0xea, 0x86, 0xf8, 0x0e, + 0x5d, 0xe6, 0x57, 0xa8, 0x08, 0x29, 0xd7, 0x53, 0xbd, 0x8e, 0xcb, 0xff, 0x5f, 0x5c, 0x61, 0x50, + 0x64, 0x94, 0x2d, 0xb3, 0xd9, 0xa0, 0x9a, 0x32, 0x47, 0xa0, 0x2d, 0x48, 0x79, 0xd6, 0x3e, 0x36, + 0xb9, 0x93, 0x8e, 0x15, 0xd5, 0x7d, 0x9e, 0x45, 0x31, 0x2e, 0xd4, 0x02, 0xa9, 0x89, 0x0d, 0xdc, + 0x62, 0x05, 0xd1, 0x9e, 0x4a, 0xf6, 0x0d, 0xa9, 0xfb, 0x30, 0x6b, 0xa6, 0x7d, 0xd6, 0x06, 0x25, + 0x45, 0x37, 0xa2, 0x8f, 0x99, 0xd9, 0x3f, 0x57, 0x7c, 0x64, 0x50, 0xff, 0x43, 0x91, 0x29, 0x0e, + 0x13, 0xc2, 0x4f, 0xa4, 0x9f, 0x00, 0xa9, 0x63, 0xee, 0x58, 0x26, 0xfd, 0x5a, 0x94, 0x17, 0xe3, + 0x69, 0x5a, 0xde, 0x4c, 0xfb, 0xf2, 0x6b, 0xac, 0x2a, 0xbf, 0x01, 0x53, 0x81, 0x2a, 0x9d, 0x3b, + 0x99, 0x63, 0xcc, 0x9d, 0x49, 0x1f, 0x4b, 0x5a, 0xd1, 0x35, 0x80, 0x60, 0x62, 0xd2, 0xe3, 0x81, + 0xec, 0xe0, 0x31, 0x0c, 0x66, 0xb7, 0xd8, 0x66, 0x05, 0x58, 0x64, 0xc0, 0x6c, 0x5b, 0x37, 0x15, + 0x17, 0x1b, 0xbb, 0x0a, 0x77, 0x15, 0xa1, 0xcc, 0xde, 0x87, 0xa1, 0x9d, 0x69, 0xeb, 0x66, 0x03, + 0x1b, 0xbb, 0x55, 0x9f, 0x16, 0x2d, 0x42, 0x16, 0x1f, 0xb4, 0xfd, 0xa9, 0xc2, 0xfe, 0x85, 0x29, + 0xe0, 0x83, 0x36, 0x9f, 0x0b, 0xc5, 0xdc, 0x27, 0xde, 0x5e, 0x1c, 0xe3, 0x93, 0x6d, 0xac, 0x50, + 0xa7, 0x67, 0xd8, 0xbc, 0x0d, 0xbb, 0xe8, 0x22, 0x64, 0x54, 0x71, 0x41, 0x4f, 0x16, 0x8e, 0x9a, + 0x67, 0x81, 0x2a, 0x9b, 0xbe, 0x6f, 0xfd, 0xd6, 0x52, 0xac, 0xf0, 0x73, 0x31, 0x48, 0x55, 0x6f, + 0xd6, 0x55, 0xdd, 0x41, 0x35, 0x98, 0x09, 0x22, 0x6e, 0xd4, 0xc9, 0x1b, 0x04, 0xa9, 0x98, 0xbd, + 0xb5, 0x41, 0xdb, 0xca, 0x23, 0x69, 0xba, 0x37, 0x9c, 0x5d, 0x1d, 0xaf, 0xc1, 0x04, 0xb3, 0xd2, + 0x45, 0x45, 0x18, 0xb7, 0xc9, 0x0f, 0x7e, 0x64, 0xbf, 0x30, 0x30, 0x52, 0xa9, 0xbe, 0x7f, 0xc4, + 0x48, 0x20, 0x85, 0xdf, 0x8b, 0x01, 0x54, 0x6f, 0xde, 0xdc, 0x72, 0x74, 0xdb, 0xc0, 0xde, 0xfd, + 0xea, 0xf1, 0x1a, 0x9c, 0x08, 0xed, 0x5d, 0x1c, 0x6d, 0xe4, 0x5e, 0xcf, 0x06, 0xbb, 0x17, 0x47, + 0xeb, 0xcb, 0xd6, 0x74, 0x3d, 0x9f, 0x2d, 0x31, 0x32, 0x5b, 0xd5, 0xf5, 0xfa, 0xbb, 0xb1, 0x01, + 0xd9, 0xa0, 0xfb, 0x2e, 0xaa, 0x42, 0xda, 0xe3, 0xbf, 0xb9, 0x37, 0x0b, 0x83, 0xbd, 0x29, 0x60, + 0xdc, 0xa3, 0x3e, 0xb2, 0xf0, 0x7f, 0x89, 0x53, 0x83, 0x90, 0xfe, 0x03, 0x15, 0x46, 0x24, 0x39, + 0xf3, 0xe4, 0x79, 0x3f, 0x4a, 0x0e, 0xce, 0xd5, 0xe5, 0xd5, 0x8f, 0xc7, 0x61, 0x76, 0x5b, 0xa4, + 0xa3, 0x3f, 0xb0, 0x9e, 0xa8, 0xc3, 0x04, 0x36, 0x3d, 0x47, 0xa7, 0xae, 0x20, 0x63, 0xfd, 0xec, + 0xa0, 0xb1, 0xee, 0xd3, 0x17, 0xfa, 0x7f, 0x8d, 0xc4, 0xc1, 0x37, 0xa7, 0xe9, 0xf2, 0xc2, 0xbf, + 0x8f, 0x43, 0x7e, 0x10, 0x12, 0x9d, 0x81, 0x69, 0xcd, 0xc1, 0x54, 0xa0, 0x44, 0x4e, 0xdf, 0xa6, + 0x84, 0x98, 0xaf, 0x0a, 0xeb, 0x40, 0x2a, 0x2c, 0x12, 0x58, 0x44, 0xf5, 0xd8, 0x25, 0xd5, 0x54, + 0x00, 0xa6, 0xeb, 0x02, 0x86, 0x69, 0xdd, 0xd4, 0x3d, 0x5d, 0x35, 0x94, 0x1d, 0xd5, 0x50, 0x4d, + 0xed, 0x5e, 0x4a, 0xcf, 0xde, 0x4c, 0x3e, 0xc5, 0x49, 0xcb, 0x8c, 0x13, 0xdd, 0x84, 0x09, 0x41, + 0x9f, 0xbc, 0x0f, 0xf4, 0x82, 0x2c, 0x54, 0x66, 0xfd, 0x66, 0x1c, 0x66, 0x64, 0xdc, 0xfc, 0xc3, + 0xe5, 0xd6, 0x1f, 0x05, 0x60, 0x13, 0x8e, 0xe4, 0xc1, 0x7b, 0xf0, 0x6c, 0xef, 0x04, 0xce, 0x30, + 0xbe, 0xaa, 0xeb, 0x85, 0x7c, 0xfb, 0x8d, 0x38, 0xe4, 0xc2, 0xbe, 0xfd, 0x43, 0xb0, 0x2e, 0xa0, + 0xd5, 0x20, 0x1b, 0x24, 0xf9, 0x7f, 0x64, 0x1d, 0x90, 0x0d, 0x7a, 0xa2, 0xee, 0xe8, 0x34, 0xf0, + 0x83, 0x38, 0xa4, 0xea, 0xaa, 0xa3, 0xb6, 0x5d, 0x74, 0xbd, 0xa7, 0xc2, 0x13, 0xc7, 0x70, 0x3d, + 0xff, 0x77, 0x9b, 0xef, 0xfa, 0x59, 0xc8, 0x7d, 0xba, 0x4f, 0x81, 0xf7, 0x18, 0x4c, 0x91, 0x3d, + 0x64, 0xe8, 0x89, 0x7d, 0x9c, 0x3e, 0x87, 0x24, 0x9b, 0xc0, 0xe0, 0x71, 0x11, 0xa9, 0xa7, 0x88, + 0x5a, 0x90, 0xe8, 0x88, 0x0e, 0xb4, 0xd5, 0xdb, 0x35, 0x26, 0x41, 0xcf, 0x00, 0xda, 0xf3, 0x77, + 0xf5, 0x4a, 0xe0, 0x02, 0xa2, 0x37, 0x13, 0xb4, 0x08, 0xf5, 0x87, 0x00, 0x88, 0x15, 0x0a, 0x7b, + 0x0b, 0x8c, 0x6d, 0x82, 0x32, 0x44, 0x52, 0xa5, 0x6f, 0x82, 0xfd, 0x38, 0x2b, 0x16, 0xbb, 0xb6, + 0x97, 0xbc, 0x4e, 0x5f, 0x3b, 0x5e, 0xa4, 0xfe, 0xe0, 0xdd, 0xc5, 0xf9, 0x43, 0xb5, 0x6d, 0x14, + 0x0b, 0x7d, 0x28, 0x0b, 0xb4, 0x78, 0x8c, 0x6e, 0x4b, 0x43, 0x11, 0xfc, 0xf9, 0x18, 0xa0, 0x20, + 0xe5, 0xca, 0xd8, 0xb5, 0xc9, 0xbe, 0x87, 0x54, 0xc5, 0xa1, 0x12, 0x36, 0x76, 0x74, 0x55, 0x1c, + 0xe0, 0x45, 0x55, 0x1c, 0x9a, 0x11, 0x97, 0x83, 0x04, 0x17, 0xe7, 0x63, 0xd8, 0xe7, 0x15, 0xbe, + 0xe5, 0x8a, 0xa5, 0x0b, 0x74, 0x4f, 0x0e, 0x1b, 0x2b, 0xfc, 0x66, 0x0c, 0x4e, 0xf7, 0x44, 0x93, + 0x6f, 0xec, 0x1f, 0x07, 0xe4, 0x84, 0x1a, 0xf9, 0xbf, 0xd6, 0x63, 0x46, 0x1f, 0x3b, 0x38, 0x67, + 0x9c, 0x9e, 0x5c, 0xf9, 0x41, 0xe5, 0x68, 0xf6, 0x6a, 0xdf, 0x3f, 0x89, 0xc1, 0x5c, 0xd8, 0x18, + 0xbf, 0x5b, 0x1b, 0x90, 0x0b, 0xdb, 0xc2, 0x3b, 0xf4, 0xe8, 0x28, 0x1d, 0xe2, 0x7d, 0x89, 0xe0, + 0xd1, 0xcb, 0xc1, 0xc4, 0x65, 0xa7, 0x49, 0xcf, 0x8d, 0xec, 0x1b, 0x61, 0x53, 0xf7, 0x04, 0x4e, + 0x8a, 0x2a, 0x26, 0x59, 0xb7, 0x2c, 0x03, 0xfd, 0x49, 0x98, 0x31, 0x2d, 0x4f, 0x21, 0x51, 0x8e, + 0x9b, 0x0a, 0xdf, 0xda, 0xb2, 0xec, 0xf7, 0xf2, 0xf1, 0x5c, 0xf6, 0xdd, 0x77, 0x17, 0x7b, 0xa9, + 0xba, 0xfc, 0x38, 0x6d, 0x5a, 0x5e, 0x99, 0xb6, 0x6f, 0xb1, 0x8d, 0xaf, 0x03, 0x93, 0xd1, 0x5b, + 0xb3, 0x6c, 0xb9, 0x7e, 0xec, 0x5b, 0x4f, 0x1e, 0x75, 0xdb, 0xdc, 0x4e, 0xe8, 0x9e, 0xec, 0xa5, + 0xa7, 0xef, 0xbf, 0xbd, 0x18, 0x7b, 0xf2, 0xab, 0x31, 0x80, 0x60, 0x8f, 0x8f, 0x9e, 0x86, 0x53, + 0xe5, 0xcd, 0x8d, 0xaa, 0xd2, 0xd8, 0x2a, 0x6d, 0x6d, 0x37, 0xa2, 0xaf, 0x46, 0x8b, 0x43, 0x63, + 0xd7, 0xc6, 0x9a, 0xbe, 0xab, 0xe3, 0x26, 0x7a, 0x1c, 0xe6, 0xa2, 0xda, 0xe4, 0xaa, 0x56, 0x95, + 0x62, 0xf3, 0xb9, 0x3b, 0x77, 0x97, 0xd2, 0xac, 0x3a, 0xc2, 0x4d, 0x74, 0x16, 0x4e, 0xf4, 0xea, + 0xad, 0x6e, 0xac, 0x48, 0xf1, 0xf9, 0xc9, 0x3b, 0x77, 0x97, 0x32, 0x7e, 0x19, 0x85, 0x0a, 0x80, + 0xc2, 0x9a, 0x9c, 0x2f, 0x31, 0x0f, 0x77, 0xee, 0x2e, 0xa5, 0x98, 0xdb, 0xe6, 0x93, 0x9f, 0xf8, + 0xfc, 0xc2, 0x58, 0xf9, 0xea, 0xc0, 0x63, 0xe1, 0xa7, 0x8f, 0xf4, 0xd8, 0x6d, 0xff, 0xa8, 0x37, + 0x72, 0x16, 0xfc, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x30, 0x2f, 0x36, 0x46, 0x2c, 0x66, 0x00, + 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r)