diff --git a/CHANGELOG.md b/CHANGELOG.md index f83ad786bc9f..c179d152831f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ * [#13473](https://github.com/cosmos/cosmos-sdk/pull/13473) ADR-038: Go plugin system proposal * (mempool) [#14484](https://github.com/cosmos/cosmos-sdk/pull/14484) Add priority nonce mempool option for transaction replacement. * (x/bank) [#14894](https://github.com/cosmos/cosmos-sdk/pull/14894) Return a human readable denomination for IBC vouchers when querying bank balances. Added a `ResolveDenom` parameter to `types.QueryAllBalancesRequest` and `--resolve-denom` flag to `GetBalancesCmd()`. +* (x/gov) [#15151](https://github.com/cosmos/cosmos-sdk/pull/15151) Add `burn_vote_quorum`, `burn_proposal_deposit_prevote` and `burn_vote_veto` params to allow applications to decide if they would like to burn deposits +* (x/staking) [#15165](https://github.com/cosmos/cosmos-sdk/pull/15165) Add feature to rotate validators consensus pubkey & introduce `key_rotation_fee` and `max_cons_pubkey_rotations` params to calculate fees while rotating the keys * (runtime) [#15547](https://github.com/cosmos/cosmos-sdk/pull/15547) Allow runtime to pass event core api service to modules * (telemetry) [#15657](https://github.com/cosmos/cosmos-sdk/pull/15657) Emit more data (go version, sdk version, upgrade height) in prom metrics * (types/module) [#15829](https://github.com/cosmos/cosmos-sdk/pull/15829) Add new endblocker interface to handle valset updates. diff --git a/api/cosmos/staking/v1beta1/staking.pulsar.go b/api/cosmos/staking/v1beta1/staking.pulsar.go index a86d038bb8ab..2937ab9b8f7d 100644 --- a/api/cosmos/staking/v1beta1/staking.pulsar.go +++ b/api/cosmos/staking/v1beta1/staking.pulsar.go @@ -9416,6 +9416,7 @@ var ( fd_Params_historical_entries protoreflect.FieldDescriptor fd_Params_bond_denom protoreflect.FieldDescriptor fd_Params_min_commission_rate protoreflect.FieldDescriptor + fd_Params_key_rotation_fee protoreflect.FieldDescriptor ) func init() { @@ -9427,6 +9428,7 @@ func init() { fd_Params_historical_entries = md_Params.Fields().ByName("historical_entries") fd_Params_bond_denom = md_Params.Fields().ByName("bond_denom") fd_Params_min_commission_rate = md_Params.Fields().ByName("min_commission_rate") + fd_Params_key_rotation_fee = md_Params.Fields().ByName("key_rotation_fee") } var _ protoreflect.Message = (*fastReflection_Params)(nil) @@ -9530,6 +9532,12 @@ func (x *fastReflection_Params) Range(f func(protoreflect.FieldDescriptor, proto return } } + if x.KeyRotationFee != nil { + value := protoreflect.ValueOfMessage(x.KeyRotationFee.ProtoReflect()) + if !f(fd_Params_key_rotation_fee, value) { + return + } + } } // Has reports whether a field is populated. @@ -9557,6 +9565,8 @@ func (x *fastReflection_Params) Has(fd protoreflect.FieldDescriptor) bool { return x.BondDenom != "" case "cosmos.staking.v1beta1.Params.min_commission_rate": return x.MinCommissionRate != "" + case "cosmos.staking.v1beta1.Params.key_rotation_fee": + return x.KeyRotationFee != nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Params")) @@ -9585,6 +9595,8 @@ func (x *fastReflection_Params) Clear(fd protoreflect.FieldDescriptor) { x.BondDenom = "" case "cosmos.staking.v1beta1.Params.min_commission_rate": x.MinCommissionRate = "" + case "cosmos.staking.v1beta1.Params.key_rotation_fee": + x.KeyRotationFee = nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Params")) @@ -9619,6 +9631,9 @@ func (x *fastReflection_Params) Get(descriptor protoreflect.FieldDescriptor) pro case "cosmos.staking.v1beta1.Params.min_commission_rate": value := x.MinCommissionRate return protoreflect.ValueOfString(value) + case "cosmos.staking.v1beta1.Params.key_rotation_fee": + value := x.KeyRotationFee + return protoreflect.ValueOfMessage(value.ProtoReflect()) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Params")) @@ -9651,6 +9666,8 @@ func (x *fastReflection_Params) Set(fd protoreflect.FieldDescriptor, value proto x.BondDenom = value.Interface().(string) case "cosmos.staking.v1beta1.Params.min_commission_rate": x.MinCommissionRate = value.Interface().(string) + case "cosmos.staking.v1beta1.Params.key_rotation_fee": + x.KeyRotationFee = value.Message().Interface().(*v1beta1.Coin) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Params")) @@ -9676,6 +9693,11 @@ func (x *fastReflection_Params) Mutable(fd protoreflect.FieldDescriptor) protore x.UnbondingTime = new(durationpb.Duration) } return protoreflect.ValueOfMessage(x.UnbondingTime.ProtoReflect()) + case "cosmos.staking.v1beta1.Params.key_rotation_fee": + if x.KeyRotationFee == nil { + x.KeyRotationFee = new(v1beta1.Coin) + } + return protoreflect.ValueOfMessage(x.KeyRotationFee.ProtoReflect()) case "cosmos.staking.v1beta1.Params.max_validators": panic(fmt.Errorf("field max_validators of message cosmos.staking.v1beta1.Params is not mutable")) case "cosmos.staking.v1beta1.Params.max_entries": @@ -9712,6 +9734,9 @@ func (x *fastReflection_Params) NewField(fd protoreflect.FieldDescriptor) protor return protoreflect.ValueOfString("") case "cosmos.staking.v1beta1.Params.min_commission_rate": return protoreflect.ValueOfString("") + case "cosmos.staking.v1beta1.Params.key_rotation_fee": + m := new(v1beta1.Coin) + return protoreflect.ValueOfMessage(m.ProtoReflect()) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Params")) @@ -9802,6 +9827,10 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + if x.KeyRotationFee != nil { + l = options.Size(x.KeyRotationFee) + n += 1 + l + runtime.Sov(uint64(l)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -9831,6 +9860,20 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if x.KeyRotationFee != nil { + encoded, err := options.Marshal(x.KeyRotationFee) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x3a + } if len(x.MinCommissionRate) > 0 { i -= len(x.MinCommissionRate) copy(dAtA[i:], x.MinCommissionRate) @@ -10080,6 +10123,42 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { } x.MinCommissionRate = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 7: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field KeyRotationFee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.KeyRotationFee == nil { + x.KeyRotationFee = &v1beta1.Coin{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.KeyRotationFee); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -12679,177 +12758,1362 @@ func (x *fastReflection_ValidatorUpdates) ProtoMethods() *protoiface.Methods { } } -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.0 -// protoc (unknown) -// source: cosmos/staking/v1beta1/staking.proto - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// BondStatus is the status of a validator. -type BondStatus int32 - -const ( - // UNSPECIFIED defines an invalid validator status. - BondStatus_BOND_STATUS_UNSPECIFIED BondStatus = 0 - // UNBONDED defines a validator that is not bonded. - BondStatus_BOND_STATUS_UNBONDED BondStatus = 1 - // UNBONDING defines a validator that is unbonding. - BondStatus_BOND_STATUS_UNBONDING BondStatus = 2 - // BONDED defines a validator that is bonded. - BondStatus_BOND_STATUS_BONDED BondStatus = 3 -) - -// Enum value maps for BondStatus. var ( - BondStatus_name = map[int32]string{ - 0: "BOND_STATUS_UNSPECIFIED", - 1: "BOND_STATUS_UNBONDED", - 2: "BOND_STATUS_UNBONDING", - 3: "BOND_STATUS_BONDED", - } - BondStatus_value = map[string]int32{ - "BOND_STATUS_UNSPECIFIED": 0, - "BOND_STATUS_UNBONDED": 1, - "BOND_STATUS_UNBONDING": 2, - "BOND_STATUS_BONDED": 3, - } + md_ConsPubKeyRotationHistory protoreflect.MessageDescriptor + fd_ConsPubKeyRotationHistory_operator_address protoreflect.FieldDescriptor + fd_ConsPubKeyRotationHistory_old_cons_pubkey protoreflect.FieldDescriptor + fd_ConsPubKeyRotationHistory_new_cons_pubkey protoreflect.FieldDescriptor + fd_ConsPubKeyRotationHistory_height protoreflect.FieldDescriptor + fd_ConsPubKeyRotationHistory_fee protoreflect.FieldDescriptor ) -func (x BondStatus) Enum() *BondStatus { - p := new(BondStatus) - *p = x - return p -} - -func (x BondStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +func init() { + file_cosmos_staking_v1beta1_staking_proto_init() + md_ConsPubKeyRotationHistory = File_cosmos_staking_v1beta1_staking_proto.Messages().ByName("ConsPubKeyRotationHistory") + fd_ConsPubKeyRotationHistory_operator_address = md_ConsPubKeyRotationHistory.Fields().ByName("operator_address") + fd_ConsPubKeyRotationHistory_old_cons_pubkey = md_ConsPubKeyRotationHistory.Fields().ByName("old_cons_pubkey") + fd_ConsPubKeyRotationHistory_new_cons_pubkey = md_ConsPubKeyRotationHistory.Fields().ByName("new_cons_pubkey") + fd_ConsPubKeyRotationHistory_height = md_ConsPubKeyRotationHistory.Fields().ByName("height") + fd_ConsPubKeyRotationHistory_fee = md_ConsPubKeyRotationHistory.Fields().ByName("fee") } -func (BondStatus) Descriptor() protoreflect.EnumDescriptor { - return file_cosmos_staking_v1beta1_staking_proto_enumTypes[0].Descriptor() -} +var _ protoreflect.Message = (*fastReflection_ConsPubKeyRotationHistory)(nil) -func (BondStatus) Type() protoreflect.EnumType { - return &file_cosmos_staking_v1beta1_staking_proto_enumTypes[0] -} +type fastReflection_ConsPubKeyRotationHistory ConsPubKeyRotationHistory -func (x BondStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) +func (x *ConsPubKeyRotationHistory) ProtoReflect() protoreflect.Message { + return (*fastReflection_ConsPubKeyRotationHistory)(x) } -// Deprecated: Use BondStatus.Descriptor instead. -func (BondStatus) EnumDescriptor() ([]byte, []int) { - return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{0} +func (x *ConsPubKeyRotationHistory) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -// Infraction indicates the infraction a validator commited. -type Infraction int32 - -const ( - // UNSPECIFIED defines an empty infraction. - Infraction_INFRACTION_UNSPECIFIED Infraction = 0 - // DOUBLE_SIGN defines a validator that double-signs a block. - Infraction_INFRACTION_DOUBLE_SIGN Infraction = 1 - // DOWNTIME defines a validator that missed signing too many blocks. - Infraction_INFRACTION_DOWNTIME Infraction = 2 -) +var _fastReflection_ConsPubKeyRotationHistory_messageType fastReflection_ConsPubKeyRotationHistory_messageType +var _ protoreflect.MessageType = fastReflection_ConsPubKeyRotationHistory_messageType{} -// Enum value maps for Infraction. -var ( - Infraction_name = map[int32]string{ - 0: "INFRACTION_UNSPECIFIED", - 1: "INFRACTION_DOUBLE_SIGN", - 2: "INFRACTION_DOWNTIME", - } - Infraction_value = map[string]int32{ - "INFRACTION_UNSPECIFIED": 0, - "INFRACTION_DOUBLE_SIGN": 1, - "INFRACTION_DOWNTIME": 2, - } -) +type fastReflection_ConsPubKeyRotationHistory_messageType struct{} -func (x Infraction) Enum() *Infraction { - p := new(Infraction) - *p = x - return p +func (x fastReflection_ConsPubKeyRotationHistory_messageType) Zero() protoreflect.Message { + return (*fastReflection_ConsPubKeyRotationHistory)(nil) } - -func (x Infraction) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +func (x fastReflection_ConsPubKeyRotationHistory_messageType) New() protoreflect.Message { + return new(fastReflection_ConsPubKeyRotationHistory) } - -func (Infraction) Descriptor() protoreflect.EnumDescriptor { - return file_cosmos_staking_v1beta1_staking_proto_enumTypes[1].Descriptor() +func (x fastReflection_ConsPubKeyRotationHistory_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_ConsPubKeyRotationHistory } -func (Infraction) Type() protoreflect.EnumType { - return &file_cosmos_staking_v1beta1_staking_proto_enumTypes[1] +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_ConsPubKeyRotationHistory) Descriptor() protoreflect.MessageDescriptor { + return md_ConsPubKeyRotationHistory } -func (x Infraction) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_ConsPubKeyRotationHistory) Type() protoreflect.MessageType { + return _fastReflection_ConsPubKeyRotationHistory_messageType } -// Deprecated: Use Infraction.Descriptor instead. -func (Infraction) EnumDescriptor() ([]byte, []int) { - return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{1} +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_ConsPubKeyRotationHistory) New() protoreflect.Message { + return new(fastReflection_ConsPubKeyRotationHistory) } -// HistoricalInfo contains header and validator information for a given block. -// It is stored as part of staking module's state, which persists the `n` most -// recent HistoricalInfo -// (`n` is set by the staking module's `historical_entries` parameter). -type HistoricalInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Header *types.Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` - Valset []*Validator `protobuf:"bytes,2,rep,name=valset,proto3" json:"valset,omitempty"` +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_ConsPubKeyRotationHistory) Interface() protoreflect.ProtoMessage { + return (*ConsPubKeyRotationHistory)(x) } -func (x *HistoricalInfo) Reset() { - *x = HistoricalInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_ConsPubKeyRotationHistory) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.OperatorAddress != "" { + value := protoreflect.ValueOfString(x.OperatorAddress) + if !f(fd_ConsPubKeyRotationHistory_operator_address, value) { + return + } + } + if x.OldConsPubkey != nil { + value := protoreflect.ValueOfMessage(x.OldConsPubkey.ProtoReflect()) + if !f(fd_ConsPubKeyRotationHistory_old_cons_pubkey, value) { + return + } + } + if x.NewConsPubkey != nil { + value := protoreflect.ValueOfMessage(x.NewConsPubkey.ProtoReflect()) + if !f(fd_ConsPubKeyRotationHistory_new_cons_pubkey, value) { + return + } + } + if x.Height != uint64(0) { + value := protoreflect.ValueOfUint64(x.Height) + if !f(fd_ConsPubKeyRotationHistory_height, value) { + return + } + } + if x.Fee != nil { + value := protoreflect.ValueOfMessage(x.Fee.ProtoReflect()) + if !f(fd_ConsPubKeyRotationHistory_fee, value) { + return + } } } -func (x *HistoricalInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HistoricalInfo) ProtoMessage() {} - -// Deprecated: Use HistoricalInfo.ProtoReflect.Descriptor instead. -func (*HistoricalInfo) Descriptor() ([]byte, []int) { - return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{0} -} - -func (x *HistoricalInfo) GetHeader() *types.Header { - if x != nil { - return x.Header +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_ConsPubKeyRotationHistory) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.operator_address": + return x.OperatorAddress != "" + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.old_cons_pubkey": + return x.OldConsPubkey != nil + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.new_cons_pubkey": + return x.NewConsPubkey != nil + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.height": + return x.Height != uint64(0) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.fee": + return x.Fee != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ConsPubKeyRotationHistory")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ConsPubKeyRotationHistory does not contain field %s", fd.FullName())) } - return nil } -func (x *HistoricalInfo) GetValset() []*Validator { - if x != nil { - return x.Valset +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ConsPubKeyRotationHistory) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.operator_address": + x.OperatorAddress = "" + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.old_cons_pubkey": + x.OldConsPubkey = nil + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.new_cons_pubkey": + x.NewConsPubkey = nil + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.height": + x.Height = uint64(0) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.fee": + x.Fee = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ConsPubKeyRotationHistory")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ConsPubKeyRotationHistory does not contain field %s", fd.FullName())) } - return nil } -// CommissionRates defines the initial commission rates to be used for creating +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_ConsPubKeyRotationHistory) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.operator_address": + value := x.OperatorAddress + return protoreflect.ValueOfString(value) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.old_cons_pubkey": + value := x.OldConsPubkey + return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.new_cons_pubkey": + value := x.NewConsPubkey + return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.height": + value := x.Height + return protoreflect.ValueOfUint64(value) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.fee": + value := x.Fee + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ConsPubKeyRotationHistory")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ConsPubKeyRotationHistory does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ConsPubKeyRotationHistory) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.operator_address": + x.OperatorAddress = value.Interface().(string) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.old_cons_pubkey": + x.OldConsPubkey = value.Message().Interface().(*anypb.Any) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.new_cons_pubkey": + x.NewConsPubkey = value.Message().Interface().(*anypb.Any) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.height": + x.Height = value.Uint() + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.fee": + x.Fee = value.Message().Interface().(*v1beta1.Coin) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ConsPubKeyRotationHistory")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ConsPubKeyRotationHistory does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ConsPubKeyRotationHistory) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.old_cons_pubkey": + if x.OldConsPubkey == nil { + x.OldConsPubkey = new(anypb.Any) + } + return protoreflect.ValueOfMessage(x.OldConsPubkey.ProtoReflect()) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.new_cons_pubkey": + if x.NewConsPubkey == nil { + x.NewConsPubkey = new(anypb.Any) + } + return protoreflect.ValueOfMessage(x.NewConsPubkey.ProtoReflect()) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.fee": + if x.Fee == nil { + x.Fee = new(v1beta1.Coin) + } + return protoreflect.ValueOfMessage(x.Fee.ProtoReflect()) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.operator_address": + panic(fmt.Errorf("field operator_address of message cosmos.staking.v1beta1.ConsPubKeyRotationHistory is not mutable")) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.height": + panic(fmt.Errorf("field height of message cosmos.staking.v1beta1.ConsPubKeyRotationHistory is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ConsPubKeyRotationHistory")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ConsPubKeyRotationHistory does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_ConsPubKeyRotationHistory) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.operator_address": + return protoreflect.ValueOfString("") + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.old_cons_pubkey": + m := new(anypb.Any) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.new_cons_pubkey": + m := new(anypb.Any) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.height": + return protoreflect.ValueOfUint64(uint64(0)) + case "cosmos.staking.v1beta1.ConsPubKeyRotationHistory.fee": + m := new(v1beta1.Coin) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ConsPubKeyRotationHistory")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ConsPubKeyRotationHistory does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_ConsPubKeyRotationHistory) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.staking.v1beta1.ConsPubKeyRotationHistory", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_ConsPubKeyRotationHistory) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ConsPubKeyRotationHistory) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_ConsPubKeyRotationHistory) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_ConsPubKeyRotationHistory) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*ConsPubKeyRotationHistory) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.OperatorAddress) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.OldConsPubkey != nil { + l = options.Size(x.OldConsPubkey) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.NewConsPubkey != nil { + l = options.Size(x.NewConsPubkey) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.Height != 0 { + n += 1 + runtime.Sov(uint64(x.Height)) + } + if x.Fee != nil { + l = options.Size(x.Fee) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*ConsPubKeyRotationHistory) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.Fee != nil { + encoded, err := options.Marshal(x.Fee) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x2a + } + if x.Height != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.Height)) + i-- + dAtA[i] = 0x20 + } + if x.NewConsPubkey != nil { + encoded, err := options.Marshal(x.NewConsPubkey) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x1a + } + if x.OldConsPubkey != nil { + encoded, err := options.Marshal(x.OldConsPubkey) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x12 + } + if len(x.OperatorAddress) > 0 { + i -= len(x.OperatorAddress) + copy(dAtA[i:], x.OperatorAddress) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.OperatorAddress))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*ConsPubKeyRotationHistory) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: ConsPubKeyRotationHistory: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: ConsPubKeyRotationHistory: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field OperatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.OperatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field OldConsPubkey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.OldConsPubkey == nil { + x.OldConsPubkey = &anypb.Any{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.OldConsPubkey); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field NewConsPubkey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.NewConsPubkey == nil { + x.NewConsPubkey = &anypb.Any{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.NewConsPubkey); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + } + x.Height = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.Height |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Fee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.Fee == nil { + x.Fee = &v1beta1.Coin{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Fee); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var _ protoreflect.List = (*_ValAddrsOfRotatedConsKeys_1_list)(nil) + +type _ValAddrsOfRotatedConsKeys_1_list struct { + list *[]string +} + +func (x *_ValAddrsOfRotatedConsKeys_1_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_ValAddrsOfRotatedConsKeys_1_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfString((*x.list)[i]) +} + +func (x *_ValAddrsOfRotatedConsKeys_1_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + (*x.list)[i] = concreteValue +} + +func (x *_ValAddrsOfRotatedConsKeys_1_list) Append(value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + *x.list = append(*x.list, concreteValue) +} + +func (x *_ValAddrsOfRotatedConsKeys_1_list) AppendMutable() protoreflect.Value { + panic(fmt.Errorf("AppendMutable can not be called on message ValAddrsOfRotatedConsKeys at list field Addresses as it is not of Message kind")) +} + +func (x *_ValAddrsOfRotatedConsKeys_1_list) Truncate(n int) { + *x.list = (*x.list)[:n] +} + +func (x *_ValAddrsOfRotatedConsKeys_1_list) NewElement() protoreflect.Value { + v := "" + return protoreflect.ValueOfString(v) +} + +func (x *_ValAddrsOfRotatedConsKeys_1_list) IsValid() bool { + return x.list != nil +} + +var ( + md_ValAddrsOfRotatedConsKeys protoreflect.MessageDescriptor + fd_ValAddrsOfRotatedConsKeys_addresses protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_staking_v1beta1_staking_proto_init() + md_ValAddrsOfRotatedConsKeys = File_cosmos_staking_v1beta1_staking_proto.Messages().ByName("ValAddrsOfRotatedConsKeys") + fd_ValAddrsOfRotatedConsKeys_addresses = md_ValAddrsOfRotatedConsKeys.Fields().ByName("addresses") +} + +var _ protoreflect.Message = (*fastReflection_ValAddrsOfRotatedConsKeys)(nil) + +type fastReflection_ValAddrsOfRotatedConsKeys ValAddrsOfRotatedConsKeys + +func (x *ValAddrsOfRotatedConsKeys) ProtoReflect() protoreflect.Message { + return (*fastReflection_ValAddrsOfRotatedConsKeys)(x) +} + +func (x *ValAddrsOfRotatedConsKeys) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_ValAddrsOfRotatedConsKeys_messageType fastReflection_ValAddrsOfRotatedConsKeys_messageType +var _ protoreflect.MessageType = fastReflection_ValAddrsOfRotatedConsKeys_messageType{} + +type fastReflection_ValAddrsOfRotatedConsKeys_messageType struct{} + +func (x fastReflection_ValAddrsOfRotatedConsKeys_messageType) Zero() protoreflect.Message { + return (*fastReflection_ValAddrsOfRotatedConsKeys)(nil) +} +func (x fastReflection_ValAddrsOfRotatedConsKeys_messageType) New() protoreflect.Message { + return new(fastReflection_ValAddrsOfRotatedConsKeys) +} +func (x fastReflection_ValAddrsOfRotatedConsKeys_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_ValAddrsOfRotatedConsKeys +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) Descriptor() protoreflect.MessageDescriptor { + return md_ValAddrsOfRotatedConsKeys +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) Type() protoreflect.MessageType { + return _fastReflection_ValAddrsOfRotatedConsKeys_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) New() protoreflect.Message { + return new(fastReflection_ValAddrsOfRotatedConsKeys) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) Interface() protoreflect.ProtoMessage { + return (*ValAddrsOfRotatedConsKeys)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Addresses) != 0 { + value := protoreflect.ValueOfList(&_ValAddrsOfRotatedConsKeys_1_list{list: &x.Addresses}) + if !f(fd_ValAddrsOfRotatedConsKeys_addresses, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys.addresses": + return len(x.Addresses) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys.addresses": + x.Addresses = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys.addresses": + if len(x.Addresses) == 0 { + return protoreflect.ValueOfList(&_ValAddrsOfRotatedConsKeys_1_list{}) + } + listValue := &_ValAddrsOfRotatedConsKeys_1_list{list: &x.Addresses} + return protoreflect.ValueOfList(listValue) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys.addresses": + lv := value.List() + clv := lv.(*_ValAddrsOfRotatedConsKeys_1_list) + x.Addresses = *clv.list + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys.addresses": + if x.Addresses == nil { + x.Addresses = []string{} + } + value := &_ValAddrsOfRotatedConsKeys_1_list{list: &x.Addresses} + return protoreflect.ValueOfList(value) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys.addresses": + list := []string{} + return protoreflect.ValueOfList(&_ValAddrsOfRotatedConsKeys_1_list{list: &list}) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_ValAddrsOfRotatedConsKeys) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*ValAddrsOfRotatedConsKeys) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if len(x.Addresses) > 0 { + for _, s := range x.Addresses { + l = len(s) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*ValAddrsOfRotatedConsKeys) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.Addresses) > 0 { + for iNdEx := len(x.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(x.Addresses[iNdEx]) + copy(dAtA[i:], x.Addresses[iNdEx]) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Addresses[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*ValAddrsOfRotatedConsKeys) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: ValAddrsOfRotatedConsKeys: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: ValAddrsOfRotatedConsKeys: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Addresses = append(x.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: cosmos/staking/v1beta1/staking.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// BondStatus is the status of a validator. +type BondStatus int32 + +const ( + // UNSPECIFIED defines an invalid validator status. + BondStatus_BOND_STATUS_UNSPECIFIED BondStatus = 0 + // UNBONDED defines a validator that is not bonded. + BondStatus_BOND_STATUS_UNBONDED BondStatus = 1 + // UNBONDING defines a validator that is unbonding. + BondStatus_BOND_STATUS_UNBONDING BondStatus = 2 + // BONDED defines a validator that is bonded. + BondStatus_BOND_STATUS_BONDED BondStatus = 3 +) + +// Enum value maps for BondStatus. +var ( + BondStatus_name = map[int32]string{ + 0: "BOND_STATUS_UNSPECIFIED", + 1: "BOND_STATUS_UNBONDED", + 2: "BOND_STATUS_UNBONDING", + 3: "BOND_STATUS_BONDED", + } + BondStatus_value = map[string]int32{ + "BOND_STATUS_UNSPECIFIED": 0, + "BOND_STATUS_UNBONDED": 1, + "BOND_STATUS_UNBONDING": 2, + "BOND_STATUS_BONDED": 3, + } +) + +func (x BondStatus) Enum() *BondStatus { + p := new(BondStatus) + *p = x + return p +} + +func (x BondStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BondStatus) Descriptor() protoreflect.EnumDescriptor { + return file_cosmos_staking_v1beta1_staking_proto_enumTypes[0].Descriptor() +} + +func (BondStatus) Type() protoreflect.EnumType { + return &file_cosmos_staking_v1beta1_staking_proto_enumTypes[0] +} + +func (x BondStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BondStatus.Descriptor instead. +func (BondStatus) EnumDescriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{0} +} + +// Infraction indicates the infraction a validator commited. +type Infraction int32 + +const ( + // UNSPECIFIED defines an empty infraction. + Infraction_INFRACTION_UNSPECIFIED Infraction = 0 + // DOUBLE_SIGN defines a validator that double-signs a block. + Infraction_INFRACTION_DOUBLE_SIGN Infraction = 1 + // DOWNTIME defines a validator that missed signing too many blocks. + Infraction_INFRACTION_DOWNTIME Infraction = 2 +) + +// Enum value maps for Infraction. +var ( + Infraction_name = map[int32]string{ + 0: "INFRACTION_UNSPECIFIED", + 1: "INFRACTION_DOUBLE_SIGN", + 2: "INFRACTION_DOWNTIME", + } + Infraction_value = map[string]int32{ + "INFRACTION_UNSPECIFIED": 0, + "INFRACTION_DOUBLE_SIGN": 1, + "INFRACTION_DOWNTIME": 2, + } +) + +func (x Infraction) Enum() *Infraction { + p := new(Infraction) + *p = x + return p +} + +func (x Infraction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Infraction) Descriptor() protoreflect.EnumDescriptor { + return file_cosmos_staking_v1beta1_staking_proto_enumTypes[1].Descriptor() +} + +func (Infraction) Type() protoreflect.EnumType { + return &file_cosmos_staking_v1beta1_staking_proto_enumTypes[1] +} + +func (x Infraction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Infraction.Descriptor instead. +func (Infraction) EnumDescriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{1} +} + +// HistoricalInfo contains header and validator information for a given block. +// It is stored as part of staking module's state, which persists the `n` most +// recent HistoricalInfo +// (`n` is set by the staking module's `historical_entries` parameter). +type HistoricalInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header *types.Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` + Valset []*Validator `protobuf:"bytes,2,rep,name=valset,proto3" json:"valset,omitempty"` +} + +func (x *HistoricalInfo) Reset() { + *x = HistoricalInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HistoricalInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoricalInfo) ProtoMessage() {} + +// Deprecated: Use HistoricalInfo.ProtoReflect.Descriptor instead. +func (*HistoricalInfo) Descriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{0} +} + +func (x *HistoricalInfo) GetHeader() *types.Header { + if x != nil { + return x.Header + } + return nil +} + +func (x *HistoricalInfo) GetValset() []*Validator { + if x != nil { + return x.Valset + } + return nil +} + +// CommissionRates defines the initial commission rates to be used for creating // a validator. type CommissionRates struct { state protoimpl.MessageState @@ -13747,6 +15011,9 @@ type Params struct { BondDenom string `protobuf:"bytes,5,opt,name=bond_denom,json=bondDenom,proto3" json:"bond_denom,omitempty"` // min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators MinCommissionRate string `protobuf:"bytes,6,opt,name=min_commission_rate,json=minCommissionRate,proto3" json:"min_commission_rate,omitempty"` + // key_rotation_fee is fee to be spent when rotating validator's key + // (either consensus pubkey or operator key) + KeyRotationFee *v1beta1.Coin `protobuf:"bytes,7,opt,name=key_rotation_fee,json=keyRotationFee,proto3" json:"key_rotation_fee,omitempty"` } func (x *Params) Reset() { @@ -13811,6 +15078,13 @@ func (x *Params) GetMinCommissionRate() string { return "" } +func (x *Params) GetKeyRotationFee() *v1beta1.Coin { + if x != nil { + return x.KeyRotationFee + } + return nil +} + // DelegationResponse is equivalent to Delegation except that it contains a // balance in addition to shares which is more suitable for client responses. type DelegationResponse struct { @@ -14030,6 +15304,116 @@ func (x *ValidatorUpdates) GetUpdates() []*abci.ValidatorUpdate { return nil } +// ConsPubKeyRotationHistory contains a validator's consensus public key rotation history. +type ConsPubKeyRotationHistory struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // operator_address defines the address of the validator's operator; bech encoded in JSON. + OperatorAddress string `protobuf:"bytes,1,opt,name=operator_address,json=operatorAddress,proto3" json:"operator_address,omitempty"` + // old_cons_pubkey is the old consensus public key of the validator, as a Protobuf Any. + OldConsPubkey *anypb.Any `protobuf:"bytes,2,opt,name=old_cons_pubkey,json=oldConsPubkey,proto3" json:"old_cons_pubkey,omitempty"` + // new_cons_pubkey is the new consensus public key of the validator, as a Protobuf Any. + NewConsPubkey *anypb.Any `protobuf:"bytes,3,opt,name=new_cons_pubkey,json=newConsPubkey,proto3" json:"new_cons_pubkey,omitempty"` + // height defines the block height at which the rotation event occured. + Height uint64 `protobuf:"varint,4,opt,name=height,proto3" json:"height,omitempty"` + // fee holds the amount of fee deduced for the rotation. + Fee *v1beta1.Coin `protobuf:"bytes,5,opt,name=fee,proto3" json:"fee,omitempty"` +} + +func (x *ConsPubKeyRotationHistory) Reset() { + *x = ConsPubKeyRotationHistory{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConsPubKeyRotationHistory) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConsPubKeyRotationHistory) ProtoMessage() {} + +// Deprecated: Use ConsPubKeyRotationHistory.ProtoReflect.Descriptor instead. +func (*ConsPubKeyRotationHistory) Descriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{21} +} + +func (x *ConsPubKeyRotationHistory) GetOperatorAddress() string { + if x != nil { + return x.OperatorAddress + } + return "" +} + +func (x *ConsPubKeyRotationHistory) GetOldConsPubkey() *anypb.Any { + if x != nil { + return x.OldConsPubkey + } + return nil +} + +func (x *ConsPubKeyRotationHistory) GetNewConsPubkey() *anypb.Any { + if x != nil { + return x.NewConsPubkey + } + return nil +} + +func (x *ConsPubKeyRotationHistory) GetHeight() uint64 { + if x != nil { + return x.Height + } + return 0 +} + +func (x *ConsPubKeyRotationHistory) GetFee() *v1beta1.Coin { + if x != nil { + return x.Fee + } + return nil +} + +// ValAddrsOfRotatedConsKeys contains the array of validator addresses which rotated their keys +// This is to block the validator's next rotation till unbonding period. +type ValAddrsOfRotatedConsKeys struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Addresses []string `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (x *ValAddrsOfRotatedConsKeys) Reset() { + *x = ValAddrsOfRotatedConsKeys{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValAddrsOfRotatedConsKeys) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValAddrsOfRotatedConsKeys) ProtoMessage() {} + +// Deprecated: Use ValAddrsOfRotatedConsKeys.ProtoReflect.Descriptor instead. +func (*ValAddrsOfRotatedConsKeys) Descriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{22} +} + +func (x *ValAddrsOfRotatedConsKeys) GetAddresses() []string { + if x != nil { + return x.Addresses + } + return nil +} + var File_cosmos_staking_v1beta1_staking_proto protoreflect.FileDescriptor var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ @@ -14314,7 +15698,7 @@ var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x3a, 0x08, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, - 0xa7, 0x03, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x75, 0x6e, + 0xf7, 0x03, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0xc8, @@ -14338,7 +15722,12 @@ var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x22, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x61, 0x74, 0x65, 0x3a, 0x24, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x1b, 0x63, 0x6f, + 0x61, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x69, 0x6e, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, + 0xb0, 0x2a, 0x01, 0x52, 0x0e, 0x6b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x46, 0x65, 0x65, 0x3a, 0x24, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x1b, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x78, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, @@ -14400,39 +15789,68 @@ var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x61, 0x62, 0x63, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, - 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x2a, 0xb6, - 0x01, 0x0a, 0x0a, 0x42, 0x6f, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x0a, - 0x17, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x1a, 0x0f, 0x8a, 0x9d, 0x20, 0x0b, - 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x14, 0x42, - 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x42, 0x4f, 0x4e, - 0x44, 0x45, 0x44, 0x10, 0x01, 0x1a, 0x0c, 0x8a, 0x9d, 0x20, 0x08, 0x55, 0x6e, 0x62, 0x6f, 0x6e, - 0x64, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x15, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x42, 0x4f, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x1a, 0x0d, - 0x8a, 0x9d, 0x20, 0x09, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x22, 0x0a, - 0x12, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x4f, 0x4e, - 0x44, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x0a, 0x8a, 0x9d, 0x20, 0x06, 0x42, 0x6f, 0x6e, 0x64, 0x65, - 0x64, 0x1a, 0x04, 0x88, 0xa3, 0x1e, 0x00, 0x2a, 0x5d, 0x0a, 0x0a, 0x49, 0x6e, 0x66, 0x72, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x10, 0x01, 0x12, 0x17, 0x0a, - 0x13, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4f, 0x57, 0x4e, - 0x54, 0x49, 0x4d, 0x45, 0x10, 0x02, 0x42, 0xdc, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, - 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x73, - 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b, 0x73, - 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, 0x02, 0x03, - 0x43, 0x53, 0x58, 0xaa, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x61, - 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x16, 0x43, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x22, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x53, - 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, - 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x43, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0xed, + 0x02, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x10, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1b, 0xf2, 0xde, 0x1f, 0x17, 0x79, 0x61, 0x6d, 0x6c, + 0x3a, 0x22, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x22, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x56, 0x0a, 0x0f, 0x6f, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x73, + 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x41, 0x6e, 0x79, 0x42, 0x18, 0xca, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x6f, + 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x73, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x56, 0x0a, 0x0f, + 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x42, 0x18, 0xca, 0xb4, 0x2d, + 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x50, + 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6e, 0x73, 0x50, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x36, 0x0a, 0x03, + 0x66, 0x65, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x43, 0x6f, 0x69, 0x6e, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, + 0x03, 0x66, 0x65, 0x65, 0x3a, 0x08, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0x53, + 0x0a, 0x19, 0x56, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x73, 0x4f, 0x66, 0x52, 0x6f, 0x74, 0x61, + 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x18, + 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x2a, 0xb6, 0x01, 0x0a, 0x0a, 0x42, 0x6f, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2c, 0x0a, 0x17, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x1a, + 0x0f, 0x8a, 0x9d, 0x20, 0x0b, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x12, 0x26, 0x0a, 0x14, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x55, 0x4e, 0x42, 0x4f, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x01, 0x1a, 0x0c, 0x8a, 0x9d, 0x20, 0x08, + 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x15, 0x42, 0x4f, 0x4e, 0x44, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x42, 0x4f, 0x4e, 0x44, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x1a, 0x0d, 0x8a, 0x9d, 0x20, 0x09, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x12, 0x22, 0x0a, 0x12, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x0a, 0x8a, 0x9d, 0x20, 0x06, + 0x42, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x1a, 0x04, 0x88, 0xa3, 0x1e, 0x00, 0x2a, 0x5d, 0x0a, 0x0a, + 0x49, 0x6e, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, + 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, + 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x02, 0x42, 0xdc, 0x01, 0x0a, 0x1a, + 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0c, 0x53, 0x74, 0x61, 0x6b, + 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x3b, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x53, 0x58, 0xaa, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0xca, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, + 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x22, 0x43, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x18, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, + 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -14448,7 +15866,7 @@ func file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP() []byte { } var file_cosmos_staking_v1beta1_staking_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_cosmos_staking_v1beta1_staking_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_cosmos_staking_v1beta1_staking_proto_msgTypes = make([]protoimpl.MessageInfo, 23) var file_cosmos_staking_v1beta1_staking_proto_goTypes = []interface{}{ (BondStatus)(0), // 0: cosmos.staking.v1beta1.BondStatus (Infraction)(0), // 1: cosmos.staking.v1beta1.Infraction @@ -14473,41 +15891,47 @@ var file_cosmos_staking_v1beta1_staking_proto_goTypes = []interface{}{ (*RedelegationResponse)(nil), // 20: cosmos.staking.v1beta1.RedelegationResponse (*Pool)(nil), // 21: cosmos.staking.v1beta1.Pool (*ValidatorUpdates)(nil), // 22: cosmos.staking.v1beta1.ValidatorUpdates - (*types.Header)(nil), // 23: tendermint.types.Header - (*timestamppb.Timestamp)(nil), // 24: google.protobuf.Timestamp - (*anypb.Any)(nil), // 25: google.protobuf.Any - (*durationpb.Duration)(nil), // 26: google.protobuf.Duration - (*v1beta1.Coin)(nil), // 27: cosmos.base.v1beta1.Coin - (*abci.ValidatorUpdate)(nil), // 28: tendermint.abci.ValidatorUpdate + (*ConsPubKeyRotationHistory)(nil), // 23: cosmos.staking.v1beta1.ConsPubKeyRotationHistory + (*ValAddrsOfRotatedConsKeys)(nil), // 24: cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys + (*types.Header)(nil), // 25: tendermint.types.Header + (*timestamppb.Timestamp)(nil), // 26: google.protobuf.Timestamp + (*anypb.Any)(nil), // 27: google.protobuf.Any + (*durationpb.Duration)(nil), // 28: google.protobuf.Duration + (*v1beta1.Coin)(nil), // 29: cosmos.base.v1beta1.Coin + (*abci.ValidatorUpdate)(nil), // 30: tendermint.abci.ValidatorUpdate } var file_cosmos_staking_v1beta1_staking_proto_depIdxs = []int32{ - 23, // 0: cosmos.staking.v1beta1.HistoricalInfo.header:type_name -> tendermint.types.Header + 25, // 0: cosmos.staking.v1beta1.HistoricalInfo.header:type_name -> tendermint.types.Header 6, // 1: cosmos.staking.v1beta1.HistoricalInfo.valset:type_name -> cosmos.staking.v1beta1.Validator 3, // 2: cosmos.staking.v1beta1.Commission.commission_rates:type_name -> cosmos.staking.v1beta1.CommissionRates - 24, // 3: cosmos.staking.v1beta1.Commission.update_time:type_name -> google.protobuf.Timestamp - 25, // 4: cosmos.staking.v1beta1.Validator.consensus_pubkey:type_name -> google.protobuf.Any + 26, // 3: cosmos.staking.v1beta1.Commission.update_time:type_name -> google.protobuf.Timestamp + 27, // 4: cosmos.staking.v1beta1.Validator.consensus_pubkey:type_name -> google.protobuf.Any 0, // 5: cosmos.staking.v1beta1.Validator.status:type_name -> cosmos.staking.v1beta1.BondStatus 5, // 6: cosmos.staking.v1beta1.Validator.description:type_name -> cosmos.staking.v1beta1.Description - 24, // 7: cosmos.staking.v1beta1.Validator.unbonding_time:type_name -> google.protobuf.Timestamp + 26, // 7: cosmos.staking.v1beta1.Validator.unbonding_time:type_name -> google.protobuf.Timestamp 4, // 8: cosmos.staking.v1beta1.Validator.commission:type_name -> cosmos.staking.v1beta1.Commission 8, // 9: cosmos.staking.v1beta1.DVPairs.pairs:type_name -> cosmos.staking.v1beta1.DVPair 10, // 10: cosmos.staking.v1beta1.DVVTriplets.triplets:type_name -> cosmos.staking.v1beta1.DVVTriplet 14, // 11: cosmos.staking.v1beta1.UnbondingDelegation.entries:type_name -> cosmos.staking.v1beta1.UnbondingDelegationEntry - 24, // 12: cosmos.staking.v1beta1.UnbondingDelegationEntry.completion_time:type_name -> google.protobuf.Timestamp - 24, // 13: cosmos.staking.v1beta1.RedelegationEntry.completion_time:type_name -> google.protobuf.Timestamp + 26, // 12: cosmos.staking.v1beta1.UnbondingDelegationEntry.completion_time:type_name -> google.protobuf.Timestamp + 26, // 13: cosmos.staking.v1beta1.RedelegationEntry.completion_time:type_name -> google.protobuf.Timestamp 15, // 14: cosmos.staking.v1beta1.Redelegation.entries:type_name -> cosmos.staking.v1beta1.RedelegationEntry - 26, // 15: cosmos.staking.v1beta1.Params.unbonding_time:type_name -> google.protobuf.Duration - 12, // 16: cosmos.staking.v1beta1.DelegationResponse.delegation:type_name -> cosmos.staking.v1beta1.Delegation - 27, // 17: cosmos.staking.v1beta1.DelegationResponse.balance:type_name -> cosmos.base.v1beta1.Coin - 15, // 18: cosmos.staking.v1beta1.RedelegationEntryResponse.redelegation_entry:type_name -> cosmos.staking.v1beta1.RedelegationEntry - 16, // 19: cosmos.staking.v1beta1.RedelegationResponse.redelegation:type_name -> cosmos.staking.v1beta1.Redelegation - 19, // 20: cosmos.staking.v1beta1.RedelegationResponse.entries:type_name -> cosmos.staking.v1beta1.RedelegationEntryResponse - 28, // 21: cosmos.staking.v1beta1.ValidatorUpdates.updates:type_name -> tendermint.abci.ValidatorUpdate - 22, // [22:22] is the sub-list for method output_type - 22, // [22:22] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 28, // 15: cosmos.staking.v1beta1.Params.unbonding_time:type_name -> google.protobuf.Duration + 29, // 16: cosmos.staking.v1beta1.Params.key_rotation_fee:type_name -> cosmos.base.v1beta1.Coin + 12, // 17: cosmos.staking.v1beta1.DelegationResponse.delegation:type_name -> cosmos.staking.v1beta1.Delegation + 29, // 18: cosmos.staking.v1beta1.DelegationResponse.balance:type_name -> cosmos.base.v1beta1.Coin + 15, // 19: cosmos.staking.v1beta1.RedelegationEntryResponse.redelegation_entry:type_name -> cosmos.staking.v1beta1.RedelegationEntry + 16, // 20: cosmos.staking.v1beta1.RedelegationResponse.redelegation:type_name -> cosmos.staking.v1beta1.Redelegation + 19, // 21: cosmos.staking.v1beta1.RedelegationResponse.entries:type_name -> cosmos.staking.v1beta1.RedelegationEntryResponse + 30, // 22: cosmos.staking.v1beta1.ValidatorUpdates.updates:type_name -> tendermint.abci.ValidatorUpdate + 27, // 23: cosmos.staking.v1beta1.ConsPubKeyRotationHistory.old_cons_pubkey:type_name -> google.protobuf.Any + 27, // 24: cosmos.staking.v1beta1.ConsPubKeyRotationHistory.new_cons_pubkey:type_name -> google.protobuf.Any + 29, // 25: cosmos.staking.v1beta1.ConsPubKeyRotationHistory.fee:type_name -> cosmos.base.v1beta1.Coin + 26, // [26:26] is the sub-list for method output_type + 26, // [26:26] is the sub-list for method input_type + 26, // [26:26] is the sub-list for extension type_name + 26, // [26:26] is the sub-list for extension extendee + 0, // [0:26] is the sub-list for field type_name } func init() { file_cosmos_staking_v1beta1_staking_proto_init() } @@ -14768,6 +16192,30 @@ func file_cosmos_staking_v1beta1_staking_proto_init() { return nil } } + file_cosmos_staking_v1beta1_staking_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConsPubKeyRotationHistory); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cosmos_staking_v1beta1_staking_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValAddrsOfRotatedConsKeys); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -14775,7 +16223,7 @@ func file_cosmos_staking_v1beta1_staking_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cosmos_staking_v1beta1_staking_proto_rawDesc, NumEnums: 2, - NumMessages: 21, + NumMessages: 23, NumExtensions: 0, NumServices: 0, }, diff --git a/api/cosmos/staking/v1beta1/tx.pulsar.go b/api/cosmos/staking/v1beta1/tx.pulsar.go index 39cb6d1aca38..f3d7e30fac11 100644 --- a/api/cosmos/staking/v1beta1/tx.pulsar.go +++ b/api/cosmos/staking/v1beta1/tx.pulsar.go @@ -7102,6 +7102,861 @@ func (x *fastReflection_MsgUpdateParamsResponse) ProtoMethods() *protoiface.Meth } } +var ( + md_MsgRotateConsPubKey protoreflect.MessageDescriptor + fd_MsgRotateConsPubKey_validator_address protoreflect.FieldDescriptor + fd_MsgRotateConsPubKey_new_pubkey protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_staking_v1beta1_tx_proto_init() + md_MsgRotateConsPubKey = File_cosmos_staking_v1beta1_tx_proto.Messages().ByName("MsgRotateConsPubKey") + fd_MsgRotateConsPubKey_validator_address = md_MsgRotateConsPubKey.Fields().ByName("validator_address") + fd_MsgRotateConsPubKey_new_pubkey = md_MsgRotateConsPubKey.Fields().ByName("new_pubkey") +} + +var _ protoreflect.Message = (*fastReflection_MsgRotateConsPubKey)(nil) + +type fastReflection_MsgRotateConsPubKey MsgRotateConsPubKey + +func (x *MsgRotateConsPubKey) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgRotateConsPubKey)(x) +} + +func (x *MsgRotateConsPubKey) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_staking_v1beta1_tx_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_MsgRotateConsPubKey_messageType fastReflection_MsgRotateConsPubKey_messageType +var _ protoreflect.MessageType = fastReflection_MsgRotateConsPubKey_messageType{} + +type fastReflection_MsgRotateConsPubKey_messageType struct{} + +func (x fastReflection_MsgRotateConsPubKey_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgRotateConsPubKey)(nil) +} +func (x fastReflection_MsgRotateConsPubKey_messageType) New() protoreflect.Message { + return new(fastReflection_MsgRotateConsPubKey) +} +func (x fastReflection_MsgRotateConsPubKey_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgRotateConsPubKey +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgRotateConsPubKey) Descriptor() protoreflect.MessageDescriptor { + return md_MsgRotateConsPubKey +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgRotateConsPubKey) Type() protoreflect.MessageType { + return _fastReflection_MsgRotateConsPubKey_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgRotateConsPubKey) New() protoreflect.Message { + return new(fastReflection_MsgRotateConsPubKey) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgRotateConsPubKey) Interface() protoreflect.ProtoMessage { + return (*MsgRotateConsPubKey)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgRotateConsPubKey) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.ValidatorAddress != "" { + value := protoreflect.ValueOfString(x.ValidatorAddress) + if !f(fd_MsgRotateConsPubKey_validator_address, value) { + return + } + } + if x.NewPubkey != nil { + value := protoreflect.ValueOfMessage(x.NewPubkey.ProtoReflect()) + if !f(fd_MsgRotateConsPubKey_new_pubkey, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgRotateConsPubKey) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.validator_address": + return x.ValidatorAddress != "" + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.new_pubkey": + return x.NewPubkey != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKey")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKey does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRotateConsPubKey) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.validator_address": + x.ValidatorAddress = "" + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.new_pubkey": + x.NewPubkey = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKey")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKey does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgRotateConsPubKey) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.validator_address": + value := x.ValidatorAddress + return protoreflect.ValueOfString(value) + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.new_pubkey": + value := x.NewPubkey + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKey")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKey does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRotateConsPubKey) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.validator_address": + x.ValidatorAddress = value.Interface().(string) + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.new_pubkey": + x.NewPubkey = value.Message().Interface().(*anypb.Any) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKey")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKey does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRotateConsPubKey) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.new_pubkey": + if x.NewPubkey == nil { + x.NewPubkey = new(anypb.Any) + } + return protoreflect.ValueOfMessage(x.NewPubkey.ProtoReflect()) + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.validator_address": + panic(fmt.Errorf("field validator_address of message cosmos.staking.v1beta1.MsgRotateConsPubKey is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKey")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKey does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgRotateConsPubKey) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.validator_address": + return protoreflect.ValueOfString("") + case "cosmos.staking.v1beta1.MsgRotateConsPubKey.new_pubkey": + m := new(anypb.Any) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKey")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKey does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgRotateConsPubKey) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.staking.v1beta1.MsgRotateConsPubKey", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgRotateConsPubKey) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRotateConsPubKey) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgRotateConsPubKey) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgRotateConsPubKey) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgRotateConsPubKey) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.ValidatorAddress) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.NewPubkey != nil { + l = options.Size(x.NewPubkey) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgRotateConsPubKey) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.NewPubkey != nil { + encoded, err := options.Marshal(x.NewPubkey) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x1a + } + if len(x.ValidatorAddress) > 0 { + i -= len(x.ValidatorAddress) + copy(dAtA[i:], x.ValidatorAddress) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ValidatorAddress))) + i-- + dAtA[i] = 0x12 + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgRotateConsPubKey) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgRotateConsPubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgRotateConsPubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field NewPubkey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.NewPubkey == nil { + x.NewPubkey = &anypb.Any{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.NewPubkey); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_MsgRotateConsPubKeyResponse protoreflect.MessageDescriptor +) + +func init() { + file_cosmos_staking_v1beta1_tx_proto_init() + md_MsgRotateConsPubKeyResponse = File_cosmos_staking_v1beta1_tx_proto.Messages().ByName("MsgRotateConsPubKeyResponse") +} + +var _ protoreflect.Message = (*fastReflection_MsgRotateConsPubKeyResponse)(nil) + +type fastReflection_MsgRotateConsPubKeyResponse MsgRotateConsPubKeyResponse + +func (x *MsgRotateConsPubKeyResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgRotateConsPubKeyResponse)(x) +} + +func (x *MsgRotateConsPubKeyResponse) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_staking_v1beta1_tx_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_MsgRotateConsPubKeyResponse_messageType fastReflection_MsgRotateConsPubKeyResponse_messageType +var _ protoreflect.MessageType = fastReflection_MsgRotateConsPubKeyResponse_messageType{} + +type fastReflection_MsgRotateConsPubKeyResponse_messageType struct{} + +func (x fastReflection_MsgRotateConsPubKeyResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgRotateConsPubKeyResponse)(nil) +} +func (x fastReflection_MsgRotateConsPubKeyResponse_messageType) New() protoreflect.Message { + return new(fastReflection_MsgRotateConsPubKeyResponse) +} +func (x fastReflection_MsgRotateConsPubKeyResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgRotateConsPubKeyResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgRotateConsPubKeyResponse) Descriptor() protoreflect.MessageDescriptor { + return md_MsgRotateConsPubKeyResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgRotateConsPubKeyResponse) Type() protoreflect.MessageType { + return _fastReflection_MsgRotateConsPubKeyResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgRotateConsPubKeyResponse) New() protoreflect.Message { + return new(fastReflection_MsgRotateConsPubKeyResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgRotateConsPubKeyResponse) Interface() protoreflect.ProtoMessage { + return (*MsgRotateConsPubKeyResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgRotateConsPubKeyResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgRotateConsPubKeyResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRotateConsPubKeyResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgRotateConsPubKeyResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRotateConsPubKeyResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRotateConsPubKeyResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgRotateConsPubKeyResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgRotateConsPubKeyResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgRotateConsPubKeyResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRotateConsPubKeyResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgRotateConsPubKeyResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgRotateConsPubKeyResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgRotateConsPubKeyResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgRotateConsPubKeyResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgRotateConsPubKeyResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgRotateConsPubKeyResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgRotateConsPubKeyResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.0 @@ -7773,6 +8628,82 @@ func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) { return file_cosmos_staking_v1beta1_tx_proto_rawDescGZIP(), []int{13} } +// MsgRotateConsPubKey is the Msg/RotateConsPubKey request type. +// +// Since: cosmos-sdk 0.48 +type MsgRotateConsPubKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` + NewPubkey *anypb.Any `protobuf:"bytes,3,opt,name=new_pubkey,json=newPubkey,proto3" json:"new_pubkey,omitempty"` +} + +func (x *MsgRotateConsPubKey) Reset() { + *x = MsgRotateConsPubKey{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_staking_v1beta1_tx_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgRotateConsPubKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgRotateConsPubKey) ProtoMessage() {} + +// Deprecated: Use MsgRotateConsPubKey.ProtoReflect.Descriptor instead. +func (*MsgRotateConsPubKey) Descriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_tx_proto_rawDescGZIP(), []int{14} +} + +func (x *MsgRotateConsPubKey) GetValidatorAddress() string { + if x != nil { + return x.ValidatorAddress + } + return "" +} + +func (x *MsgRotateConsPubKey) GetNewPubkey() *anypb.Any { + if x != nil { + return x.NewPubkey + } + return nil +} + +// MsgRotateConsPubKeyResponse defines the response structure for executing a +// MsgRotateConsPubKey message. +// +// Since: cosmos-sdk 0.48 +type MsgRotateConsPubKeyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MsgRotateConsPubKeyResponse) Reset() { + *x = MsgRotateConsPubKeyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_staking_v1beta1_tx_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgRotateConsPubKeyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgRotateConsPubKeyResponse) ProtoMessage() {} + +// Deprecated: Use MsgRotateConsPubKeyResponse.ProtoReflect.Descriptor instead. +func (*MsgRotateConsPubKeyResponse) Descriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_tx_proto_rawDescGZIP(), []int{15} +} + var File_cosmos_staking_v1beta1_tx_proto protoreflect.FileDescriptor var file_cosmos_staking_v1beta1_tx_proto_rawDesc = []byte{ @@ -7986,71 +8917,96 @@ var file_cosmos_staking_v1beta1_tx_proto_rawDesc = []byte{ 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2f, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x32, 0x9d, 0x06, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x71, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2a, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x1a, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x0d, 0x45, - 0x64, 0x69, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x28, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x64, 0x69, 0x74, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x1a, 0x30, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x4d, 0x73, 0x67, 0x45, 0x64, 0x69, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x08, 0x44, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, + 0x22, 0xf7, 0x01, 0x0a, 0x13, 0x4d, 0x73, 0x67, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x4e, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x21, 0xd2, 0xb4, 0x2d, 0x1d, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, + 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, + 0x6e, 0x79, 0x42, 0x18, 0xca, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x6e, 0x65, + 0x77, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x3a, 0x41, 0x88, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, + 0x00, 0x82, 0xe7, 0xb0, 0x2a, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x8a, 0xe7, 0xb0, 0x2a, 0x1e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x4d, 0x73, 0x67, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x1d, 0x0a, 0x1b, 0x4d, 0x73, + 0x67, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x93, 0x07, 0x0a, 0x03, 0x4d, 0x73, + 0x67, 0x12, 0x71, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2a, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, - 0x67, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x1a, 0x2b, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x0f, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x52, - 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x1a, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, + 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x1a, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x0d, 0x45, 0x64, 0x69, 0x74, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, - 0x73, 0x67, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0a, 0x55, 0x6e, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x1a, 0x2d, + 0x73, 0x67, 0x45, 0x64, 0x69, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x1a, + 0x30, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x64, 0x69, 0x74, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5c, 0x0a, 0x08, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x1a, 0x2b, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, + 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x44, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x71, 0x0a, 0x0f, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, + 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x42, + 0x65, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x1a, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x6e, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8f, 0x01, - 0x0a, 0x19, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x55, 0x6e, - 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x1a, 0x3c, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x68, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x65, 0x67, 0x69, 0x6e, + 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0a, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x12, 0x25, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x6e, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x1a, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x19, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, + 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, + 0x67, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3c, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x55, 0x6e, 0x62, + 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, - 0x42, 0xd7, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, - 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x3b, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x53, 0x58, 0xaa, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0xca, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, - 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x22, 0x43, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x18, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, - 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x73, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x74, 0x0a, 0x10, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, + 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x4d, 0x73, 0x67, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x50, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, + 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x67, + 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, + 0xd7, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, + 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x07, + 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x3b, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0xa2, 0x02, 0x03, 0x43, 0x53, 0x58, 0xaa, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0xca, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, + 0x67, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x22, 0x43, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x18, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, + 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -8065,7 +9021,7 @@ func file_cosmos_staking_v1beta1_tx_proto_rawDescGZIP() []byte { return file_cosmos_staking_v1beta1_tx_proto_rawDescData } -var file_cosmos_staking_v1beta1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_cosmos_staking_v1beta1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_cosmos_staking_v1beta1_tx_proto_goTypes = []interface{}{ (*MsgCreateValidator)(nil), // 0: cosmos.staking.v1beta1.MsgCreateValidator (*MsgCreateValidatorResponse)(nil), // 1: cosmos.staking.v1beta1.MsgCreateValidatorResponse @@ -8081,46 +9037,51 @@ var file_cosmos_staking_v1beta1_tx_proto_goTypes = []interface{}{ (*MsgCancelUnbondingDelegationResponse)(nil), // 11: cosmos.staking.v1beta1.MsgCancelUnbondingDelegationResponse (*MsgUpdateParams)(nil), // 12: cosmos.staking.v1beta1.MsgUpdateParams (*MsgUpdateParamsResponse)(nil), // 13: cosmos.staking.v1beta1.MsgUpdateParamsResponse - (*Description)(nil), // 14: cosmos.staking.v1beta1.Description - (*CommissionRates)(nil), // 15: cosmos.staking.v1beta1.CommissionRates - (*anypb.Any)(nil), // 16: google.protobuf.Any - (*v1beta1.Coin)(nil), // 17: cosmos.base.v1beta1.Coin - (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp - (*Params)(nil), // 19: cosmos.staking.v1beta1.Params + (*MsgRotateConsPubKey)(nil), // 14: cosmos.staking.v1beta1.MsgRotateConsPubKey + (*MsgRotateConsPubKeyResponse)(nil), // 15: cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse + (*Description)(nil), // 16: cosmos.staking.v1beta1.Description + (*CommissionRates)(nil), // 17: cosmos.staking.v1beta1.CommissionRates + (*anypb.Any)(nil), // 18: google.protobuf.Any + (*v1beta1.Coin)(nil), // 19: cosmos.base.v1beta1.Coin + (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp + (*Params)(nil), // 21: cosmos.staking.v1beta1.Params } var file_cosmos_staking_v1beta1_tx_proto_depIdxs = []int32{ - 14, // 0: cosmos.staking.v1beta1.MsgCreateValidator.description:type_name -> cosmos.staking.v1beta1.Description - 15, // 1: cosmos.staking.v1beta1.MsgCreateValidator.commission:type_name -> cosmos.staking.v1beta1.CommissionRates - 16, // 2: cosmos.staking.v1beta1.MsgCreateValidator.pubkey:type_name -> google.protobuf.Any - 17, // 3: cosmos.staking.v1beta1.MsgCreateValidator.value:type_name -> cosmos.base.v1beta1.Coin - 14, // 4: cosmos.staking.v1beta1.MsgEditValidator.description:type_name -> cosmos.staking.v1beta1.Description - 17, // 5: cosmos.staking.v1beta1.MsgDelegate.amount:type_name -> cosmos.base.v1beta1.Coin - 17, // 6: cosmos.staking.v1beta1.MsgBeginRedelegate.amount:type_name -> cosmos.base.v1beta1.Coin - 18, // 7: cosmos.staking.v1beta1.MsgBeginRedelegateResponse.completion_time:type_name -> google.protobuf.Timestamp - 17, // 8: cosmos.staking.v1beta1.MsgUndelegate.amount:type_name -> cosmos.base.v1beta1.Coin - 18, // 9: cosmos.staking.v1beta1.MsgUndelegateResponse.completion_time:type_name -> google.protobuf.Timestamp - 17, // 10: cosmos.staking.v1beta1.MsgUndelegateResponse.amount:type_name -> cosmos.base.v1beta1.Coin - 17, // 11: cosmos.staking.v1beta1.MsgCancelUnbondingDelegation.amount:type_name -> cosmos.base.v1beta1.Coin - 19, // 12: cosmos.staking.v1beta1.MsgUpdateParams.params:type_name -> cosmos.staking.v1beta1.Params - 0, // 13: cosmos.staking.v1beta1.Msg.CreateValidator:input_type -> cosmos.staking.v1beta1.MsgCreateValidator - 2, // 14: cosmos.staking.v1beta1.Msg.EditValidator:input_type -> cosmos.staking.v1beta1.MsgEditValidator - 4, // 15: cosmos.staking.v1beta1.Msg.Delegate:input_type -> cosmos.staking.v1beta1.MsgDelegate - 6, // 16: cosmos.staking.v1beta1.Msg.BeginRedelegate:input_type -> cosmos.staking.v1beta1.MsgBeginRedelegate - 8, // 17: cosmos.staking.v1beta1.Msg.Undelegate:input_type -> cosmos.staking.v1beta1.MsgUndelegate - 10, // 18: cosmos.staking.v1beta1.Msg.CancelUnbondingDelegation:input_type -> cosmos.staking.v1beta1.MsgCancelUnbondingDelegation - 12, // 19: cosmos.staking.v1beta1.Msg.UpdateParams:input_type -> cosmos.staking.v1beta1.MsgUpdateParams - 1, // 20: cosmos.staking.v1beta1.Msg.CreateValidator:output_type -> cosmos.staking.v1beta1.MsgCreateValidatorResponse - 3, // 21: cosmos.staking.v1beta1.Msg.EditValidator:output_type -> cosmos.staking.v1beta1.MsgEditValidatorResponse - 5, // 22: cosmos.staking.v1beta1.Msg.Delegate:output_type -> cosmos.staking.v1beta1.MsgDelegateResponse - 7, // 23: cosmos.staking.v1beta1.Msg.BeginRedelegate:output_type -> cosmos.staking.v1beta1.MsgBeginRedelegateResponse - 9, // 24: cosmos.staking.v1beta1.Msg.Undelegate:output_type -> cosmos.staking.v1beta1.MsgUndelegateResponse - 11, // 25: cosmos.staking.v1beta1.Msg.CancelUnbondingDelegation:output_type -> cosmos.staking.v1beta1.MsgCancelUnbondingDelegationResponse - 13, // 26: cosmos.staking.v1beta1.Msg.UpdateParams:output_type -> cosmos.staking.v1beta1.MsgUpdateParamsResponse - 20, // [20:27] is the sub-list for method output_type - 13, // [13:20] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 16, // 0: cosmos.staking.v1beta1.MsgCreateValidator.description:type_name -> cosmos.staking.v1beta1.Description + 17, // 1: cosmos.staking.v1beta1.MsgCreateValidator.commission:type_name -> cosmos.staking.v1beta1.CommissionRates + 18, // 2: cosmos.staking.v1beta1.MsgCreateValidator.pubkey:type_name -> google.protobuf.Any + 19, // 3: cosmos.staking.v1beta1.MsgCreateValidator.value:type_name -> cosmos.base.v1beta1.Coin + 16, // 4: cosmos.staking.v1beta1.MsgEditValidator.description:type_name -> cosmos.staking.v1beta1.Description + 19, // 5: cosmos.staking.v1beta1.MsgDelegate.amount:type_name -> cosmos.base.v1beta1.Coin + 19, // 6: cosmos.staking.v1beta1.MsgBeginRedelegate.amount:type_name -> cosmos.base.v1beta1.Coin + 20, // 7: cosmos.staking.v1beta1.MsgBeginRedelegateResponse.completion_time:type_name -> google.protobuf.Timestamp + 19, // 8: cosmos.staking.v1beta1.MsgUndelegate.amount:type_name -> cosmos.base.v1beta1.Coin + 20, // 9: cosmos.staking.v1beta1.MsgUndelegateResponse.completion_time:type_name -> google.protobuf.Timestamp + 19, // 10: cosmos.staking.v1beta1.MsgUndelegateResponse.amount:type_name -> cosmos.base.v1beta1.Coin + 19, // 11: cosmos.staking.v1beta1.MsgCancelUnbondingDelegation.amount:type_name -> cosmos.base.v1beta1.Coin + 21, // 12: cosmos.staking.v1beta1.MsgUpdateParams.params:type_name -> cosmos.staking.v1beta1.Params + 18, // 13: cosmos.staking.v1beta1.MsgRotateConsPubKey.new_pubkey:type_name -> google.protobuf.Any + 0, // 14: cosmos.staking.v1beta1.Msg.CreateValidator:input_type -> cosmos.staking.v1beta1.MsgCreateValidator + 2, // 15: cosmos.staking.v1beta1.Msg.EditValidator:input_type -> cosmos.staking.v1beta1.MsgEditValidator + 4, // 16: cosmos.staking.v1beta1.Msg.Delegate:input_type -> cosmos.staking.v1beta1.MsgDelegate + 6, // 17: cosmos.staking.v1beta1.Msg.BeginRedelegate:input_type -> cosmos.staking.v1beta1.MsgBeginRedelegate + 8, // 18: cosmos.staking.v1beta1.Msg.Undelegate:input_type -> cosmos.staking.v1beta1.MsgUndelegate + 10, // 19: cosmos.staking.v1beta1.Msg.CancelUnbondingDelegation:input_type -> cosmos.staking.v1beta1.MsgCancelUnbondingDelegation + 12, // 20: cosmos.staking.v1beta1.Msg.UpdateParams:input_type -> cosmos.staking.v1beta1.MsgUpdateParams + 14, // 21: cosmos.staking.v1beta1.Msg.RotateConsPubKey:input_type -> cosmos.staking.v1beta1.MsgRotateConsPubKey + 1, // 22: cosmos.staking.v1beta1.Msg.CreateValidator:output_type -> cosmos.staking.v1beta1.MsgCreateValidatorResponse + 3, // 23: cosmos.staking.v1beta1.Msg.EditValidator:output_type -> cosmos.staking.v1beta1.MsgEditValidatorResponse + 5, // 24: cosmos.staking.v1beta1.Msg.Delegate:output_type -> cosmos.staking.v1beta1.MsgDelegateResponse + 7, // 25: cosmos.staking.v1beta1.Msg.BeginRedelegate:output_type -> cosmos.staking.v1beta1.MsgBeginRedelegateResponse + 9, // 26: cosmos.staking.v1beta1.Msg.Undelegate:output_type -> cosmos.staking.v1beta1.MsgUndelegateResponse + 11, // 27: cosmos.staking.v1beta1.Msg.CancelUnbondingDelegation:output_type -> cosmos.staking.v1beta1.MsgCancelUnbondingDelegationResponse + 13, // 28: cosmos.staking.v1beta1.Msg.UpdateParams:output_type -> cosmos.staking.v1beta1.MsgUpdateParamsResponse + 15, // 29: cosmos.staking.v1beta1.Msg.RotateConsPubKey:output_type -> cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse + 22, // [22:30] is the sub-list for method output_type + 14, // [14:22] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_cosmos_staking_v1beta1_tx_proto_init() } @@ -8298,6 +9259,30 @@ func file_cosmos_staking_v1beta1_tx_proto_init() { return nil } } + file_cosmos_staking_v1beta1_tx_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgRotateConsPubKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cosmos_staking_v1beta1_tx_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgRotateConsPubKeyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -8305,7 +9290,7 @@ func file_cosmos_staking_v1beta1_tx_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cosmos_staking_v1beta1_tx_proto_rawDesc, NumEnums: 0, - NumMessages: 14, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/api/cosmos/staking/v1beta1/tx_grpc.pb.go b/api/cosmos/staking/v1beta1/tx_grpc.pb.go index 84a8c06e8998..b470a1ab3ed2 100644 --- a/api/cosmos/staking/v1beta1/tx_grpc.pb.go +++ b/api/cosmos/staking/v1beta1/tx_grpc.pb.go @@ -26,6 +26,7 @@ const ( Msg_Undelegate_FullMethodName = "/cosmos.staking.v1beta1.Msg/Undelegate" Msg_CancelUnbondingDelegation_FullMethodName = "/cosmos.staking.v1beta1.Msg/CancelUnbondingDelegation" Msg_UpdateParams_FullMethodName = "/cosmos.staking.v1beta1.Msg/UpdateParams" + Msg_RotateConsPubKey_FullMethodName = "/cosmos.staking.v1beta1.Msg/RotateConsPubKey" ) // MsgClient is the client API for Msg service. @@ -54,6 +55,10 @@ type MsgClient interface { // parameters. // Since: cosmos-sdk 0.47 UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) + // RotateConsPubKey defines an operation for rotating the consensus keys + // of a validator. + // Since: cosmos-sdk 0.48 + RotateConsPubKey(ctx context.Context, in *MsgRotateConsPubKey, opts ...grpc.CallOption) (*MsgRotateConsPubKeyResponse, error) } type msgClient struct { @@ -127,6 +132,15 @@ func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts return out, nil } +func (c *msgClient) RotateConsPubKey(ctx context.Context, in *MsgRotateConsPubKey, opts ...grpc.CallOption) (*MsgRotateConsPubKeyResponse, error) { + out := new(MsgRotateConsPubKeyResponse) + err := c.cc.Invoke(ctx, Msg_RotateConsPubKey_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. // All implementations must embed UnimplementedMsgServer // for forward compatibility @@ -153,6 +167,10 @@ type MsgServer interface { // parameters. // Since: cosmos-sdk 0.47 UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) + // RotateConsPubKey defines an operation for rotating the consensus keys + // of a validator. + // Since: cosmos-sdk 0.48 + RotateConsPubKey(context.Context, *MsgRotateConsPubKey) (*MsgRotateConsPubKeyResponse, error) mustEmbedUnimplementedMsgServer() } @@ -181,6 +199,9 @@ func (UnimplementedMsgServer) CancelUnbondingDelegation(context.Context, *MsgCan func (UnimplementedMsgServer) UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") } +func (UnimplementedMsgServer) RotateConsPubKey(context.Context, *MsgRotateConsPubKey) (*MsgRotateConsPubKeyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RotateConsPubKey not implemented") +} func (UnimplementedMsgServer) mustEmbedUnimplementedMsgServer() {} // UnsafeMsgServer may be embedded to opt out of forward compatibility for this service. @@ -320,6 +341,24 @@ func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _Msg_RotateConsPubKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRotateConsPubKey) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RotateConsPubKey(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Msg_RotateConsPubKey_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RotateConsPubKey(ctx, req.(*MsgRotateConsPubKey)) + } + return interceptor(ctx, in, info, handler) +} + // Msg_ServiceDesc is the grpc.ServiceDesc for Msg service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -355,6 +394,10 @@ var Msg_ServiceDesc = grpc.ServiceDesc{ MethodName: "UpdateParams", Handler: _Msg_UpdateParams_Handler, }, + { + MethodName: "RotateConsPubKey", + Handler: _Msg_RotateConsPubKey_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "cosmos/staking/v1beta1/tx.proto", diff --git a/docs/architecture/adr-016-validator-consensus-key-rotation.md b/docs/architecture/adr-016-validator-consensus-key-rotation.md index 1d91a8de79c2..f0d743308b7f 100644 --- a/docs/architecture/adr-016-validator-consensus-key-rotation.md +++ b/docs/architecture/adr-016-validator-consensus-key-rotation.md @@ -34,11 +34,10 @@ Also, it should be noted that this ADR includes only the simplest form of consen * In current Tendermint design, consensus key rotations are seen as power changes from LCD or IBC perspective * Therefore, to minimize unnecessary frequent key rotation behavior, we limited maximum number of rotation in recent unbonding period and also applied exponentially increasing rotation fee * limits - * a validator cannot rotate its consensus key more than `MaxConsPubKeyRotations` time for any unbonding period, to prevent spam. - * parameters can be decided by governance and stored in genesis file. + * rotations are limited to 1 time in an unbonding window. In future rewrites of the staking module it could be made to happen more times than 1 * key rotation fee * a validator should pay `KeyRotationFee` to rotate the consensus key which is calculated as below - * `KeyRotationFee` = (max(`VotingPowerPercentage` *100, 1)* `InitialKeyRotationFee`) * 2^(number of rotations in `ConsPubKeyRotationHistory` in recent unbonding period) + * `KeyRotationFee` = (max(`VotingPowerPercentage`, 1)* `InitialKeyRotationFee`) * 2^(number of rotations in `ConsPubKeyRotationHistory` in recent unbonding period) * evidence module * evidence module can search corresponding consensus key for any height from slashing keeper so that it can decide which consensus key is supposed to be used for given height. * abci.ValidatorUpdate diff --git a/proto/cosmos/staking/v1beta1/staking.proto b/proto/cosmos/staking/v1beta1/staking.proto index 231a200c89dd..20ef63b1bd7a 100644 --- a/proto/cosmos/staking/v1beta1/staking.proto +++ b/proto/cosmos/staking/v1beta1/staking.proto @@ -320,6 +320,12 @@ message Params { (amino.dont_omitempty) = true, (cosmos_proto.scalar) = "cosmos.Dec" ]; + // key_rotation_fee is fee to be spent when rotating validator's key + // (either consensus pubkey or operator key) + cosmos.base.v1beta1.Coin key_rotation_fee = 7 [ + (gogoproto.nullable) = false, + (amino.dont_omitempty) = true + ]; } // DelegationResponse is equivalent to Delegation except that it contains a @@ -392,3 +398,26 @@ enum Infraction { message ValidatorUpdates { repeated tendermint.abci.ValidatorUpdate updates = 1 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true]; } + +// ConsPubKeyRotationHistory contains a validator's consensus public key rotation history. +message ConsPubKeyRotationHistory { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + // operator_address defines the address of the validator's operator; bech encoded in JSON. + string operator_address = 1 [(gogoproto.moretags) = "yaml:\"operator_address\""]; + // old_cons_pubkey is the old consensus public key of the validator, as a Protobuf Any. + google.protobuf.Any old_cons_pubkey = 2 [(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey"]; + // new_cons_pubkey is the new consensus public key of the validator, as a Protobuf Any. + google.protobuf.Any new_cons_pubkey = 3 [(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey"]; + // height defines the block height at which the rotation event occured. + uint64 height = 4; + // fee holds the amount of fee deduced for the rotation. + cosmos.base.v1beta1.Coin fee = 5 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true]; +} + +// ValAddrsOfRotatedConsKeys contains the array of validator addresses which rotated their keys +// This is to block the validator's next rotation till unbonding period. +message ValAddrsOfRotatedConsKeys { + repeated string addresses = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; +} diff --git a/proto/cosmos/staking/v1beta1/tx.proto b/proto/cosmos/staking/v1beta1/tx.proto index a05a84145173..bfe66f424ad3 100644 --- a/proto/cosmos/staking/v1beta1/tx.proto +++ b/proto/cosmos/staking/v1beta1/tx.proto @@ -45,6 +45,11 @@ service Msg { // parameters. // Since: cosmos-sdk 0.47 rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); + + // RotateConsPubKey defines an operation for rotating the consensus keys + // of a validator. + // Since: cosmos-sdk 0.48 + rpc RotateConsPubKey(MsgRotateConsPubKey) returns (MsgRotateConsPubKeyResponse); } // MsgCreateValidator defines a SDK message for creating a new validator. @@ -204,3 +209,23 @@ message MsgUpdateParams { // // Since: cosmos-sdk 0.47 message MsgUpdateParamsResponse {}; + +// MsgRotateConsPubKey is the Msg/RotateConsPubKey request type. +// +// Since: cosmos-sdk 0.48 +message MsgRotateConsPubKey { + option (cosmos.msg.v1.signer) = "validator_address"; + option (amino.name) = "cosmos-sdk/MsgRotateConsPubKey"; + + option (gogoproto.goproto_getters) = false; + option (gogoproto.equal) = false; + + string validator_address = 2 [(cosmos_proto.scalar) = "cosmos.ValidatorAddressString"]; + google.protobuf.Any new_pubkey = 3 [(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey"]; +} + +// MsgRotateConsPubKeyResponse defines the response structure for executing a +// MsgRotateConsPubKey message. +// +// Since: cosmos-sdk 0.48 +message MsgRotateConsPubKeyResponse {} diff --git a/tests/go.mod b/tests/go.mod index d1e3754d16cc..7b4c67947886 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -202,6 +202,7 @@ replace ( cosmossdk.io/x/nft => ../x/nft cosmossdk.io/x/tx => ../x/tx cosmossdk.io/x/upgrade => ../x/upgrade + cosmossdk.io/api => ../api ) // Below are the long-lived replace for tests. diff --git a/tests/integration/aminojson/aminojson_test.go b/tests/integration/aminojson/aminojson_test.go index 22cd7b3b8d0f..3ce8dd41cef9 100644 --- a/tests/integration/aminojson/aminojson_test.go +++ b/tests/integration/aminojson/aminojson_test.go @@ -359,6 +359,20 @@ func TestAminoJSON_LegacyParity(t *testing.T) { MinSignedPerWindow: dec10bz, }, }, + "staking/msg_update_params": { + gogo: &stakingtypes.MsgUpdateParams{ + Params: stakingtypes.Params{ + UnbondingTime: 0, + KeyRotationFee: types.Coin{}, + }, + }, + pulsar: &stakingapi.MsgUpdateParams{ + Params: &stakingapi.Params{ + UnbondingTime: &durationpb.Duration{Seconds: 0}, + KeyRotationFee: &v1beta1.Coin{}, + }, + }, + }, "staking/create_validator": { gogo: &stakingtypes.MsgCreateValidator{Pubkey: pubkeyAny}, pulsar: &stakingapi.MsgCreateValidator{ diff --git a/tests/integration/evidence/keeper/infraction_test.go b/tests/integration/evidence/keeper/infraction_test.go index 13816e90ad8d..a966ecc5d8a6 100644 --- a/tests/integration/evidence/keeper/infraction_test.go +++ b/tests/integration/evidence/keeper/infraction_test.go @@ -9,6 +9,7 @@ import ( "cosmossdk.io/core/comet" "cosmossdk.io/log" + "cosmossdk.io/math" storetypes "cosmossdk.io/store/types" "cosmossdk.io/x/evidence" "cosmossdk.io/x/evidence/exported" @@ -35,6 +36,9 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" + "github.com/cosmos/cosmos-sdk/x/distribution" + distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/cosmos/cosmos-sdk/x/slashing" @@ -79,7 +83,8 @@ type fixture struct { func initFixture(t testing.TB) *fixture { keys := storetypes.NewKVStoreKeys( - authtypes.StoreKey, banktypes.StoreKey, paramtypes.StoreKey, consensusparamtypes.StoreKey, evidencetypes.StoreKey, stakingtypes.StoreKey, slashingtypes.StoreKey, + authtypes.StoreKey, banktypes.StoreKey, paramtypes.StoreKey, consensusparamtypes.StoreKey, + evidencetypes.StoreKey, stakingtypes.StoreKey, slashingtypes.StoreKey, distrtypes.StoreKey, ) cdc := moduletestutil.MakeTestEncodingConfig(auth.AppModuleBasic{}, evidence.AppModuleBasic{}).Codec @@ -94,6 +99,7 @@ func initFixture(t testing.TB) *fixture { minttypes.ModuleName: {authtypes.Minter}, stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, + distrtypes.ModuleName: {authtypes.Minter}, } accountKeeper := authkeeper.NewAccountKeeper( @@ -118,8 +124,17 @@ func initFixture(t testing.TB) *fixture { ) stakingKeeper := stakingkeeper.NewKeeper(cdc, keys[stakingtypes.StoreKey], accountKeeper, bankKeeper, authority.String()) + distrKeeper := distrkeeper.NewKeeper( + cdc, runtime.NewKVStoreService(keys[distrtypes.StoreKey]), accountKeeper, bankKeeper, stakingKeeper, distrtypes.ModuleName, authority.String(), + ) + distrKeeper.FeePool.Set(newCtx, distrtypes.FeePool{ + CommunityPool: sdk.NewDecCoins(sdk.DecCoin{Denom: sdk.DefaultBondDenom, Amount: math.LegacyNewDec(0)}), + }) slashingKeeper := slashingkeeper.NewKeeper(cdc, codec.NewLegacyAmino(), runtime.NewKVStoreService(keys[slashingtypes.StoreKey]), stakingKeeper, authority.String()) + stakingKeeper.SetHooks( + stakingtypes.NewMultiStakingHooks(distrKeeper.Hooks(), slashingKeeper.Hooks()), + ) evidenceKeeper := keeper.NewKeeper(cdc, runtime.NewKVStoreService(keys[evidencetypes.StoreKey]), stakingKeeper, slashingKeeper, address.NewBech32Codec("cosmos"), runtime.ProvideCometInfoService()) router := evidencetypes.NewRouter() @@ -131,8 +146,9 @@ func initFixture(t testing.TB) *fixture { stakingModule := staking.NewAppModule(cdc, stakingKeeper, accountKeeper, bankKeeper, nil) slashingModule := slashing.NewAppModule(cdc, slashingKeeper, accountKeeper, bankKeeper, stakingKeeper, nil, cdc.InterfaceRegistry()) evidenceModule := evidence.NewAppModule(*evidenceKeeper) + distrModule := distribution.NewAppModule(cdc, distrKeeper, accountKeeper, bankKeeper, stakingKeeper, nil) - integrationApp := integration.NewIntegrationApp(newCtx, logger, keys, cdc, authModule, bankModule, stakingModule, slashingModule, evidenceModule) + integrationApp := integration.NewIntegrationApp(newCtx, logger, keys, cdc, authModule, bankModule, stakingModule, slashingModule, evidenceModule, distrModule) sdkCtx := sdk.UnwrapSDKContext(integrationApp.Context()) @@ -239,6 +255,96 @@ func TestHandleDoubleSign(t *testing.T) { assert.Assert(t, len(values) == 1) } +func TestHandleDoubleSignAfterRotation(t *testing.T) { + t.Parallel() + f := initFixture(t) + + ctx := f.sdkCtx.WithIsCheckTx(false).WithBlockHeight(1) + populateValidators(t, f) + + power := int64(100) + stakingParams := f.stakingKeeper.GetParams(ctx) + operatorAddr, val := valAddresses[0], pubkeys[0] + tstaking := stakingtestutil.NewHelper(t, ctx, f.stakingKeeper) + + selfDelegation := tstaking.CreateValidatorWithValPower(operatorAddr, val, power, true) + + // execute end-blocker and verify validator attributes + f.stakingKeeper.EndBlocker(ctx) + assert.DeepEqual(t, + f.bankKeeper.GetAllBalances(ctx, sdk.AccAddress(operatorAddr)).String(), + sdk.NewCoins(sdk.NewCoin(stakingParams.BondDenom, initAmt.Sub(selfDelegation))).String(), + ) + assert.DeepEqual(t, selfDelegation, f.stakingKeeper.Validator(ctx, operatorAddr).GetBondedTokens()) + + NewPubkey := newPubKey("0B485CFC0EECC619440448436F8FC9DF40566F2369E72400281454CB552AFB53") + + msgServer := stakingkeeper.NewMsgServerImpl(f.stakingKeeper) + msg, err := stakingtypes.NewMsgRotateConsPubKey(operatorAddr, NewPubkey) + assert.NilError(t, err) + _, err = msgServer.RotateConsPubKey(ctx, msg) + assert.NilError(t, err) + + // execute end-blocker and verify validator attributes + _, err = f.stakingKeeper.EndBlocker(ctx) + assert.NilError(t, err) + + // handle a signature to set signing info + f.slashingKeeper.HandleValidatorSignature(ctx, NewPubkey.Address(), selfDelegation.Int64(), comet.BlockIDFlagCommit) + + // double sign less than max age + oldTokens := f.stakingKeeper.Validator(ctx, operatorAddr).GetTokens() + nci := NewCometInfo(abci.RequestFinalizeBlock{ + Misbehavior: []abci.Misbehavior{{ + Validator: abci.Validator{Address: val.Address(), Power: power}, + Type: abci.MisbehaviorType_DUPLICATE_VOTE, + Time: time.Unix(0, 0), + Height: 0, + }}, + }) + + f.evidenceKeeper.BeginBlocker(ctx.WithCometInfo(nci)) + + // should be jailed and tombstoned + assert.Assert(t, f.stakingKeeper.Validator(ctx, operatorAddr).IsJailed()) + assert.Assert(t, f.slashingKeeper.IsTombstoned(ctx, sdk.ConsAddress(NewPubkey.Address()))) + + // tokens should be decreased + newTokens := f.stakingKeeper.Validator(ctx, operatorAddr).GetTokens() + assert.Assert(t, newTokens.LT(oldTokens)) + + // submit duplicate evidence + f.evidenceKeeper.BeginBlocker(ctx.WithCometInfo(nci)) + + // tokens should be the same (capped slash) + assert.Assert(t, f.stakingKeeper.Validator(ctx, operatorAddr).GetTokens().Equal(newTokens)) + + // jump to past the unbonding period + ctx = ctx.WithBlockTime(time.Unix(1, 0).Add(stakingParams.UnbondingTime)) + + // require we cannot unjail + assert.Error(t, f.slashingKeeper.Unjail(ctx, operatorAddr), slashingtypes.ErrValidatorJailed.Error()) + + // require we be able to unbond now + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + del, _ := f.stakingKeeper.GetDelegation(ctx, sdk.AccAddress(operatorAddr), operatorAddr) + validator, _ := f.stakingKeeper.GetValidator(ctx, operatorAddr) + totalBond := validator.TokensFromShares(del.GetShares()).TruncateInt() + tstaking.Ctx = ctx + tstaking.Denom = stakingParams.BondDenom + tstaking.Undelegate(sdk.AccAddress(operatorAddr), operatorAddr, totalBond, true) + + // query evidence from store + var evidences []exported.Evidence + assert.NilError(t, f.evidenceKeeper.Evidences.Walk(ctx, nil, func(key []byte, value exported.Evidence) (stop bool, err error) { + evidences = append(evidences, value) + return false, nil + })) + // evidences, err := f.evidenceKeeper.GetAllEvidence(ctx) + assert.NilError(t, err) + assert.Assert(t, len(evidences) == 1) +} + func TestHandleDoubleSign_TooOld(t *testing.T) { t.Parallel() f := initFixture(t) diff --git a/tests/integration/staking/keeper/common_test.go b/tests/integration/staking/keeper/common_test.go index 853a506810e3..415b3126459e 100644 --- a/tests/integration/staking/keeper/common_test.go +++ b/tests/integration/staking/keeper/common_test.go @@ -24,6 +24,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/bank" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" "github.com/cosmos/cosmos-sdk/x/staking" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" @@ -77,6 +78,8 @@ func createValidators(t *testing.T, f *fixture, powers []int64) ([]sdk.AccAddres f.stakingKeeper.SetValidatorByConsAddr(f.sdkCtx, val2) f.stakingKeeper.SetNewValidatorByPowerIndex(f.sdkCtx, val1) f.stakingKeeper.SetNewValidatorByPowerIndex(f.sdkCtx, val2) + f.stakingKeeper.Hooks().AfterValidatorCreated(f.sdkCtx, valAddrs[0]) + f.stakingKeeper.Hooks().AfterValidatorCreated(f.sdkCtx, valAddrs[1]) _, err := f.stakingKeeper.Delegate(f.sdkCtx, addrs[0], f.stakingKeeper.TokensFromConsensusPower(f.sdkCtx, powers[0]), types.Unbonded, val1, true) assert.NilError(t, err) @@ -84,6 +87,7 @@ func createValidators(t *testing.T, f *fixture, powers []int64) ([]sdk.AccAddres assert.NilError(t, err) _, err = f.stakingKeeper.Delegate(f.sdkCtx, addrs[0], f.stakingKeeper.TokensFromConsensusPower(f.sdkCtx, powers[2]), types.Unbonded, val2, true) assert.NilError(t, err) + applyValidatorSetUpdates(t, f.sdkCtx, f.stakingKeeper, -1) return addrs, valAddrs, vals @@ -107,6 +111,7 @@ func initFixture(t testing.TB) *fixture { types.ModuleName: {authtypes.Minter}, types.BondedPoolName: {authtypes.Burner, authtypes.Staking}, types.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, + distrtypes.ModuleName: {authtypes.Minter}, } accountKeeper := authkeeper.NewAccountKeeper( diff --git a/tests/integration/staking/keeper/delegation_test.go b/tests/integration/staking/keeper/delegation_test.go index 3d30da540d41..23589d7c6953 100644 --- a/tests/integration/staking/keeper/delegation_test.go +++ b/tests/integration/staking/keeper/delegation_test.go @@ -70,6 +70,7 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { var amount math.Int completionTime, amount, err = f.stakingKeeper.Undelegate(ctx, addrDel, addrVal, math.LegacyNewDec(1)) totalUnbonded = totalUnbonded.Add(amount) + assert.NilError(t, err) } diff --git a/tests/integration/staking/keeper/determinstic_test.go b/tests/integration/staking/keeper/determinstic_test.go index cd0ab10e216f..dd6df1aa2f55 100644 --- a/tests/integration/staking/keeper/determinstic_test.go +++ b/tests/integration/staking/keeper/determinstic_test.go @@ -402,7 +402,7 @@ func TestGRPCValidatorDelegations(t *testing.T) { ValidatorAddr: validator.OperatorAddress, } - testdata.DeterministicIterations(f.ctx, t, req, f.queryClient.ValidatorDelegations, 14475, false) + testdata.DeterministicIterations(f.ctx, t, req, f.queryClient.ValidatorDelegations, 14637, false) } func TestGRPCValidatorUnbondingDelegations(t *testing.T) { @@ -481,7 +481,7 @@ func TestGRPCDelegation(t *testing.T) { DelegatorAddr: delegator1, } - testdata.DeterministicIterations(f.ctx, t, req, f.queryClient.Delegation, 4635, false) + testdata.DeterministicIterations(f.ctx, t, req, f.queryClient.Delegation, 4689, false) } func TestGRPCUnbondingDelegation(t *testing.T) { @@ -554,7 +554,7 @@ func TestGRPCDelegatorDelegations(t *testing.T) { DelegatorAddr: delegator1, } - testdata.DeterministicIterations(f.ctx, t, req, f.queryClient.DelegatorDelegations, 4238, false) + testdata.DeterministicIterations(f.ctx, t, req, f.queryClient.DelegatorDelegations, 4292, false) } func TestGRPCDelegatorValidator(t *testing.T) { @@ -733,7 +733,7 @@ func TestGRPCPool(t *testing.T) { f = initDeterministicFixture(t) // reset getStaticValidator(f, t) - testdata.DeterministicIterations(f.ctx, t, &stakingtypes.QueryPoolRequest{}, f.queryClient.Pool, 6242, false) + testdata.DeterministicIterations(f.ctx, t, &stakingtypes.QueryPoolRequest{}, f.queryClient.Pool, 6296, false) } func TestGRPCRedelegations(t *testing.T) { @@ -813,6 +813,7 @@ func TestGRPCParams(t *testing.T) { MaxEntries: rapid.Uint32Min(1).Draw(rt, "max-entries"), HistoricalEntries: rapid.Uint32Min(1).Draw(rt, "historical-entries"), MinCommissionRate: sdk.NewDecWithPrec(rapid.Int64Range(0, 100).Draw(rt, "commission"), 2), + KeyRotationFee: sdk.NewCoin(sdk.DefaultBondDenom, math.NewIntFromUint64(rapid.Uint64Range(1000, 1000000).Draw(rt, "cons-pubkey-rotation-fee"))), } err := f.stakingKeeper.SetParams(f.ctx, params) @@ -828,10 +829,11 @@ func TestGRPCParams(t *testing.T) { MaxEntries: 5, HistoricalEntries: 5, MinCommissionRate: sdk.NewDecWithPrec(5, 2), + KeyRotationFee: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000)), } err := f.stakingKeeper.SetParams(f.ctx, params) assert.NilError(t, err) - testdata.DeterministicIterations(f.ctx, t, &stakingtypes.QueryParamsRequest{}, f.queryClient.Params, 1114, false) + testdata.DeterministicIterations(f.ctx, t, &stakingtypes.QueryParamsRequest{}, f.queryClient.Params, 1159, false) } diff --git a/tests/integration/staking/keeper/msg_server_test.go b/tests/integration/staking/keeper/msg_server_test.go index 9c08804f577c..6123b6070cb1 100644 --- a/tests/integration/staking/keeper/msg_server_test.go +++ b/tests/integration/staking/keeper/msg_server_test.go @@ -4,13 +4,17 @@ import ( "testing" "time" + "cosmossdk.io/math" "gotest.tools/v3/assert" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/bank/testutil" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/stretchr/testify/require" ) func TestCancelUnbondingDelegation(t *testing.T) { @@ -168,3 +172,202 @@ func TestCancelUnbondingDelegation(t *testing.T) { }) } } + +func TestRotateConsPubKey(t *testing.T) { + t.Parallel() + f := initFixture(t) + + ctx := f.sdkCtx + stakingKeeper := f.stakingKeeper + bankKeeper := f.bankKeeper + accountKeeper := f.accountKeeper + + msgServer := keeper.NewMsgServerImpl(stakingKeeper) + bondDenom := stakingKeeper.BondDenom(ctx) + + params := stakingKeeper.GetParams(ctx) + params.KeyRotationFee = sdk.NewInt64Coin(bondDenom, 10) + err := stakingKeeper.SetParams(ctx, params) + assert.NilError(t, err) + + addrs := simtestutil.AddTestAddrsIncremental(bankKeeper, stakingKeeper, ctx, 5, stakingKeeper.TokensFromConsensusPower(ctx, 100)) + valAddrs := simtestutil.ConvertAddrsToValAddrs(addrs) + + // create 5 validators + for i := 0; i < 5; i++ { + comm := types.NewCommissionRates(math.LegacyNewDec(0), math.LegacyNewDec(0), math.LegacyNewDec(0)) + + msg, err := types.NewMsgCreateValidator(valAddrs[i], PKs[i], sdk.NewCoin(sdk.DefaultBondDenom, stakingKeeper.TokensFromConsensusPower(ctx, 30)), + types.Description{Moniker: "NewVal"}, comm, math.OneInt()) + require.NoError(t, err) + _, err = msgServer.CreateValidator(ctx, msg) + require.NoError(t, err) + } + + // call endblocker to update the validator state + _, err = stakingKeeper.EndBlocker(ctx.WithBlockHeight(ctx.BlockHeader().Height + 1)) + require.NoError(t, err) + + keyRotationFee := stakingKeeper.KeyRotationFee(ctx) + + validators := stakingKeeper.GetAllValidators(ctx) + require.GreaterOrEqual(t, len(validators), 5) + + testCases := []struct { + name string + malleate func() sdk.Context + pass bool + validator sdk.ValAddress + newPubKey cryptotypes.PubKey + expErrMsg string + expHistoryObjs int + fees sdk.Coin + }{ + { + name: "successful consensus pubkey rotation", + malleate: func() sdk.Context { + return ctx + }, + validator: validators[0].GetOperator(), + newPubKey: PKs[499], + pass: true, + expHistoryObjs: 1, + fees: keyRotationFee, + }, + { + name: "non existing validator check", + malleate: func() sdk.Context { + return ctx + }, + validator: sdk.ValAddress("non_existing_val"), + newPubKey: PKs[498], + pass: false, + expErrMsg: "validator does not exist", + }, + { + name: "pubkey already associated with another validator", + malleate: func() sdk.Context { + return ctx + }, + validator: validators[0].GetOperator(), + newPubKey: validators[1].ConsensusPubkey.GetCachedValue().(cryptotypes.PubKey), + pass: false, + expErrMsg: "consensus pubkey is already used for a validator", + }, + { + name: "consensus pubkey rotation limit check", + malleate: func() sdk.Context { + params := stakingKeeper.GetParams(ctx) + params.KeyRotationFee = sdk.NewInt64Coin(bondDenom, 10) + err := stakingKeeper.SetParams(ctx, params) + require.NoError(t, err) + + msg, err := types.NewMsgRotateConsPubKey( + validators[1].GetOperator(), + PKs[498], + ) + require.NoError(t, err) + _, err = msgServer.RotateConsPubKey(ctx, msg) + require.NoError(t, err) + + return ctx + }, + validator: validators[1].GetOperator(), + newPubKey: PKs[497], + pass: false, + expErrMsg: "exceeding maximum consensus pubkey rotations within unbonding period", + }, + { + name: "limit reached, but should rotate after the unbonding period", + malleate: func() sdk.Context { + params := stakingKeeper.GetParams(ctx) + params.KeyRotationFee = sdk.NewInt64Coin(bondDenom, 10) + err := stakingKeeper.SetParams(ctx, params) + require.NoError(t, err) + + msg, err := types.NewMsgRotateConsPubKey( + validators[3].GetOperator(), + PKs[495], + ) + + require.NoError(t, err) + _, err = msgServer.RotateConsPubKey(ctx, msg) + require.NoError(t, err) + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + + // this shouldn't remove the existing keys from waiting queue since unbonding time isn't reached + _, err = stakingKeeper.EndBlocker(ctx) + require.NoError(t, err) + // stakingKeeper.UpdateAllMaturedConsKeyRotatedKeys(ctx, ctx.BlockHeader().Time) + + msg, err = types.NewMsgRotateConsPubKey( + validators[3].GetOperator(), + PKs[494], + ) + + require.NoError(t, err) + _, err = msgServer.RotateConsPubKey(ctx, msg) + require.Error(t, err) + + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + + newCtx := ctx.WithBlockTime(ctx.BlockHeader().Time.Add(stakingKeeper.UnbondingTime(ctx))) + newCtx = newCtx.WithBlockHeight(newCtx.BlockHeight() + 1) + // this should remove keys from waiting queue since unbonding time is reached + _, err = stakingKeeper.EndBlocker(newCtx) + require.NoError(t, err) + // stakingKeeper.UpdateAllMaturedConsKeyRotatedKeys(newCtx, newCtx.BlockHeader().Time) + + return newCtx + }, + validator: validators[3].GetOperator(), + newPubKey: PKs[494], + pass: true, + expErrMsg: "", + expHistoryObjs: 2, + fees: keyRotationFee, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + newCtx := testCase.malleate() + oldDistrBalance := bankKeeper.GetBalance(newCtx, accountKeeper.GetModuleAddress(distrtypes.ModuleName), bondDenom) + msg, err := types.NewMsgRotateConsPubKey( + testCase.validator, + testCase.newPubKey, + ) + require.NoError(t, err) + + _, err = msgServer.RotateConsPubKey(newCtx, msg) + + if testCase.pass { + require.NoError(t, err) + + _, err = stakingKeeper.EndBlocker(newCtx) + require.NoError(t, err) + + // rotation fee payment from sender to distrtypes + newDistrBalance := bankKeeper.GetBalance(newCtx, accountKeeper.GetModuleAddress(distrtypes.ModuleName), bondDenom) + require.Equal(t, newDistrBalance, oldDistrBalance.Add(testCase.fees)) + + // validator consensus pubkey update check + validator, found := stakingKeeper.GetValidator(newCtx, testCase.validator) + require.True(t, found) + + consAddr, err := validator.GetConsAddr() + require.NoError(t, err) + require.Equal(t, consAddr.String(), sdk.ConsAddress(testCase.newPubKey.Address()).String()) + + // consensus rotation history set check + historyObjects := stakingKeeper.GetValidatorConsPubKeyRotationHistory(newCtx, testCase.validator) + require.Len(t, historyObjects, testCase.expHistoryObjs) + historyObjects = stakingKeeper.GetBlockConsPubKeyRotationHistory(newCtx, newCtx.BlockHeight()) + require.Len(t, historyObjects, 1) + } else { + require.Error(t, err) + require.Equal(t, err.Error(), testCase.expErrMsg) + } + }) + } +} diff --git a/tests/integration/staking/keeper/slash_test.go b/tests/integration/staking/keeper/slash_test.go index 6beea0b0b3e9..373b3d266f6d 100644 --- a/tests/integration/staking/keeper/slash_test.go +++ b/tests/integration/staking/keeper/slash_test.go @@ -44,6 +44,8 @@ func bootstrapSlashTest(t *testing.T, power int64) (*fixture, []sdk.AccAddress, validator, _ = validator.AddTokensFromDel(amt) validator = keeper.TestingUpdateValidator(f.stakingKeeper, f.sdkCtx, validator, true) f.stakingKeeper.SetValidatorByConsAddr(f.sdkCtx, validator) + assert.NilError(t, f.stakingKeeper.Hooks().AfterValidatorCreated(f.sdkCtx, validator.GetOperator())) + f.stakingKeeper.Hooks().AfterDelegationModified(f.sdkCtx, sdk.AccAddress(validator.GetOperator()), validator.GetOperator()) } return f, addrDels, addrVals diff --git a/x/auth/ante/testutil/expected_keepers_mocks.go b/x/auth/ante/testutil/expected_keepers_mocks.go index 1302bd240b83..f6c54d54179d 100644 --- a/x/auth/ante/testutil/expected_keepers_mocks.go +++ b/x/auth/ante/testutil/expected_keepers_mocks.go @@ -8,6 +8,7 @@ import ( context "context" reflect "reflect" + address "cosmossdk.io/core/address" types "github.com/cosmos/cosmos-sdk/types" types0 "github.com/cosmos/cosmos-sdk/x/auth/types" gomock "github.com/golang/mock/gomock" @@ -36,6 +37,20 @@ func (m *MockAccountKeeper) EXPECT() *MockAccountKeeperMockRecorder { return m.recorder } +// AddressCodec mocks base method. +func (m *MockAccountKeeper) AddressCodec() address.Codec { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddressCodec") + ret0, _ := ret[0].(address.Codec) + return ret0 +} + +// AddressCodec indicates an expected call of AddressCodec. +func (mr *MockAccountKeeperMockRecorder) AddressCodec() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddressCodec", reflect.TypeOf((*MockAccountKeeper)(nil).AddressCodec)) +} + // GetAccount mocks base method. func (m *MockAccountKeeper) GetAccount(ctx context.Context, addr types.AccAddress) types.AccountI { m.ctrl.T.Helper() diff --git a/x/distribution/keeper/hooks.go b/x/distribution/keeper/hooks.go index 3c7fdd9092a6..5e13d5aefa8f 100644 --- a/x/distribution/keeper/hooks.go +++ b/x/distribution/keeper/hooks.go @@ -2,7 +2,7 @@ package keeper import ( sdkmath "cosmossdk.io/math" - + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -165,3 +165,14 @@ func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.Va func (h Hooks) AfterUnbondingInitiated(_ sdk.Context, _ uint64) error { return nil } + +func (h Hooks) AfterConsensusPubKeyUpdate(ctx sdk.Context, _, _ cryptotypes.PubKey, rotationFee sdk.Coin) error { + feePool, err := h.k.FeePool.Get(ctx) + if err != nil { + return err + } + + feePool.CommunityPool = feePool.CommunityPool.Add(sdk.NewDecCoinsFromCoins(rotationFee)...) + h.k.FeePool.Set(ctx, feePool) + return nil +} diff --git a/x/evidence/keeper/infraction.go b/x/evidence/keeper/infraction.go index 04f18db3eac7..9827b1c3fd0d 100644 --- a/x/evidence/keeper/infraction.go +++ b/x/evidence/keeper/infraction.go @@ -24,6 +24,7 @@ import ( // // TODO: Some of the invalid constraints listed above may need to be reconsidered // in the case of a lunatic attack. + func (k Keeper) handleEquivocationEvidence(ctx context.Context, evidence *types.Equivocation) error { sdkCtx := sdk.UnwrapSDKContext(ctx) logger := k.Logger(sdkCtx) @@ -37,7 +38,15 @@ func (k Keeper) handleEquivocationEvidence(ctx context.Context, evidence *types. } if !validator.GetOperator().Empty() { - if _, err := k.slashingKeeper.GetPubkey(ctx, consAddr.Bytes()); err != nil { + + // get the consAddr again, this is because validator might've rotated it's key. + valConsAddr, err := validator.GetConsAddr() + if err != nil { + panic(err) + } + consAddr = valConsAddr + + if _, err := k.slashingKeeper.GetPubkey(sdkCtx, consAddr.Bytes()); err != nil { // Ignore evidence that cannot be handled. // // NOTE: We used to panic with: diff --git a/x/slashing/keeper/hooks.go b/x/slashing/keeper/hooks.go index 0a307d1e72db..2d1886c53a14 100644 --- a/x/slashing/keeper/hooks.go +++ b/x/slashing/keeper/hooks.go @@ -6,6 +6,7 @@ import ( sdkmath "cosmossdk.io/math" "github.com/cometbft/cometbft/crypto" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/types" ) @@ -88,3 +89,12 @@ func (h Hooks) BeforeValidatorSlashed(_ sdk.Context, _ sdk.ValAddress, _ sdkmath func (h Hooks) AfterUnbondingInitiated(_ sdk.Context, _ uint64) error { return nil } + +func (h Hooks) AfterConsensusPubKeyUpdate(ctx sdk.Context, oldPubKey, newPubKey cryptotypes.PubKey, _ sdk.Coin) error { + if err := h.k.PerformConsensusPubKeyUpdate(ctx, oldPubKey, newPubKey); err != nil { + return err + } + + h.k.deleteAddrPubkeyRelation(ctx, oldPubKey.Address()) + return nil +} diff --git a/x/slashing/keeper/infractions.go b/x/slashing/keeper/infractions.go index 5a6fee86d6a4..b5444ffca2d6 100644 --- a/x/slashing/keeper/infractions.go +++ b/x/slashing/keeper/infractions.go @@ -30,7 +30,13 @@ func (k Keeper) HandleValidatorSignature(ctx context.Context, addr cryptotypes.A // fetch signing info signInfo, err := k.GetValidatorSigningInfo(ctx, consAddr) if err != nil { - return err + newConsKey := k.sk.GetMappedConsKey(sdkCtx, consAddr) + si, err := k.GetValidatorSigningInfo(ctx, newConsKey) + if err != nil { + panic(fmt.Sprintf("Expected signing info for validator %s but not found %v", consAddr, err)) + } + + signInfo = si } signedBlocksWindow, err := k.SignedBlocksWindow(ctx) diff --git a/x/slashing/keeper/signing_info.go b/x/slashing/keeper/signing_info.go index 7aec8e50cae1..b54427ba463c 100644 --- a/x/slashing/keeper/signing_info.go +++ b/x/slashing/keeper/signing_info.go @@ -8,6 +8,7 @@ import ( storetypes "cosmossdk.io/store/types" "github.com/bits-and-blooms/bitset" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/types" ) @@ -215,6 +216,55 @@ func (k Keeper) DeleteMissedBlockBitmap(ctx context.Context, addr sdk.ConsAddres return nil } +// removeValidatorSigningInfo removes the validator signing info from a consensus address key +func (k Keeper) removeValidatorSigningInfo(ctx sdk.Context, address sdk.ConsAddress) error { + store := k.storeService.OpenKVStore(ctx) + if err := store.Delete(types.ValidatorSigningInfoKey(address)); err != nil { + return err + } + + return nil +} + +func (k Keeper) PerformConsensusPubKeyUpdate(ctx sdk.Context, oldPubKey, newPubKey cryptotypes.PubKey) error { + // Connect new consensus address with PubKey + if err := k.AddPubkey(ctx, newPubKey); err != nil { + return err + } + + // Migrate ValidatorSigningInfo from oldPubKey to newPubKey + signingInfo, err := k.GetValidatorSigningInfo(ctx, sdk.ConsAddress(oldPubKey.Address())) + if err != nil { + return types.ErrInvalidConsPubKey + } + + if err := k.SetValidatorSigningInfo(ctx, sdk.ConsAddress(newPubKey.Address()), signingInfo); err != nil { + return err + } + + if err := k.removeValidatorSigningInfo(ctx, sdk.ConsAddress(oldPubKey.Address())); err != nil { + return err + } + + // Migrate ValidatorMissedBlockBitArray from oldPubKey to newPubKey + missedBlocks, err := k.GetValidatorMissedBlocks(ctx, sdk.ConsAddress(oldPubKey.Address())) + if err != nil { + return err + } + + if err := k.DeleteMissedBlockBitmap(ctx, sdk.ConsAddress(oldPubKey.Address())); err != nil { + return err + } + + for _, missed := range missedBlocks { + if err := k.SetMissedBlockBitmapValue(ctx, sdk.ConsAddress(newPubKey.Address()), missed.Index, missed.Missed); err != nil { + return err + } + } + + return nil +} + // IterateMissedBlockBitmap iterates over a validator's signed blocks window // bitmap and performs a callback function on each index, i.e. block height, in // the range [0, SignedBlocksWindow). diff --git a/x/slashing/keeper/signing_info_test.go b/x/slashing/keeper/signing_info_test.go index c24ece21c6ec..6ce35fa5218d 100644 --- a/x/slashing/keeper/signing_info_test.go +++ b/x/slashing/keeper/signing_info_test.go @@ -3,6 +3,7 @@ package keeper_test import ( "time" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/testutil" @@ -97,3 +98,49 @@ func (s *KeeperTestSuite) TestValidatorMissedBlockBitmap_SmallWindow() { require.Len(missedBlocks, int(params.SignedBlocksWindow)-1) } } + +func (s *KeeperTestSuite) TestPerformConsensusPubKeyUpdate() { + ctx, slashingKeeper := s.ctx, s.slashingKeeper + + require := s.Require() + + pks := simtestutil.CreateTestPubKeys(500) + + oldConsAddr := sdk.ConsAddress(pks[0].Address()) + newConsAddr := sdk.ConsAddress(pks[1].Address()) + + newInfo := slashingtypes.NewValidatorSigningInfo( + oldConsAddr, + int64(4), + int64(3), + time.Unix(2, 0).UTC(), + false, + int64(10), + ) + slashingKeeper.SetValidatorSigningInfo(ctx, oldConsAddr, newInfo) + slashingKeeper.SetMissedBlockBitmapValue(ctx, oldConsAddr, 10, true) + err := slashingKeeper.PerformConsensusPubKeyUpdate(ctx, pks[0], pks[1]) + require.NoError(err) + + // check pubkey relation is set properly + savedPubKey, err := slashingKeeper.GetPubkey(ctx, newConsAddr.Bytes()) + require.NoError(err) + require.Equal(savedPubKey, pks[1]) + + // check validator SigningInfo is set properly to new consensus pubkey + signingInfo, err := slashingKeeper.GetValidatorSigningInfo(ctx, newConsAddr) + require.NoError(err) + require.Equal(signingInfo, newInfo) + + // check missed blocks array is removed on old consensus pubkey + missedBlocks, err := slashingKeeper.GetValidatorMissedBlocks(ctx, oldConsAddr) + require.NoError(err) + + require.Len(missedBlocks, 0) + + // check missed blocks are set correctly for new pubkey + missedBlocks, err = slashingKeeper.GetValidatorMissedBlocks(ctx, newConsAddr) + require.NoError(err) + + require.Len(missedBlocks, 1) +} diff --git a/x/slashing/testutil/expected_keepers_mocks.go b/x/slashing/testutil/expected_keepers_mocks.go index 037343fb226f..a12268438b09 100644 --- a/x/slashing/testutil/expected_keepers_mocks.go +++ b/x/slashing/testutil/expected_keepers_mocks.go @@ -281,6 +281,20 @@ func (mr *MockStakingKeeperMockRecorder) GetAllValidators(ctx interface{}) *gomo return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllValidators", reflect.TypeOf((*MockStakingKeeper)(nil).GetAllValidators), ctx) } +// GetMappedConsKey mocks base method. +func (m *MockStakingKeeper) GetMappedConsKey(ctx types.Context, consAddr types.ConsAddress) types.ConsAddress { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetMappedConsKey", ctx, consAddr) + ret0, _ := ret[0].(types.ConsAddress) + return ret0 +} + +// GetMappedConsKey indicates an expected call of GetMappedConsKey. +func (mr *MockStakingKeeperMockRecorder) GetMappedConsKey(ctx, consAddr interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMappedConsKey", reflect.TypeOf((*MockStakingKeeper)(nil).GetMappedConsKey), ctx, consAddr) +} + // IsValidatorJailed mocks base method. func (m *MockStakingKeeper) IsValidatorJailed(ctx types.Context, addr types.ConsAddress) bool { m.ctrl.T.Helper() diff --git a/x/slashing/types/errors.go b/x/slashing/types/errors.go index 2fb1f5e75649..8c203a3695d9 100644 --- a/x/slashing/types/errors.go +++ b/x/slashing/types/errors.go @@ -12,4 +12,5 @@ var ( ErrSelfDelegationTooLowToUnjail = errors.Register(ModuleName, 7, "validator's self delegation less than minimum; cannot be unjailed") ErrNoSigningInfoFound = errors.Register(ModuleName, 8, "no validator signing info found") ErrValidatorTombstoned = errors.Register(ModuleName, 9, "validator already tombstoned") + ErrInvalidConsPubKey = errors.Register(ModuleName, 10, "invalid consensus pubkey") ) diff --git a/x/slashing/types/expected_keepers.go b/x/slashing/types/expected_keepers.go index 2e57cf09d28a..7e937b407350 100644 --- a/x/slashing/types/expected_keepers.go +++ b/x/slashing/types/expected_keepers.go @@ -58,6 +58,8 @@ type StakingKeeper interface { // IsValidatorJailed returns if the validator is jailed. IsValidatorJailed(ctx sdk.Context, addr sdk.ConsAddress) bool + + GetMappedConsKey(ctx sdk.Context, consAddr sdk.ConsAddress) sdk.ConsAddress } // StakingHooks event hooks for staking validator object (noalias) diff --git a/x/slashing/types/keys.go b/x/slashing/types/keys.go index 856780f86c48..4a72925c7830 100644 --- a/x/slashing/types/keys.go +++ b/x/slashing/types/keys.go @@ -50,7 +50,7 @@ const ( var ( ParamsKey = []byte{0x00} // Prefix for params key ValidatorSigningInfoKeyPrefix = []byte{0x01} // Prefix for signing info - ValidatorMissedBlockBitmapKeyPrefix = []byte{0x02} // Prefix for missed block bitmap + ValidatorMissedBlockBitmapKeyPrefix = []byte{0x02} // Prefix for missed block bit array AddrPubkeyRelationKeyPrefix = []byte{0x03} // Prefix for address-pubkey relation ) diff --git a/x/staking/README.md b/x/staking/README.md index 5dd94dc696a5..e511016ab39a 100644 --- a/x/staking/README.md +++ b/x/staking/README.md @@ -30,6 +30,7 @@ network. * [Delegation](#delegation) * [UnbondingDelegation](#unbondingdelegation) * [Redelegation](#redelegation) + * [ConsPubkeyRotation](#conspubkeyrotation) * [Queues](#queues) * [HistoricalInfo](#historicalinfo) * [State Transitions](#state-transitions) @@ -45,6 +46,7 @@ network. * [MsgCancelUnbondingDelegation](#msgcancelunbondingdelegation) * [MsgBeginRedelegate](#msgbeginredelegate) * [MsgUpdateParams](#msgupdateparams) + * [MsgRotateConsPubkey](#msgrotateconspubkey) * [Begin-Block](#begin-block) * [Historical Info Tracking](#historical-info-tracking) * [End-Block](#end-block) @@ -270,6 +272,36 @@ A redelegation object is created every time a redelegation occurs. To prevent https://github.com/cosmos/cosmos-sdk/blob/v0.47.0-rc1/proto/cosmos/staking/v1beta1/staking.proto#L263-L308 ``` +## ConsPubkeyRotation + +The `ConsPubkey` of a validator will be instantly rotated to the new `ConsPubkey`. The rotation will be tracked to only allow a limited number of rotations within an unbonding period of time. + +`ConsPubkeyRotation` are indexed in the store as: + +ConsPubKeyRotationHistory: `0x70 | validatorAddrLen(1 byte) | validatorAddr | rotated_height -> ProtocalBuffer(ConsPubKeyRotationHistory)` +ValidatorConsensusKeyRotationRecordQueue: `0x72 | format(time) -> ProtocalBuffer(RotatedValAddrs)` + +ValidatorConsensusKeyRotationRecordIndex:`0x73 | valAddressLen(1 byte) | valAddr | format(time) -> ProtocalBuffer([]Byte{})` + +`ConsPubKeyRotationHistory` is used for querying the rotations of a validator + +`ValidatorConsensusKeyRotationRecordQueue` is to keep track of the rotation across the unbonding period (waiting period in the queue), this be pruned after the unbonding period of waiting time. + +`ValidatorConsensusKeyRotationRecordIndex` is to keep track of a validator that how many rotations were made inside unbonding period. This be pruned after the unbonding period of waiting time. + +A `ConsPubKeyRotationHistory` object is created every time a consensus pubkey rotation occurs. + +To prevent the spam: + +* There will only limited number of rotations can be done within unbonding period of time. +* A non-negligible fee will be deducted for rotating a consensus key. + +Formula to calculate the fees to rotate the key is: + +```go +(max(VotingPowerPercentage, 1) * InitialKeyRotationFee) * 2^(number of rotations in ConsPubKeyRotationHistory in recent unbonding period) +``` + ### Queues All queues objects are sorted by timestamp. The time used within any queue is @@ -317,6 +349,21 @@ which the validator object can be accessed. Typically it is expected that only a single validator record will be associated with a given timestamp however it is possible that multiple validators exist in the queue at the same location. +#### ValidatorConsensusKeyRotationRecordQueue + +For the purpose of tracking progress or consensus pubkey rotations the `ValidatorConsensusKeyRotationRecordQueue` kept. + +* ValidatorConsensusKeyRotationRecordQueue: `0x72 | format(time) -> types.ValAddrsOfRotatedConsKeys` + +Here timestamp will be the unique identifier in the queue which is of future time +(which is calculated with the current block time adding with unbonding period), +Whenever the next item with the same waiting time comes to the queue, we will get +the present store info and append the `ValAddress` to the array and set it back in the store. + +```protobuf reference +https://github.com/cosmos/cosmos-sdk/blob/a97735ef2a23ea6a38693e209848ba71243bbfe7/proto/cosmos/staking/v1beta1/staking.proto#L421-L425 +``` + ### HistoricalInfo HistoricalInfo objects are stored and pruned at each block such that the staking keeper persists @@ -424,7 +471,7 @@ Delegation may be called. When a `cancel unbond delegation` occurs both the `validator`, the `delegation` and an `UnbondingDelegationQueue` state will be updated. * if cancel unbonding delegation amount equals to the `UnbondingDelegation` entry `balance`, then the `UnbondingDelegation` entry deleted from `UnbondingDelegationQueue`. -* if the `cancel unbonding delegation amount is less than the `UnbondingDelegation` entry balance, then the `UnbondingDelegation` entry will be updated with new balance in the `UnbondingDelegationQueue`. +* if the `cancel unbonding delegation` amount is less than the `UnbondingDelegation` entry balance, then the `UnbondingDelegation` entry will be updated with new balance in the `UnbondingDelegationQueue`. * cancel `amount` is [Delegated](#delegations) back to the original `validator`. #### Complete Unbonding @@ -456,6 +503,14 @@ When a redelegations complete the following occurs: * remove the entry from the `Redelegation` object +#### Consensus pubkey rotation + +When a `ConsPubkeyRotation` occurs the validator and the `ValidatorConsensusKeyRotationRecordQueue` are updated: + +* the old consensus pubkey address will be removed from state and new consensus pubkey address will be added in place. +* transfers the voting power to the new consensus pubkey address. +* and triggers the hooks to update the `signing-info` in the `slashing` module * and triggers the hooks to add the deducted fee to the `community pool` funds + ### Slashing #### Slash Validator @@ -723,6 +778,23 @@ The message handling can fail if: * signer is not the authority defined in the staking keeper (usually the gov module account). +### MsgRotateConsPubKey + +The `MsgRotateConsPubKey` updates the consensus pubkey of a validator +with a new pubkey, the validator must pay rotation fees (default fee 1000000stake) to rotate the consensus pubkey. + +```protobuf reference +https://github.com/cosmos/cosmos-sdk/blob/a97735ef2a23ea6a38693e209848ba71243bbfe7/proto/cosmos/staking/v1beta1/tx.proto#L213-L225 +``` + +The message handling can fail if: + +* The new pubkey is not a `cryptotypes.PubKey`. +* The new pubkey is already associated with another validator. +* The validator address is not in validators list. +* The `max_cons_pubkey_rotations` limit reached within unbonding period. +* The validator don't have fee to pay for rotation + ## Begin-Block Each abci begin block call, the historical info will get stored and pruned @@ -816,6 +888,14 @@ Complete the unbonding of all mature `Redelegation.Entries` within the * remove the `Redelegation` object from the store if there are no remaining entries. +#### ConsPubKeyRotations + +After waiting for unbonding period of time the matured rotations will be removed from queues and indexes to unblock the validator for the next iterations + +* remove the mature entry from state of `ValidatorConsensusKeyRotationRecordQueue` +* remove the mature entry form state of +`ValidatorConsensusKeyRotationRecordIndex` + ## Hooks Other modules may register operations to execute when a certain event has @@ -842,7 +922,9 @@ following hooks can registered with staking: * `BeforeDelegationRemoved(Context, AccAddress, ValAddress) error` * called when a delegation is removed * `AfterUnbondingInitiated(Context, UnbondingID)` - * called when an unbonding operation (validator unbonding, unbonding delegation, redelegation) was initiated + * called when an unbonding operation (validator unbonding, unbonding delegation, redelegation) is initiated +* `AfterConsensusPubKeyUpdate(ctx Context, oldpubkey, newpubkey types.PubKey, fee sdk.Coin)` + * called when a consensus pubkey rotation of a validator is initiated. ## Events @@ -936,14 +1018,17 @@ The staking module emits the following events: The staking module contains the following parameters: -| Key | Type | Example | -|-------------------|------------------|------------------------| -| UnbondingTime | string (time ns) | "259200000000000" | -| MaxValidators | uint16 | 100 | -| KeyMaxEntries | uint16 | 7 | -| HistoricalEntries | uint16 | 3 | -| BondDenom | string | "stake" | -| MinCommissionRate | string | "0.000000000000000000" | +| Key | Type | Example | +|------------------------|------------------|------------------------| +| UnbondingTime | string (time ns) | "259200000000000" | +| MaxValidators | uint16 | 100 | +| KeyMaxEntries | uint16 | 7 | +| HistoricalEntries | uint16 | 3 | +| BondDenom | string | "stake" | +| MinCommissionRate | string | "0.000000000000000000" | +| KeyRotationFee | sdk.Coin | "1000000stake" | +| MaxConsPubkeyRotations | int | 10 | + ## Client @@ -1682,6 +1767,21 @@ Example: simd tx staking cancel-unbond cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj 100stake 123123 --from mykey ``` +##### rotate cons pubkey + +The command `rotate-cons-pubkey` allow validators to rotate the associated consensus pubkey to the new consensus pubkey. + +Usage: + +```bash +simd tx staking rotate-cons-pubkey --pubkey [newpubkey] --from key +``` + +Example: + +```bash +simd tx staking rotate-cons-pubkey --pubkey `{"pubkey": {"@type":"/cosmos.crypto.ed25519.PubKey""key":"BnbwFpeONLqvWqJb3qaUbL5aoIcW3fSuAp9nT3z5f20="}}` --from myvalidator +``` ### gRPC diff --git a/x/staking/client/cli/tx.go b/x/staking/client/cli/tx.go index 879fa30589d8..d739c20891f7 100644 --- a/x/staking/client/cli/tx.go +++ b/x/staking/client/cli/tx.go @@ -50,6 +50,7 @@ func NewTxCmd() *cobra.Command { NewRedelegateCmd(), NewUnbondCmd(), NewCancelUnbondingDelegation(), + NewRotateConsensusKeyCmd(), ) return stakingTxCmd @@ -607,3 +608,43 @@ func BuildCreateValidatorMsg(clientCtx client.Context, config TxCreateValidatorC return txBldr, msg, nil } + +func NewRotateConsensusKeyCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "rotate-cons-pubkey", + Short: "rotate validator consensus pub key", + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + valAddr := clientCtx.GetFromAddress() + pkStr, err := cmd.Flags().GetString(FlagPubKey) + if err != nil { + return err + } + + var pk cryptotypes.PubKey + if err := clientCtx.Codec.UnmarshalInterfaceJSON([]byte(pkStr), &pk); err != nil { + return err + } + + msg, err := types.NewMsgRotateConsPubKey(sdk.ValAddress(valAddr), pk) + if err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + cmd.Flags().AddFlagSet(FlagSetPublicKey()) + + flags.AddTxFlagsToCmd(cmd) + + _ = cmd.MarkFlagRequired(flags.FlagFrom) + _ = cmd.MarkFlagRequired(FlagPubKey) + + return cmd +} diff --git a/x/staking/keeper/cons_pubkey.go b/x/staking/keeper/cons_pubkey.go new file mode 100644 index 000000000000..4ef42a4d6bc0 --- /dev/null +++ b/x/staking/keeper/cons_pubkey.go @@ -0,0 +1,201 @@ +package keeper + +import ( + "time" + + storetypes "cosmossdk.io/store/types" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// SetConsPubKeyRotationHistory sets the consensus key rotation of a validator into state +func (k Keeper) SetConsPubKeyRotationHistory( + ctx sdk.Context, valAddr sdk.ValAddress, + oldPubKey, newPubKey *codectypes.Any, height uint64, fee sdk.Coin, +) { + history := types.ConsPubKeyRotationHistory{ + OperatorAddress: valAddr.String(), + OldConsPubkey: oldPubKey, + NewConsPubkey: newPubKey, + Height: height, + Fee: fee, + } + store := ctx.KVStore(k.storeKey) + key := types.GetValidatorConsPubKeyRotationHistoryKey(history) + historyBytes := k.cdc.MustMarshal(&history) + store.Set(key, historyBytes) + + key = types.GetBlockConsPubKeyRotationHistoryKey(history) + store.Set(key, historyBytes) + queueTime := ctx.BlockHeader().Time.Add(k.UnbondingTime(ctx)) + + k.SetConsKeyQueue(ctx, queueTime, valAddr) + k.SetConsKeyIndex(ctx, valAddr, queueTime) +} + +func (k Keeper) updateToNewPubkey(ctx sdk.Context, val types.Validator, oldPubKey, newPubKey *codectypes.Any, fee sdk.Coin) error { + if err := k.DeleteValidatorByConsAddr(ctx, val); err != nil { + return err + } + + k.DeleteValidatorByPowerIndex(ctx, val) + + val.ConsensusPubkey = newPubKey + k.SetValidator(ctx, val) + if err := k.SetValidatorByConsAddr(ctx, val); err != nil { + return err + } + + k.SetValidatorByPowerIndex(ctx, val) + + oldPk := oldPubKey.GetCachedValue().(cryptotypes.PubKey) + newPk := newPubKey.GetCachedValue().(cryptotypes.PubKey) + + // Sets a map to newly rotated consensus key with old consensus key + k.setMappedConskey(ctx, sdk.ConsAddress(oldPk.Address()), sdk.ConsAddress(newPk.Address())) + + if err := k.Hooks().AfterConsensusPubKeyUpdate(ctx, oldPk, newPk, fee); err != nil { + return err + } + + return nil +} + +// GetValidatorConsPubKeyRotationHistory iterates over all the rotated history objects in the state with the given valAddr and returns. +func (k Keeper) GetValidatorConsPubKeyRotationHistory(ctx sdk.Context, operatorAddress sdk.ValAddress) (historyObjects []types.ConsPubKeyRotationHistory) { + store := ctx.KVStore(k.storeKey) + + iterator := storetypes.KVStorePrefixIterator(store, types.GetValidatorConsPubKeyRotationHistoryPrefix(operatorAddress.String())) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + var history types.ConsPubKeyRotationHistory + + k.cdc.MustUnmarshal(iterator.Value(), &history) + historyObjects = append(historyObjects, history) + } + return +} + +// GetBlockConsPubKeyRotationHistory iterator over the rotation history for the given height. +func (k Keeper) GetBlockConsPubKeyRotationHistory(ctx sdk.Context, height int64) []types.ConsPubKeyRotationHistory { + var historyObjects []types.ConsPubKeyRotationHistory + store := ctx.KVStore(k.storeKey) + + iterator := storetypes.KVStorePrefixIterator(store, types.GetBlockConsPubKeyRotationHistoryPrefix(height)) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + var history types.ConsPubKeyRotationHistory + + k.cdc.MustUnmarshal(iterator.Value(), &history) + historyObjects = append(historyObjects, history) + } + return historyObjects +} + +// GetConsKeyQueue gets and returns the `types.ValAddrsOfRotatedConsKeys` with the given time. +func (k Keeper) GetConsKeyQueue(ctx sdk.Context, ts time.Time) types.ValAddrsOfRotatedConsKeys { + var valAddrs types.ValAddrsOfRotatedConsKeys + store := ctx.KVStore(k.storeKey) + key := types.GetConsKeyRotationTimeKey(ts) + bz := store.Get(key) + if bz == nil { + return valAddrs + } + k.cdc.MustUnmarshal(bz, &valAddrs) + return valAddrs +} + +// SetConsKeyQueue sets array of rotated validator addresses to a key of current block time + unbonding period +// this is to keep track of rotations made within the unbonding period +func (k Keeper) SetConsKeyQueue(ctx sdk.Context, ts time.Time, valAddr sdk.ValAddress) { + operKeys := k.GetConsKeyQueue(ctx, ts) + operKeys.Addresses = append(operKeys.Addresses, valAddr.String()) + key := types.GetConsKeyRotationTimeKey(ts) + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshal(&operKeys) + store.Set(key, bz) +} + +// SetConsKeyIndex sets empty bytes with the key (validatoraddress | sum(current_block_time, unbondtime)) +func (k Keeper) SetConsKeyIndex(ctx sdk.Context, valAddr sdk.ValAddress, ts time.Time) { + store := ctx.KVStore(k.storeKey) + key := types.GetConsKeyIndexKey(valAddr, ts) + store.Set(key, []byte{}) +} + +// UpdateAllMaturedConsKeyRotatedKeys udpates all the matured key rotations. +func (k Keeper) UpdateAllMaturedConsKeyRotatedKeys(ctx sdk.Context, maturedTime time.Time) { + maturedRotatedValAddrs := k.GetAllMaturedRotatedKeys(ctx, maturedTime) + for _, valAddrStr := range maturedRotatedValAddrs { + valAddr, err := sdk.ValAddressFromBech32(valAddrStr) + if err != nil { + panic(err) + } + + k.deleteConsKeyIndexKey(ctx, valAddr, maturedTime) + } +} + +// GetAllMaturedRotatedKeys returns all matured valaddresses . +func (k Keeper) GetAllMaturedRotatedKeys(ctx sdk.Context, matureTime time.Time) []string { + store := ctx.KVStore(k.storeKey) + var ValAddresses []string + iterator := store.Iterator(types.ValidatorConsensusKeyRotationRecordQueueKey, storetypes.InclusiveEndBytes(types.GetConsKeyRotationTimeKey(matureTime))) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + var operKey types.ValAddrsOfRotatedConsKeys + k.cdc.MustUnmarshal(iterator.Value(), &operKey) + ValAddresses = append(ValAddresses, operKey.Addresses...) + store.Delete(iterator.Key()) + } + + return ValAddresses +} + +// deleteConsKeyIndexKey deletes the key which is formed with the given valAddr, time. +func (k Keeper) deleteConsKeyIndexKey(ctx sdk.Context, valAddr sdk.ValAddress, ts time.Time) { + store := ctx.KVStore(k.storeKey) + key := types.GetConsKeyIndexKey(valAddr, ts) + iterator := store.Iterator(types.ValidatorConsensusKeyRotationRecordIndexKey, storetypes.InclusiveEndBytes(key)) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + store.Delete(iterator.Key()) + } +} + +// CheckLimitOfMaxRotationsExceed returns bool, count of iterations made within the unbonding period. +func (k Keeper) CheckLimitOfMaxRotationsExceed(ctx sdk.Context, valAddr sdk.ValAddress) bool { + store := ctx.KVStore(k.storeKey) + key := append(types.ValidatorConsensusKeyRotationRecordIndexKey, address.MustLengthPrefix(valAddr)...) + prefixIterator := storetypes.KVStorePrefixIterator(store, key) + defer prefixIterator.Close() + + for ; prefixIterator.Valid(); prefixIterator.Next() { + return true + } + + return false +} + +// setMappedConskey maps the old consensus key to rotated new consensus key +func (k Keeper) setMappedConskey(ctx sdk.Context, oldConsAddr, newConsAddr sdk.ConsAddress) { + store := ctx.KVStore(k.storeKey) + key := types.GetKeyRotatedConsKey(oldConsAddr.Bytes()) + store.Set(key, newConsAddr.Bytes()) +} + +// GetMappedConskey gets the rotated consensus key with the old consensus key +func (k Keeper) GetMappedConsKey(ctx sdk.Context, consAddr sdk.ConsAddress) sdk.ConsAddress { + store := ctx.KVStore(k.storeKey) + key := types.GetKeyRotatedConsKey(consAddr.Bytes()) + bz := store.Get(key) + + return sdk.ConsAddress(bz) +} diff --git a/x/staking/keeper/cons_pubkey_test.go b/x/staking/keeper/cons_pubkey_test.go new file mode 100644 index 000000000000..8f5036bf9fb6 --- /dev/null +++ b/x/staking/keeper/cons_pubkey_test.go @@ -0,0 +1,224 @@ +package keeper_test + +import ( + "testing" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/testutil" + "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/golang/mock/gomock" +) + +func (s *KeeperTestSuite) TestConsPubKeyRotationHistory() { + stakingKeeper, ctx := s.stakingKeeper, s.ctx + + _, addrVals := createValAddrs(2) + + // create a validator with a self-delegation + val := testutil.NewValidator(s.T(), addrVals[0], PKs[0]) + valTokens := stakingKeeper.TokensFromConsensusPower(ctx, 10) + val, issuedShares := val.AddTokensFromDel(valTokens) + s.Require().Equal(valTokens, issuedShares.RoundInt()) + + s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), types.NotBondedPoolName, types.BondedPoolName, gomock.Any()) + _ = stakingkeeper.TestingUpdateValidator(stakingKeeper, ctx, val, true) + val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) + selfDelegation := types.NewDelegation(val0AccAddr, addrVals[0], issuedShares) + + stakingKeeper.SetDelegation(ctx, selfDelegation) + + validators := stakingKeeper.GetAllValidators(ctx) + s.Require().Len(validators, 1) + + validator := validators[0] + valAddr, err := sdk.ValAddressFromBech32(validator.OperatorAddress) + s.Require().NoError(err) + + historyObjects := stakingKeeper.GetValidatorConsPubKeyRotationHistory(ctx, valAddr) + s.Require().Len(historyObjects, 0) + + newConsPub, err := codectypes.NewAnyWithValue(PKs[1]) + s.Require().NoError(err) + + newConsPub2, err := codectypes.NewAnyWithValue(PKs[2]) + s.Require().NoError(err) + + stakingKeeper.SetConsPubKeyRotationHistory(ctx, + valAddr, + validator.ConsensusPubkey, + newConsPub, + uint64(ctx.BlockHeight()), + stakingKeeper.KeyRotationFee(ctx), + ) + + historyObjects = stakingKeeper.GetValidatorConsPubKeyRotationHistory(ctx, valAddr) + s.Require().Len(historyObjects, 1) + + historyObjects = stakingKeeper.GetBlockConsPubKeyRotationHistory(ctx, ctx.BlockHeight()) + s.Require().Len(historyObjects, 1) + + stakingKeeper.SetConsPubKeyRotationHistory(ctx, + valAddr, + newConsPub, + newConsPub2, + uint64(ctx.BlockHeight())+1, + stakingKeeper.KeyRotationFee(ctx), + ) + + historyObjects = stakingKeeper.GetValidatorConsPubKeyRotationHistory(ctx, valAddr) + s.Require().Len(historyObjects, 2) + + historyObjects = stakingKeeper.GetBlockConsPubKeyRotationHistory(ctx, ctx.BlockHeight()) + s.Require().Len(historyObjects, 1) +} + +func (s *KeeperTestSuite) TestConsKeyRotn() { + stakingKeeper, ctx, accountKeeper, bankKeeper := s.stakingKeeper, s.ctx, s.accountKeeper, s.bankKeeper + + msgServer := stakingkeeper.NewMsgServerImpl(stakingKeeper) + s.setValidators(4) + validators := stakingKeeper.GetAllValidators(ctx) + s.Require().Len(validators, 4) + + existingPubkey, ok := validators[1].ConsensusPubkey.GetCachedValue().(cryptotypes.PubKey) + s.Require().True(ok) + + bondedPool := authtypes.NewEmptyModuleAccount(types.BondedPoolName) + accountKeeper.EXPECT().GetModuleAccount(gomock.Any(), types.BondedPoolName).Return(bondedPool).AnyTimes() + bankKeeper.EXPECT().GetBalance(gomock.Any(), bondedPool.GetAddress(), sdk.DefaultBondDenom).Return(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000000))).AnyTimes() + + testCases := []struct { + name string + malleate func() sdk.Context + validator sdk.ValAddress + newPubKey cryptotypes.PubKey + isErr bool + errMsg string + }{ + { + name: "1st iteration no error", + malleate: func() sdk.Context { + bankKeeper.EXPECT().SendCoinsFromAccountToModule(gomock.Any(), sdk.AccAddress(validators[0].GetOperator()), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + return ctx + }, + isErr: false, + errMsg: "", + newPubKey: PKs[499], + validator: validators[0].GetOperator(), + }, + { + name: "pubkey already associated with another validator", + malleate: func() sdk.Context { return ctx }, + isErr: true, + errMsg: "consensus pubkey is already used for a validator", + newPubKey: existingPubkey, + validator: validators[0].GetOperator(), + }, + { + name: "non existing validator", + malleate: func() sdk.Context { return ctx }, + isErr: true, + errMsg: "validator does not exist", + newPubKey: PKs[498], + validator: sdk.ValAddress("non_existing_val"), + }, + { + name: "limit exceeding", + malleate: func() sdk.Context { + bankKeeper.EXPECT().SendCoinsFromAccountToModule(gomock.Any(), sdk.AccAddress(validators[2].GetOperator()), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + + req, err := types.NewMsgRotateConsPubKey(validators[2].GetOperator(), PKs[495]) + s.Require().NoError(err) + _, err = msgServer.RotateConsPubKey(ctx, req) + s.Require().NoError(err) + + return ctx + }, + isErr: true, + errMsg: "exceeding maximum consensus pubkey rotations within unbonding period", + newPubKey: PKs[494], + validator: validators[2].GetOperator(), + }, + { + name: "limit exceeding, but it should rotate after unbonding period", + malleate: func() sdk.Context { + params := stakingKeeper.GetParams(ctx) + bankKeeper.EXPECT().SendCoinsFromAccountToModule(gomock.Any(), sdk.AccAddress(validators[3].GetOperator()), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + + // 1st rotation should pass, since limit is 1 + req, err := types.NewMsgRotateConsPubKey(validators[3].GetOperator(), PKs[494]) + s.Require().NoError(err) + _, err = msgServer.RotateConsPubKey(ctx, req) + s.Require().NoError(err) + + // this shouldn't mature the recent rotation since unbonding period isn't reached + stakingKeeper.UpdateAllMaturedConsKeyRotatedKeys(ctx, ctx.BlockHeader().Time) + + // 2nd rotation should fail since limit exceeding + req, err = types.NewMsgRotateConsPubKey(validators[3].GetOperator(), PKs[493]) + s.Require().NoError(err) + _, err = msgServer.RotateConsPubKey(ctx, req) + s.Require().Error(err, "exceeding maximum consensus pubkey rotations within unbonding period") + + // This should remove the keys from queue + // after setting the blocktime to reach the unbonding period + newCtx := ctx.WithBlockTime(ctx.BlockHeader().Time.Add(params.UnbondingTime)) + stakingKeeper.UpdateAllMaturedConsKeyRotatedKeys(newCtx, newCtx.BlockHeader().Time) + return newCtx + }, + isErr: false, + newPubKey: PKs[493], + validator: validators[3].GetOperator(), + }, + } + + for _, tc := range testCases { + s.T().Run(tc.name, func(t *testing.T) { + newCtx := tc.malleate() + + req, err := types.NewMsgRotateConsPubKey(tc.validator, tc.newPubKey) + s.Require().NoError(err) + + _, err = msgServer.RotateConsPubKey(newCtx, req) + if tc.isErr { + s.Require().Error(err) + s.Require().Contains(err.Error(), tc.errMsg) + } else { + s.Require().NoError(err) + _, err = stakingKeeper.EndBlocker(newCtx) + s.Require().NoError(err) + + valInfo, found := stakingKeeper.GetValidator(newCtx, tc.validator) + s.Require().True(found) + s.Require().Equal(valInfo.ConsensusPubkey, req.NewPubkey) + } + }) + } +} + +func (s *KeeperTestSuite) setValidators(n int) { + stakingKeeper, ctx := s.stakingKeeper, s.ctx + + _, addrVals := createValAddrs(n) + + for i := 0; i < n; i++ { + val := testutil.NewValidator(s.T(), addrVals[i], PKs[i]) + valTokens := stakingKeeper.TokensFromConsensusPower(ctx, 10) + val, issuedShares := val.AddTokensFromDel(valTokens) + s.Require().Equal(valTokens, issuedShares.RoundInt()) + + s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), types.NotBondedPoolName, types.BondedPoolName, gomock.Any()) + _ = stakingkeeper.TestingUpdateValidator(stakingKeeper, ctx, val, true) + val0AccAddr := sdk.AccAddress(addrVals[i].Bytes()) + selfDelegation := types.NewDelegation(val0AccAddr, addrVals[i], issuedShares) + stakingKeeper.SetDelegation(ctx, selfDelegation) + stakingKeeper.SetValidatorByConsAddr(ctx, val) + } + + validators := stakingKeeper.GetAllValidators(ctx) + s.Require().Len(validators, n) +} diff --git a/x/staking/keeper/hooks_test.go b/x/staking/keeper/hooks_test.go new file mode 100644 index 000000000000..b9cedf628d65 --- /dev/null +++ b/x/staking/keeper/hooks_test.go @@ -0,0 +1,15 @@ +package keeper_test + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func (s *KeeperTestSuite) TestHookAfterConsensusPubKeyUpdate() { + stKeeper := s.stakingKeeper + ctx := s.ctx + require := s.Require() + + rotationFee := sdk.NewInt64Coin("stake", 1000000) + err := stKeeper.Hooks().AfterConsensusPubKeyUpdate(ctx, PKs[0], PKs[1], rotationFee) + require.NoError(err) +} diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 94793e455760..0e049e968bb3 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -16,6 +16,7 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -558,3 +559,68 @@ func (k msgServer) UpdateParams(goCtx context.Context, msg *types.MsgUpdateParam return &types.MsgUpdateParamsResponse{}, nil } + +func (k msgServer) RotateConsPubKey(goCtx context.Context, msg *types.MsgRotateConsPubKey) (res *types.MsgRotateConsPubKeyResponse, err error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + pk, ok := msg.NewPubkey.GetCachedValue().(cryptotypes.PubKey) + if !ok { + return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidType, "expecting cryptotypes.PubKey, got %T", pk) + } + + newConsAddr := sdk.ConsAddress(pk.Address()) + + // checks if NewPubKey is not duplicated on ValidatorsByConsAddr + validator := k.Keeper.ValidatorByConsAddr(ctx, newConsAddr) + if validator != nil { + return nil, types.ErrConsensusPubKeyAlreadyUsedForAValidator + } + + valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) + if err != nil { + return nil, err + } + + validator, found := k.Keeper.GetValidator(ctx, valAddr) + if !found { + return nil, types.ErrNoValidatorFound + } + + if validator.GetStatus() != types.Bonded { + return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidType, "invalid validator status: %s", validator.GetStatus()) + } + + // Check if the validator is exceeding parameter MaxConsPubKeyRotations within the + // unbonding period by iterating ConsPubKeyRotationHistory. + isExceedingLimit := k.CheckLimitOfMaxRotationsExceed(ctx, valAddr) + + if isExceedingLimit { + return nil, types.ErrExceedingMaxConsPubKeyRotations + } + + // Check if the signing account has enough balance to pay KeyRotationFee + // KeyRotationFees are sent to the community fund. + rotationFee := k.KeyRotationFee(ctx) + err = k.Keeper.bankKeeper.SendCoinsFromAccountToModule(ctx, sdk.AccAddress(valAddr), distrtypes.ModuleName, sdk.NewCoins(rotationFee)) + if err != nil { + return nil, err + } + + // overwrites NewPubKey in validator.ConsPubKey + val, ok := validator.(types.Validator) + if !ok { + return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidType, "Expecting types.Validator, got %T", validator) + } + + // Add ConsPubKeyRotationHistory for tracking rotation + k.SetConsPubKeyRotationHistory( + ctx, + validator.GetOperator(), + val.ConsensusPubkey, + msg.NewPubkey, + uint64(ctx.BlockHeight()), + rotationFee, + ) + + return res, err +} diff --git a/x/staking/keeper/params.go b/x/staking/keeper/params.go index 74316694d9bf..57e938e0f160 100644 --- a/x/staking/keeper/params.go +++ b/x/staking/keeper/params.go @@ -73,3 +73,7 @@ func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { k.cdc.MustUnmarshal(bz, ¶ms) return params } + +func (k Keeper) KeyRotationFee(ctx sdk.Context) (res sdk.Coin) { + return k.GetParams(ctx).KeyRotationFee +} diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index d459ed6ff318..e6af4d025854 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -10,6 +10,8 @@ import ( "cosmossdk.io/math" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -98,6 +100,8 @@ func (k Keeper) BlockValidatorUpdates(ctx sdk.Context) []abci.ValidatorUpdate { ) } + k.UpdateAllMaturedConsKeyRotatedKeys(ctx, ctx.BlockHeader().Time) + return validatorUpdates } @@ -206,6 +210,50 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab updates = append(updates, validator.ABCIValidatorUpdateZero()) } + // ApplyAndReturnValidatorSetUpdates checks if there is ConsPubKeyRotationHistory + // with ConsPubKeyRotationHistory.RotatedHeight == ctx.BlockHeight() and if so, generates 2 ValidatorUpdate, + // one for a remove validator and one for create new validator + historyObjects := k.GetBlockConsPubKeyRotationHistory(ctx, ctx.BlockHeight()) + for _, history := range historyObjects { + valAddr, err := sdk.ValAddressFromBech32(history.OperatorAddress) + if err != nil { + return nil, err + } + + validator := k.mustGetValidator(ctx, valAddr) + + oldPk := history.OldConsPubkey.GetCachedValue().(cryptotypes.PubKey) + oldTmPk, err := cryptocodec.ToCmtProtoPublicKey(oldPk) + if err != nil { + return nil, err + } + + newPk := history.NewConsPubkey.GetCachedValue().(cryptotypes.PubKey) + newTmPk, err := cryptocodec.ToCmtProtoPublicKey(newPk) + if err != nil { + return nil, err + } + + if !(validator.Jailed || validator.Status != types.Bonded) { + updates = append(updates, abci.ValidatorUpdate{ + PubKey: oldTmPk, + Power: 0, + }) + + updates = append(updates, abci.ValidatorUpdate{ + PubKey: newTmPk, + Power: validator.ConsensusPower(powerReduction), + }) + + if err := k.updateToNewPubkey(ctx, validator, history.OldConsPubkey, history.NewConsPubkey, history.Fee); err != nil { + return nil, err + } + } + } + + // TODO: at previousVotes Iteration logic of AllocateTokens, previousVote using OldConsPubKey + // match up with ConsPubKeyRotationHistory, and replace validator for token allocation + // Update the pools based on the recent updates in the validator set: // - The tokens from the non-bonded candidates that enter the new validator set need to be transferred // to the Bonded pool. diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index a9dd09d3c311..bacd9e5d1da0 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -41,7 +41,11 @@ func (k Keeper) GetValidatorByConsAddr(ctx sdk.Context, consAddr sdk.ConsAddress opAddr := store.Get(types.GetValidatorByConsAddrKey(consAddr)) if opAddr == nil { - return validator, false + if mappedConsAddr := k.GetMappedConsKey(ctx, consAddr); mappedConsAddr != nil { + if opAddr = store.Get(types.GetValidatorByConsAddrKey(mappedConsAddr)); opAddr == nil { + return validator, false + } + } } return k.GetValidator(ctx, opAddr) @@ -74,6 +78,17 @@ func (k Keeper) SetValidatorByConsAddr(ctx sdk.Context, validator types.Validato return nil } +// validator index +func (k Keeper) DeleteValidatorByConsAddr(ctx sdk.Context, validator types.ValidatorI) error { + consPk, err := validator.GetConsAddr() + if err != nil { + return err + } + store := ctx.KVStore(k.storeKey) + store.Delete(types.GetValidatorByConsAddrKey(consPk)) + return nil +} + // validator index func (k Keeper) SetValidatorByPowerIndex(ctx sdk.Context, validator types.Validator) { // jailed validators are not kept in the power index diff --git a/x/staking/keeper/validator_test.go b/x/staking/keeper/validator_test.go index 363378d96503..623131f34b2a 100644 --- a/x/staking/keeper/validator_test.go +++ b/x/staking/keeper/validator_test.go @@ -9,6 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" abci "github.com/cometbft/cometbft/abci/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/cosmos/cosmos-sdk/x/staking/testutil" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -417,3 +418,65 @@ func (s *KeeperTestSuite) TestUnbondingValidator() { require.True(found) require.Equal(stakingtypes.Unbonded, validator.Status) } + +func (s *KeeperTestSuite) TestValidatorConsPubKeyUpdate() { + ctx, keeper, msgServer, bk, ak := s.ctx, s.stakingKeeper, s.msgServer, s.bankKeeper, s.accountKeeper + require := s.Require() + + powers := []int64{10, 20} + var validators [2]stakingtypes.Validator + + bonedPool := authtypes.NewEmptyModuleAccount(stakingtypes.BondedPoolName) + ak.EXPECT().GetModuleAccount(gomock.Any(), stakingtypes.BondedPoolName).Return(bonedPool).AnyTimes() + bk.EXPECT().GetBalance(gomock.Any(), bonedPool.GetAddress(), sdk.DefaultBondDenom).Return(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000000))).AnyTimes() + + for i, power := range powers { + valAddr := sdk.ValAddress(PKs[i].Address().Bytes()) + validators[i] = testutil.NewValidator(s.T(), valAddr, PKs[i]) + tokens := keeper.TokensFromConsensusPower(ctx, power) + + validators[i], _ = validators[i].AddTokensFromDel(tokens) + keeper.SetValidator(ctx, validators[i]) + keeper.SetValidatorByPowerIndex(ctx, validators[i]) + keeper.SetValidatorByConsAddr(ctx, validators[i]) + + s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any()) + updates := s.applyValidatorSetUpdates(ctx, keeper, 1) + validator, found := keeper.GetValidator(ctx, valAddr) + require.True(found) + require.Equal(validator.ABCIValidatorUpdate(keeper.PowerReduction(ctx)), updates[0]) + } + + params := keeper.GetParams(ctx) + params.KeyRotationFee = sdk.NewInt64Coin(sdk.DefaultBondDenom, 1000) + keeper.SetParams(ctx, params) + + valAddr1 := sdk.ValAddress(PKs[0].Address().Bytes()) + + msg, err := stakingtypes.NewMsgRotateConsPubKey( + valAddr1, + PKs[499], // taking the last element from PKs + ) + + require.NoError(err) + + bk.EXPECT().SendCoinsFromAccountToModule(ctx, sdk.AccAddress(valAddr1), gomock.Any(), gomock.Any()).AnyTimes() + _, err = msgServer.RotateConsPubKey(ctx, msg) + require.NoError(err) + + updates := s.applyValidatorSetUpdates(ctx, keeper, 2) + + originalPubKey, err := validators[0].CmtConsPublicKey() + require.NoError(err) + + validator, found := keeper.GetValidator(ctx, valAddr1) + require.True(found) + + newPubKey, err := validator.CmtConsPublicKey() + require.NoError(err) + + require.Equal(int64(0), updates[0].Power) + require.Equal(originalPubKey, updates[0].PubKey) + require.Equal(int64(10), updates[1].Power) + require.Equal(newPubKey, updates[1].PubKey) +} diff --git a/x/staking/migrations/v3/json_test.go b/x/staking/migrations/v3/json_test.go index c111f366515e..e9151867918b 100644 --- a/x/staking/migrations/v3/json_test.go +++ b/x/staking/migrations/v3/json_test.go @@ -43,6 +43,10 @@ func TestMigrateJSON(t *testing.T) { "params": { "bond_denom": "stake", "historical_entries": 10000, + "key_rotation_fee": { + "amount": "1000000", + "denom": "stake" + }, "max_entries": 7, "max_validators": 100, "min_commission_rate": "0.000000000000000000", diff --git a/x/staking/simulation/genesis.go b/x/staking/simulation/genesis.go index 1716fff3da8c..3c453ed64c71 100644 --- a/x/staking/simulation/genesis.go +++ b/x/staking/simulation/genesis.go @@ -19,6 +19,7 @@ const ( unbondingTime = "unbonding_time" maxValidators = "max_validators" historicalEntries = "historical_entries" + keyRotationFee = "cons_pubkey_rotation_fee" ) // genUnbondingTime returns randomized UnbondingTime @@ -36,6 +37,11 @@ func getHistEntries(r *rand.Rand) uint32 { return uint32(r.Intn(int(types.DefaultHistoricalEntries + 1))) } +// getKeyRotationFee returns randomized keyRotationFee between 10000-1000000. +func getKeyRotationFee(r *rand.Rand) sdk.Coin { + return sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(r.Int63n(types.DefaultKeyRotationFee.Amount.Int64()-10000)+10000)) +} + // RandomizedGenState generates a random GenesisState for staking func RandomizedGenState(simState *module.SimulationState) { // params @@ -43,7 +49,8 @@ func RandomizedGenState(simState *module.SimulationState) { unbondTime time.Duration maxVals uint32 histEntries uint32 - minCommissionRate sdkmath.LegacyDec + minCommissionRate sdk.Dec + rotationFee sdk.Coin ) simState.AppParams.GetOrGenerate(unbondingTime, &unbondTime, simState.Rand, func(r *rand.Rand) { unbondTime = genUnbondingTime(r) }) @@ -52,10 +59,15 @@ func RandomizedGenState(simState *module.SimulationState) { simState.AppParams.GetOrGenerate(historicalEntries, &histEntries, simState.Rand, func(r *rand.Rand) { histEntries = getHistEntries(r) }) + simState.AppParams.GetOrGenerate( + keyRotationFee, &histEntries, simState.Rand, + func(r *rand.Rand) { rotationFee = getKeyRotationFee(r) }, + ) + // NOTE: the slashing module need to be defined after the staking module on the // NewSimulationManager constructor for this to work simState.UnbondTime = unbondTime - params := types.NewParams(simState.UnbondTime, maxVals, 7, histEntries, simState.BondDenom, minCommissionRate) + params := types.NewParams(simState.UnbondTime, maxVals, 7, histEntries, simState.BondDenom, minCommissionRate, rotationFee) // validators & delegations var ( diff --git a/x/staking/simulation/genesis_test.go b/x/staking/simulation/genesis_test.go index c0c8835a78e0..216b38e4f687 100644 --- a/x/staking/simulation/genesis_test.go +++ b/x/staking/simulation/genesis_test.go @@ -63,9 +63,9 @@ func TestRandomizedGenState(t *testing.T) { require.Equal(t, "BOND_STATUS_UNBONDED", stakingGenesis.Validators[2].Status.String()) require.Equal(t, "1000", stakingGenesis.Validators[2].Tokens.String()) require.Equal(t, "1000.000000000000000000", stakingGenesis.Validators[2].DelegatorShares.String()) - require.Equal(t, "0.292059246265731326", stakingGenesis.Validators[2].Commission.CommissionRates.Rate.String()) - require.Equal(t, "0.330000000000000000", stakingGenesis.Validators[2].Commission.CommissionRates.MaxRate.String()) - require.Equal(t, "0.038337453731274481", stakingGenesis.Validators[2].Commission.CommissionRates.MaxChangeRate.String()) + require.Equal(t, "0.760000000000000000", stakingGenesis.Validators[2].Commission.CommissionRates.Rate.String()) + require.Equal(t, "0.760000000000000000", stakingGenesis.Validators[2].Commission.CommissionRates.MaxRate.String()) + require.Equal(t, "0.312739151653465930", stakingGenesis.Validators[2].Commission.CommissionRates.MaxChangeRate.String()) require.Equal(t, "1", stakingGenesis.Validators[2].MinSelfDelegation.String()) } diff --git a/x/staking/simulation/operations.go b/x/staking/simulation/operations.go index de8276d29129..17ac75a7d6ac 100644 --- a/x/staking/simulation/operations.go +++ b/x/staking/simulation/operations.go @@ -25,6 +25,7 @@ const ( DefaultWeightMsgUndelegate int = 100 DefaultWeightMsgBeginRedelegate int = 100 DefaultWeightMsgCancelUnbondingDelegation int = 100 + DefaultWeightMsgRotateConsPubKey int = 100 OpWeightMsgCreateValidator = "op_weight_msg_create_validator" OpWeightMsgEditValidator = "op_weight_msg_edit_validator" @@ -32,6 +33,7 @@ const ( OpWeightMsgUndelegate = "op_weight_msg_undelegate" OpWeightMsgBeginRedelegate = "op_weight_msg_begin_redelegate" OpWeightMsgCancelUnbondingDelegation = "op_weight_msg_cancel_unbonding_delegation" + OpWeightMsgRotateConsPubKey = "op_weight_msg_rotate_cons_pubkey" ) // WeightedOperations returns all the operations from the module with their respective weights @@ -50,6 +52,7 @@ func WeightedOperations( weightMsgUndelegate int weightMsgBeginRedelegate int weightMsgCancelUnbondingDelegation int + weightMsgRotateConsPubKey int ) appParams.GetOrGenerate(OpWeightMsgCreateValidator, &weightMsgCreateValidator, nil, func(_ *rand.Rand) { @@ -76,6 +79,12 @@ func WeightedOperations( weightMsgCancelUnbondingDelegation = DefaultWeightMsgCancelUnbondingDelegation }) + appParams.GetOrGenerate(OpWeightMsgRotateConsPubKey, &weightMsgRotateConsPubKey, nil, + func(_ *rand.Rand) { + weightMsgRotateConsPubKey = DefaultWeightMsgRotateConsPubKey + }, + ) + return simulation.WeightedOperations{ simulation.NewWeightedOperation( weightMsgCreateValidator, @@ -101,6 +110,10 @@ func WeightedOperations( weightMsgCancelUnbondingDelegation, SimulateMsgCancelUnbondingDelegate(txGen, ak, bk, k), ), + simulation.NewWeightedOperation( + weightMsgRotateConsPubKey, + SimulateMsgRotateConsPubKey(txGen, ak, bk, k), + ), } } @@ -125,6 +138,12 @@ func SimulateMsgCreateValidator( return simtypes.NoOpMsg(types.ModuleName, msgType, "validator already exists"), nil, nil } + consPubKey := sdk.GetConsAddress(simAccount.ConsKey.PubKey()) + _, found = k.GetValidatorByConsAddr(ctx, consPubKey) + if found { + return simtypes.NoOpMsg(types.ModuleName, msgType, "cons key already used"), nil, nil + } + denom := k.GetParams(ctx).BondDenom balance := bk.GetBalance(ctx, simAccount.Address, denom).Amount @@ -600,3 +619,87 @@ func SimulateMsgBeginRedelegate( return simulation.GenAndDeliverTxWithRandFees(txCtx) } } + +func SimulateMsgRotateConsPubKey(txGen client.TxConfig, ak types.AccountKeeper, bk types.BankKeeper, k *keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + msgType := sdk.MsgTypeURL(&types.MsgRotateConsPubKey{}) + + if len(k.GetAllValidators(ctx)) == 0 { + return simtypes.NoOpMsg(types.ModuleName, msgType, "number of validators equal zero"), nil, nil + } + + val, ok := testutil.RandSliceElem(r, k.GetAllValidators(ctx)) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, msgType, "unable to pick a validator"), nil, nil + } + + if val.Status != types.Bonded || val.ConsensusPower(sdk.DefaultPowerReduction) == 0 { + return simtypes.NoOpMsg(types.ModuleName, msgType, "validator not bonded."), nil, nil + } + + simAccount, found := simtypes.FindAccount(accs, sdk.AccAddress(val.GetOperator())) + if !found { + return simtypes.NoOpMsg(types.ModuleName, msgType, "unable to find account"), nil, fmt.Errorf("validator %s not found", val.GetOperator()) + } + + cons, err := val.GetConsAddr() + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msgType, "cannot get conskey"), nil, err + } + + acc, _ := simtypes.RandomAcc(r, accs) + if cons.String() == sdk.ConsAddress(acc.ConsKey.PubKey().Address()).String() { + return simtypes.NoOpMsg(types.ModuleName, msgType, "new pubkey and current pubkey should be different"), nil, nil + } + + account := ak.GetAccount(ctx, simAccount.Address) + if account == nil { + return simtypes.NoOpMsg(types.ModuleName, msgType, "unable to find account"), nil, nil + } + + spendable := bk.SpendableCoins(ctx, account.GetAddress()) + fee := k.KeyRotationFee(ctx) + if !spendable.IsAllGTE(sdk.NewCoins(fee)) { + return simtypes.NoOpMsg(types.ModuleName, msgType, "not enough balance to pay fee"), nil, nil + } + + valAddr := val.GetOperator() + if k.CheckLimitOfMaxRotationsExceed(ctx, valAddr) { + return simtypes.NoOpMsg(types.ModuleName, msgType, "rotations limit reached within unbonding period"), nil, nil + } + + _, found = k.GetValidatorByConsAddr(ctx, cons) + if !found { + return simtypes.NoOpMsg(types.ModuleName, msgType, "validator not found"), nil, nil + } + + newConsAddr := sdk.ConsAddress(acc.ConsKey.PubKey().Address()) + _, found = k.GetValidatorByConsAddr(ctx, newConsAddr) + if found { + return simtypes.NoOpMsg(types.ModuleName, msgType, "cons key already used"), nil, nil + } + + msg, err := types.NewMsgRotateConsPubKey(valAddr, acc.ConsKey.PubKey()) + if err != nil { + return simtypes.NoOpMsg(types.ModuleName, msgType, "unable to build msg"), nil, err + } + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: txGen, + Cdc: nil, + Msg: msg, + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: spendable, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} diff --git a/x/staking/simulation/operations_test.go b/x/staking/simulation/operations_test.go index 453ac35a3ac5..f7c279bb3f2a 100644 --- a/x/staking/simulation/operations_test.go +++ b/x/staking/simulation/operations_test.go @@ -147,6 +147,7 @@ func (s *SimTestSuite) TestWeightedOperations() { {simulation.DefaultWeightMsgUndelegate, types.ModuleName, sdk.MsgTypeURL(&types.MsgUndelegate{})}, {simulation.DefaultWeightMsgBeginRedelegate, types.ModuleName, sdk.MsgTypeURL(&types.MsgBeginRedelegate{})}, {simulation.DefaultWeightMsgCancelUnbondingDelegation, types.ModuleName, sdk.MsgTypeURL(&types.MsgCancelUnbondingDelegation{})}, + {simulation.DefaultWeightMsgRotateConsPubKey, types.ModuleName, sdk.MsgTypeURL(&types.MsgRotateConsPubKey{})}, } for i, w := range weightedOps { @@ -228,6 +229,31 @@ func (s *SimTestSuite) TestSimulateMsgCancelUnbondingDelegation() { require.Len(futureOperations, 0) } +func (s *SimTestSuite) TestSimulateRotateConsPubKey() { + require := s.Require() + blockTime := time.Now().UTC() + ctx := s.ctx.WithBlockTime(blockTime) + + _ = s.getTestingValidator2(ctx) + + // begin a new block + s.app.FinalizeBlock(&abci.RequestFinalizeBlock{Height: s.app.LastBlockHeight() + 1, Hash: s.app.LastCommitID().Hash, Time: blockTime}) + + // execute operation + op := simulation.SimulateMsgRotateConsPubKey(s.txConfig, s.accountKeeper, s.bankKeeper, s.stakingKeeper) + operationMsg, futureOperations, err := op(s.r, s.app.BaseApp, ctx, s.accounts, "") + require.NoError(err) + + var msg types.MsgRotateConsPubKey + err = proto.Unmarshal(operationMsg.Msg, &msg) + require.NoError(err) + + require.True(operationMsg.OK) + require.Equal(sdk.MsgTypeURL(&types.MsgRotateConsPubKey{}), sdk.MsgTypeURL(&msg)) + require.Equal("cosmosvaloper1p8wcgrjr4pjju90xg6u9cgq55dxwq8j7epjs3u", msg.ValidatorAddress) + require.Len(futureOperations, 0) +} + // TestSimulateMsgEditValidator tests the normal scenario of a valid message of type TypeMsgEditValidator. // Abonormal scenarios, where the message is created by an errors are not tested here. func (s *SimTestSuite) TestSimulateMsgEditValidator() { @@ -369,6 +395,14 @@ func (s *SimTestSuite) getTestingValidator1(ctx sdk.Context) types.Validator { return s.getTestingValidator(ctx, commission1, 2) } +func (s *SimTestSuite) getTestingValidator2(ctx sdk.Context) types.Validator { + val := s.getTestingValidator0(ctx) + val.Status = types.Bonded + s.stakingKeeper.SetValidator(ctx, val) + s.stakingKeeper.SetValidatorByConsAddr(ctx, val) + return val +} + func (s *SimTestSuite) getTestingValidator(ctx sdk.Context, commission types.Commission, n int) types.Validator { account := s.accounts[n] valPubKey := account.PubKey diff --git a/x/staking/testutil/expected_keepers_mocks.go b/x/staking/testutil/expected_keepers_mocks.go index 3123d781fbdc..285f8d00edd5 100644 --- a/x/staking/testutil/expected_keepers_mocks.go +++ b/x/staking/testutil/expected_keepers_mocks.go @@ -10,8 +10,9 @@ import ( address "cosmossdk.io/core/address" math "cosmossdk.io/math" - types "github.com/cosmos/cosmos-sdk/types" - types0 "github.com/cosmos/cosmos-sdk/x/staking/types" + types "github.com/cosmos/cosmos-sdk/crypto/types" + types0 "github.com/cosmos/cosmos-sdk/types" + types1 "github.com/cosmos/cosmos-sdk/x/staking/types" gomock "github.com/golang/mock/gomock" ) @@ -39,10 +40,10 @@ func (m *MockDistributionKeeper) EXPECT() *MockDistributionKeeperMockRecorder { } // GetFeePoolCommunityCoins mocks base method. -func (m *MockDistributionKeeper) GetFeePoolCommunityCoins(ctx context.Context) types.DecCoins { +func (m *MockDistributionKeeper) GetFeePoolCommunityCoins(ctx context.Context) types0.DecCoins { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetFeePoolCommunityCoins", ctx) - ret0, _ := ret[0].(types.DecCoins) + ret0, _ := ret[0].(types0.DecCoins) return ret0 } @@ -53,10 +54,10 @@ func (mr *MockDistributionKeeperMockRecorder) GetFeePoolCommunityCoins(ctx inter } // GetValidatorOutstandingRewardsCoins mocks base method. -func (m *MockDistributionKeeper) GetValidatorOutstandingRewardsCoins(ctx context.Context, val types.ValAddress) types.DecCoins { +func (m *MockDistributionKeeper) GetValidatorOutstandingRewardsCoins(ctx context.Context, val types0.ValAddress) types0.DecCoins { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetValidatorOutstandingRewardsCoins", ctx, val) - ret0, _ := ret[0].(types.DecCoins) + ret0, _ := ret[0].(types0.DecCoins) return ret0 } @@ -104,10 +105,10 @@ func (mr *MockAccountKeeperMockRecorder) AddressCodec() *gomock.Call { } // GetAccount mocks base method. -func (m *MockAccountKeeper) GetAccount(ctx context.Context, addr types.AccAddress) types.AccountI { +func (m *MockAccountKeeper) GetAccount(ctx context.Context, addr types0.AccAddress) types0.AccountI { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetAccount", ctx, addr) - ret0, _ := ret[0].(types.AccountI) + ret0, _ := ret[0].(types0.AccountI) return ret0 } @@ -118,10 +119,10 @@ func (mr *MockAccountKeeperMockRecorder) GetAccount(ctx, addr interface{}) *gomo } // GetModuleAccount mocks base method. -func (m *MockAccountKeeper) GetModuleAccount(ctx context.Context, moduleName string) types.ModuleAccountI { +func (m *MockAccountKeeper) GetModuleAccount(ctx context.Context, moduleName string) types0.ModuleAccountI { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetModuleAccount", ctx, moduleName) - ret0, _ := ret[0].(types.ModuleAccountI) + ret0, _ := ret[0].(types0.ModuleAccountI) return ret0 } @@ -132,10 +133,10 @@ func (mr *MockAccountKeeperMockRecorder) GetModuleAccount(ctx, moduleName interf } // GetModuleAddress mocks base method. -func (m *MockAccountKeeper) GetModuleAddress(name string) types.AccAddress { +func (m *MockAccountKeeper) GetModuleAddress(name string) types0.AccAddress { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetModuleAddress", name) - ret0, _ := ret[0].(types.AccAddress) + ret0, _ := ret[0].(types0.AccAddress) return ret0 } @@ -146,7 +147,7 @@ func (mr *MockAccountKeeperMockRecorder) GetModuleAddress(name interface{}) *gom } // IterateAccounts mocks base method. -func (m *MockAccountKeeper) IterateAccounts(ctx context.Context, process func(types.AccountI) bool) { +func (m *MockAccountKeeper) IterateAccounts(ctx context.Context, process func(types0.AccountI) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "IterateAccounts", ctx, process) } @@ -158,7 +159,7 @@ func (mr *MockAccountKeeperMockRecorder) IterateAccounts(ctx, process interface{ } // SetModuleAccount mocks base method. -func (m *MockAccountKeeper) SetModuleAccount(arg0 context.Context, arg1 types.ModuleAccountI) { +func (m *MockAccountKeeper) SetModuleAccount(arg0 context.Context, arg1 types0.ModuleAccountI) { m.ctrl.T.Helper() m.ctrl.Call(m, "SetModuleAccount", arg0, arg1) } @@ -193,7 +194,7 @@ func (m *MockBankKeeper) EXPECT() *MockBankKeeperMockRecorder { } // BurnCoins mocks base method. -func (m *MockBankKeeper) BurnCoins(ctx context.Context, name string, amt types.Coins) error { +func (m *MockBankKeeper) BurnCoins(ctx context.Context, name string, amt types0.Coins) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BurnCoins", ctx, name, amt) ret0, _ := ret[0].(error) @@ -207,7 +208,7 @@ func (mr *MockBankKeeperMockRecorder) BurnCoins(ctx, name, amt interface{}) *gom } // DelegateCoinsFromAccountToModule mocks base method. -func (m *MockBankKeeper) DelegateCoinsFromAccountToModule(ctx context.Context, senderAddr types.AccAddress, recipientModule string, amt types.Coins) error { +func (m *MockBankKeeper) DelegateCoinsFromAccountToModule(ctx context.Context, senderAddr types0.AccAddress, recipientModule string, amt types0.Coins) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DelegateCoinsFromAccountToModule", ctx, senderAddr, recipientModule, amt) ret0, _ := ret[0].(error) @@ -221,10 +222,10 @@ func (mr *MockBankKeeperMockRecorder) DelegateCoinsFromAccountToModule(ctx, send } // GetAllBalances mocks base method. -func (m *MockBankKeeper) GetAllBalances(ctx context.Context, addr types.AccAddress) types.Coins { +func (m *MockBankKeeper) GetAllBalances(ctx context.Context, addr types0.AccAddress) types0.Coins { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetAllBalances", ctx, addr) - ret0, _ := ret[0].(types.Coins) + ret0, _ := ret[0].(types0.Coins) return ret0 } @@ -235,10 +236,10 @@ func (mr *MockBankKeeperMockRecorder) GetAllBalances(ctx, addr interface{}) *gom } // GetBalance mocks base method. -func (m *MockBankKeeper) GetBalance(ctx context.Context, addr types.AccAddress, denom string) types.Coin { +func (m *MockBankKeeper) GetBalance(ctx context.Context, addr types0.AccAddress, denom string) types0.Coin { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBalance", ctx, addr, denom) - ret0, _ := ret[0].(types.Coin) + ret0, _ := ret[0].(types0.Coin) return ret0 } @@ -249,10 +250,10 @@ func (mr *MockBankKeeperMockRecorder) GetBalance(ctx, addr, denom interface{}) * } // GetSupply mocks base method. -func (m *MockBankKeeper) GetSupply(ctx context.Context, denom string) types.Coin { +func (m *MockBankKeeper) GetSupply(ctx context.Context, denom string) types0.Coin { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetSupply", ctx, denom) - ret0, _ := ret[0].(types.Coin) + ret0, _ := ret[0].(types0.Coin) return ret0 } @@ -263,10 +264,10 @@ func (mr *MockBankKeeperMockRecorder) GetSupply(ctx, denom interface{}) *gomock. } // LockedCoins mocks base method. -func (m *MockBankKeeper) LockedCoins(ctx context.Context, addr types.AccAddress) types.Coins { +func (m *MockBankKeeper) LockedCoins(ctx context.Context, addr types0.AccAddress) types0.Coins { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LockedCoins", ctx, addr) - ret0, _ := ret[0].(types.Coins) + ret0, _ := ret[0].(types0.Coins) return ret0 } @@ -276,8 +277,22 @@ func (mr *MockBankKeeperMockRecorder) LockedCoins(ctx, addr interface{}) *gomock return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LockedCoins", reflect.TypeOf((*MockBankKeeper)(nil).LockedCoins), ctx, addr) } +// SendCoinsFromAccountToModule mocks base method. +func (m *MockBankKeeper) SendCoinsFromAccountToModule(ctx context.Context, senderAddr types0.AccAddress, recipientModule string, amt types0.Coins) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendCoinsFromAccountToModule", ctx, senderAddr, recipientModule, amt) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendCoinsFromAccountToModule indicates an expected call of SendCoinsFromAccountToModule. +func (mr *MockBankKeeperMockRecorder) SendCoinsFromAccountToModule(ctx, senderAddr, recipientModule, amt interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendCoinsFromAccountToModule", reflect.TypeOf((*MockBankKeeper)(nil).SendCoinsFromAccountToModule), ctx, senderAddr, recipientModule, amt) +} + // SendCoinsFromModuleToModule mocks base method. -func (m *MockBankKeeper) SendCoinsFromModuleToModule(ctx context.Context, senderPool, recipientPool string, amt types.Coins) error { +func (m *MockBankKeeper) SendCoinsFromModuleToModule(ctx context.Context, senderPool, recipientPool string, amt types0.Coins) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SendCoinsFromModuleToModule", ctx, senderPool, recipientPool, amt) ret0, _ := ret[0].(error) @@ -291,10 +306,10 @@ func (mr *MockBankKeeperMockRecorder) SendCoinsFromModuleToModule(ctx, senderPoo } // SpendableCoins mocks base method. -func (m *MockBankKeeper) SpendableCoins(ctx context.Context, addr types.AccAddress) types.Coins { +func (m *MockBankKeeper) SpendableCoins(ctx context.Context, addr types0.AccAddress) types0.Coins { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SpendableCoins", ctx, addr) - ret0, _ := ret[0].(types.Coins) + ret0, _ := ret[0].(types0.Coins) return ret0 } @@ -305,7 +320,7 @@ func (mr *MockBankKeeperMockRecorder) SpendableCoins(ctx, addr interface{}) *gom } // UndelegateCoinsFromModuleToAccount mocks base method. -func (m *MockBankKeeper) UndelegateCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr types.AccAddress, amt types.Coins) error { +func (m *MockBankKeeper) UndelegateCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr types0.AccAddress, amt types0.Coins) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UndelegateCoinsFromModuleToAccount", ctx, senderModule, recipientAddr, amt) ret0, _ := ret[0].(error) @@ -342,10 +357,10 @@ func (m *MockValidatorSet) EXPECT() *MockValidatorSetMockRecorder { } // Delegation mocks base method. -func (m *MockValidatorSet) Delegation(arg0 types.Context, arg1 types.AccAddress, arg2 types.ValAddress) types0.DelegationI { +func (m *MockValidatorSet) Delegation(arg0 types0.Context, arg1 types0.AccAddress, arg2 types0.ValAddress) types1.DelegationI { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Delegation", arg0, arg1, arg2) - ret0, _ := ret[0].(types0.DelegationI) + ret0, _ := ret[0].(types1.DelegationI) return ret0 } @@ -356,7 +371,7 @@ func (mr *MockValidatorSetMockRecorder) Delegation(arg0, arg1, arg2 interface{}) } // IterateBondedValidatorsByPower mocks base method. -func (m *MockValidatorSet) IterateBondedValidatorsByPower(arg0 types.Context, arg1 func(int64, types0.ValidatorI) bool) { +func (m *MockValidatorSet) IterateBondedValidatorsByPower(arg0 types0.Context, arg1 func(int64, types1.ValidatorI) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "IterateBondedValidatorsByPower", arg0, arg1) } @@ -368,7 +383,7 @@ func (mr *MockValidatorSetMockRecorder) IterateBondedValidatorsByPower(arg0, arg } // IterateLastValidators mocks base method. -func (m *MockValidatorSet) IterateLastValidators(arg0 types.Context, arg1 func(int64, types0.ValidatorI) bool) { +func (m *MockValidatorSet) IterateLastValidators(arg0 types0.Context, arg1 func(int64, types1.ValidatorI) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "IterateLastValidators", arg0, arg1) } @@ -380,7 +395,7 @@ func (mr *MockValidatorSetMockRecorder) IterateLastValidators(arg0, arg1 interfa } // IterateValidators mocks base method. -func (m *MockValidatorSet) IterateValidators(arg0 types.Context, arg1 func(int64, types0.ValidatorI) bool) { +func (m *MockValidatorSet) IterateValidators(arg0 types0.Context, arg1 func(int64, types1.ValidatorI) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "IterateValidators", arg0, arg1) } @@ -392,7 +407,7 @@ func (mr *MockValidatorSetMockRecorder) IterateValidators(arg0, arg1 interface{} } // Jail mocks base method. -func (m *MockValidatorSet) Jail(arg0 types.Context, arg1 types.ConsAddress) { +func (m *MockValidatorSet) Jail(arg0 types0.Context, arg1 types0.ConsAddress) { m.ctrl.T.Helper() m.ctrl.Call(m, "Jail", arg0, arg1) } @@ -404,7 +419,7 @@ func (mr *MockValidatorSetMockRecorder) Jail(arg0, arg1 interface{}) *gomock.Cal } // MaxValidators mocks base method. -func (m *MockValidatorSet) MaxValidators(arg0 types.Context) uint32 { +func (m *MockValidatorSet) MaxValidators(arg0 types0.Context) uint32 { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MaxValidators", arg0) ret0, _ := ret[0].(uint32) @@ -418,7 +433,7 @@ func (mr *MockValidatorSetMockRecorder) MaxValidators(arg0 interface{}) *gomock. } // Slash mocks base method. -func (m *MockValidatorSet) Slash(arg0 types.Context, arg1 types.ConsAddress, arg2, arg3 int64, arg4 math.LegacyDec) math.Int { +func (m *MockValidatorSet) Slash(arg0 types0.Context, arg1 types0.ConsAddress, arg2, arg3 int64, arg4 math.LegacyDec) math.Int { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4) ret0, _ := ret[0].(math.Int) @@ -432,7 +447,7 @@ func (mr *MockValidatorSetMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4 inter } // SlashWithInfractionReason mocks base method. -func (m *MockValidatorSet) SlashWithInfractionReason(arg0 types.Context, arg1 types.ConsAddress, arg2, arg3 int64, arg4 math.LegacyDec, arg5 types0.Infraction) math.Int { +func (m *MockValidatorSet) SlashWithInfractionReason(arg0 types0.Context, arg1 types0.ConsAddress, arg2, arg3 int64, arg4 math.LegacyDec, arg5 types1.Infraction) math.Int { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SlashWithInfractionReason", arg0, arg1, arg2, arg3, arg4, arg5) ret0, _ := ret[0].(math.Int) @@ -446,7 +461,7 @@ func (mr *MockValidatorSetMockRecorder) SlashWithInfractionReason(arg0, arg1, ar } // StakingTokenSupply mocks base method. -func (m *MockValidatorSet) StakingTokenSupply(arg0 types.Context) math.Int { +func (m *MockValidatorSet) StakingTokenSupply(arg0 types0.Context) math.Int { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StakingTokenSupply", arg0) ret0, _ := ret[0].(math.Int) @@ -460,7 +475,7 @@ func (mr *MockValidatorSetMockRecorder) StakingTokenSupply(arg0 interface{}) *go } // TotalBondedTokens mocks base method. -func (m *MockValidatorSet) TotalBondedTokens(arg0 types.Context) math.Int { +func (m *MockValidatorSet) TotalBondedTokens(arg0 types0.Context) math.Int { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "TotalBondedTokens", arg0) ret0, _ := ret[0].(math.Int) @@ -474,7 +489,7 @@ func (mr *MockValidatorSetMockRecorder) TotalBondedTokens(arg0 interface{}) *gom } // Unjail mocks base method. -func (m *MockValidatorSet) Unjail(arg0 types.Context, arg1 types.ConsAddress) { +func (m *MockValidatorSet) Unjail(arg0 types0.Context, arg1 types0.ConsAddress) { m.ctrl.T.Helper() m.ctrl.Call(m, "Unjail", arg0, arg1) } @@ -486,10 +501,10 @@ func (mr *MockValidatorSetMockRecorder) Unjail(arg0, arg1 interface{}) *gomock.C } // Validator mocks base method. -func (m *MockValidatorSet) Validator(arg0 types.Context, arg1 types.ValAddress) types0.ValidatorI { +func (m *MockValidatorSet) Validator(arg0 types0.Context, arg1 types0.ValAddress) types1.ValidatorI { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Validator", arg0, arg1) - ret0, _ := ret[0].(types0.ValidatorI) + ret0, _ := ret[0].(types1.ValidatorI) return ret0 } @@ -500,10 +515,10 @@ func (mr *MockValidatorSetMockRecorder) Validator(arg0, arg1 interface{}) *gomoc } // ValidatorByConsAddr mocks base method. -func (m *MockValidatorSet) ValidatorByConsAddr(arg0 types.Context, arg1 types.ConsAddress) types0.ValidatorI { +func (m *MockValidatorSet) ValidatorByConsAddr(arg0 types0.Context, arg1 types0.ConsAddress) types1.ValidatorI { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ValidatorByConsAddr", arg0, arg1) - ret0, _ := ret[0].(types0.ValidatorI) + ret0, _ := ret[0].(types1.ValidatorI) return ret0 } @@ -537,10 +552,10 @@ func (m *MockDelegationSet) EXPECT() *MockDelegationSetMockRecorder { } // GetValidatorSet mocks base method. -func (m *MockDelegationSet) GetValidatorSet() types0.ValidatorSet { +func (m *MockDelegationSet) GetValidatorSet() types1.ValidatorSet { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetValidatorSet") - ret0, _ := ret[0].(types0.ValidatorSet) + ret0, _ := ret[0].(types1.ValidatorSet) return ret0 } @@ -551,7 +566,7 @@ func (mr *MockDelegationSetMockRecorder) GetValidatorSet() *gomock.Call { } // IterateDelegations mocks base method. -func (m *MockDelegationSet) IterateDelegations(ctx types.Context, delegator types.AccAddress, fn func(int64, types0.DelegationI) bool) { +func (m *MockDelegationSet) IterateDelegations(ctx types0.Context, delegator types0.AccAddress, fn func(int64, types1.DelegationI) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "IterateDelegations", ctx, delegator, fn) } @@ -585,8 +600,22 @@ func (m *MockStakingHooks) EXPECT() *MockStakingHooksMockRecorder { return m.recorder } +// AfterConsensusPubKeyUpdate mocks base method. +func (m *MockStakingHooks) AfterConsensusPubKeyUpdate(ctx types0.Context, oldPubKey, newPubKey types.PubKey, rotationFee types0.Coin) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AfterConsensusPubKeyUpdate", ctx, oldPubKey, newPubKey, rotationFee) + ret0, _ := ret[0].(error) + return ret0 +} + +// AfterConsensusPubKeyUpdate indicates an expected call of AfterConsensusPubKeyUpdate. +func (mr *MockStakingHooksMockRecorder) AfterConsensusPubKeyUpdate(ctx, oldPubKey, newPubKey, rotationFee interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AfterConsensusPubKeyUpdate", reflect.TypeOf((*MockStakingHooks)(nil).AfterConsensusPubKeyUpdate), ctx, oldPubKey, newPubKey, rotationFee) +} + // AfterDelegationModified mocks base method. -func (m *MockStakingHooks) AfterDelegationModified(ctx types.Context, delAddr types.AccAddress, valAddr types.ValAddress) error { +func (m *MockStakingHooks) AfterDelegationModified(ctx types0.Context, delAddr types0.AccAddress, valAddr types0.ValAddress) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AfterDelegationModified", ctx, delAddr, valAddr) ret0, _ := ret[0].(error) @@ -600,7 +629,7 @@ func (mr *MockStakingHooksMockRecorder) AfterDelegationModified(ctx, delAddr, va } // AfterUnbondingInitiated mocks base method. -func (m *MockStakingHooks) AfterUnbondingInitiated(ctx types.Context, id uint64) error { +func (m *MockStakingHooks) AfterUnbondingInitiated(ctx types0.Context, id uint64) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AfterUnbondingInitiated", ctx, id) ret0, _ := ret[0].(error) @@ -614,7 +643,7 @@ func (mr *MockStakingHooksMockRecorder) AfterUnbondingInitiated(ctx, id interfac } // AfterValidatorBeginUnbonding mocks base method. -func (m *MockStakingHooks) AfterValidatorBeginUnbonding(ctx types.Context, consAddr types.ConsAddress, valAddr types.ValAddress) error { +func (m *MockStakingHooks) AfterValidatorBeginUnbonding(ctx types0.Context, consAddr types0.ConsAddress, valAddr types0.ValAddress) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AfterValidatorBeginUnbonding", ctx, consAddr, valAddr) ret0, _ := ret[0].(error) @@ -628,7 +657,7 @@ func (mr *MockStakingHooksMockRecorder) AfterValidatorBeginUnbonding(ctx, consAd } // AfterValidatorBonded mocks base method. -func (m *MockStakingHooks) AfterValidatorBonded(ctx types.Context, consAddr types.ConsAddress, valAddr types.ValAddress) error { +func (m *MockStakingHooks) AfterValidatorBonded(ctx types0.Context, consAddr types0.ConsAddress, valAddr types0.ValAddress) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AfterValidatorBonded", ctx, consAddr, valAddr) ret0, _ := ret[0].(error) @@ -642,7 +671,7 @@ func (mr *MockStakingHooksMockRecorder) AfterValidatorBonded(ctx, consAddr, valA } // AfterValidatorCreated mocks base method. -func (m *MockStakingHooks) AfterValidatorCreated(ctx types.Context, valAddr types.ValAddress) error { +func (m *MockStakingHooks) AfterValidatorCreated(ctx types0.Context, valAddr types0.ValAddress) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AfterValidatorCreated", ctx, valAddr) ret0, _ := ret[0].(error) @@ -656,7 +685,7 @@ func (mr *MockStakingHooksMockRecorder) AfterValidatorCreated(ctx, valAddr inter } // AfterValidatorRemoved mocks base method. -func (m *MockStakingHooks) AfterValidatorRemoved(ctx types.Context, consAddr types.ConsAddress, valAddr types.ValAddress) error { +func (m *MockStakingHooks) AfterValidatorRemoved(ctx types0.Context, consAddr types0.ConsAddress, valAddr types0.ValAddress) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AfterValidatorRemoved", ctx, consAddr, valAddr) ret0, _ := ret[0].(error) @@ -670,7 +699,7 @@ func (mr *MockStakingHooksMockRecorder) AfterValidatorRemoved(ctx, consAddr, val } // BeforeDelegationCreated mocks base method. -func (m *MockStakingHooks) BeforeDelegationCreated(ctx types.Context, delAddr types.AccAddress, valAddr types.ValAddress) error { +func (m *MockStakingHooks) BeforeDelegationCreated(ctx types0.Context, delAddr types0.AccAddress, valAddr types0.ValAddress) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BeforeDelegationCreated", ctx, delAddr, valAddr) ret0, _ := ret[0].(error) @@ -684,7 +713,7 @@ func (mr *MockStakingHooksMockRecorder) BeforeDelegationCreated(ctx, delAddr, va } // BeforeDelegationRemoved mocks base method. -func (m *MockStakingHooks) BeforeDelegationRemoved(ctx types.Context, delAddr types.AccAddress, valAddr types.ValAddress) error { +func (m *MockStakingHooks) BeforeDelegationRemoved(ctx types0.Context, delAddr types0.AccAddress, valAddr types0.ValAddress) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BeforeDelegationRemoved", ctx, delAddr, valAddr) ret0, _ := ret[0].(error) @@ -698,7 +727,7 @@ func (mr *MockStakingHooksMockRecorder) BeforeDelegationRemoved(ctx, delAddr, va } // BeforeDelegationSharesModified mocks base method. -func (m *MockStakingHooks) BeforeDelegationSharesModified(ctx types.Context, delAddr types.AccAddress, valAddr types.ValAddress) error { +func (m *MockStakingHooks) BeforeDelegationSharesModified(ctx types0.Context, delAddr types0.AccAddress, valAddr types0.ValAddress) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BeforeDelegationSharesModified", ctx, delAddr, valAddr) ret0, _ := ret[0].(error) @@ -712,7 +741,7 @@ func (mr *MockStakingHooksMockRecorder) BeforeDelegationSharesModified(ctx, delA } // BeforeValidatorModified mocks base method. -func (m *MockStakingHooks) BeforeValidatorModified(ctx types.Context, valAddr types.ValAddress) error { +func (m *MockStakingHooks) BeforeValidatorModified(ctx types0.Context, valAddr types0.ValAddress) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BeforeValidatorModified", ctx, valAddr) ret0, _ := ret[0].(error) @@ -726,7 +755,7 @@ func (mr *MockStakingHooksMockRecorder) BeforeValidatorModified(ctx, valAddr int } // BeforeValidatorSlashed mocks base method. -func (m *MockStakingHooks) BeforeValidatorSlashed(ctx types.Context, valAddr types.ValAddress, fraction math.LegacyDec) error { +func (m *MockStakingHooks) BeforeValidatorSlashed(ctx types0.Context, valAddr types0.ValAddress, fraction math.LegacyDec) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BeforeValidatorSlashed", ctx, valAddr, fraction) ret0, _ := ret[0].(error) diff --git a/x/staking/types/codec.go b/x/staking/types/codec.go index 60ee724fbbf2..29e3e1d33b65 100644 --- a/x/staking/types/codec.go +++ b/x/staking/types/codec.go @@ -19,6 +19,7 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { legacy.RegisterAminoMsg(cdc, &MsgBeginRedelegate{}, "cosmos-sdk/MsgBeginRedelegate") legacy.RegisterAminoMsg(cdc, &MsgCancelUnbondingDelegation{}, "cosmos-sdk/MsgCancelUnbondingDelegation") legacy.RegisterAminoMsg(cdc, &MsgUpdateParams{}, "cosmos-sdk/x/staking/MsgUpdateParams") + legacy.RegisterAminoMsg(cdc, &MsgRotateConsPubKey{}, "cosmos-sdk/MsgRotateConsPubKey") cdc.RegisterInterface((*isStakeAuthorization_Validators)(nil), nil) cdc.RegisterConcrete(&StakeAuthorization_AllowList{}, "cosmos-sdk/StakeAuthorization/AllowList", nil) @@ -37,6 +38,7 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { &MsgBeginRedelegate{}, &MsgCancelUnbondingDelegation{}, &MsgUpdateParams{}, + &MsgRotateConsPubKey{}, ) registry.RegisterImplementations( (*authz.Authorization)(nil), diff --git a/x/staking/types/errors.go b/x/staking/types/errors.go index ee1750c22368..cae422989dd2 100644 --- a/x/staking/types/errors.go +++ b/x/staking/types/errors.go @@ -50,4 +50,8 @@ var ( ErrCommissionLTMinRate = errors.Register(ModuleName, 40, "commission cannot be less than min rate") ErrUnbondingNotFound = errors.Register(ModuleName, 41, "unbonding operation not found") ErrUnbondingOnHoldRefCountNegative = errors.Register(ModuleName, 42, "cannot un-hold unbonding operation that is not on hold") + + // consensus key errors + ErrConsensusPubKeyAlreadyUsedForAValidator = errors.Register(ModuleName, 43, "consensus pubkey is already used for a validator") + ErrExceedingMaxConsPubKeyRotations = errors.Register(ModuleName, 44, "exceeding maximum consensus pubkey rotations within unbonding period") ) diff --git a/x/staking/types/expected_keepers.go b/x/staking/types/expected_keepers.go index a7ef4ab37ce5..2858204573f4 100644 --- a/x/staking/types/expected_keepers.go +++ b/x/staking/types/expected_keepers.go @@ -6,6 +6,7 @@ import ( "cosmossdk.io/core/address" "cosmossdk.io/math" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -38,6 +39,7 @@ type BankKeeper interface { GetSupply(ctx context.Context, denom string) sdk.Coin + SendCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error SendCoinsFromModuleToModule(ctx context.Context, senderPool, recipientPool string, amt sdk.Coins) error UndelegateCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error DelegateCoinsFromAccountToModule(ctx context.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error @@ -109,6 +111,7 @@ type StakingHooks interface { AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction math.LegacyDec) error AfterUnbondingInitiated(ctx sdk.Context, id uint64) error + AfterConsensusPubKeyUpdate(ctx sdk.Context, oldPubKey, newPubKey cryptotypes.PubKey, rotationFee sdk.Coin) error } // StakingHooksWrapper is a wrapper for modules to inject StakingHooks using depinject. diff --git a/x/staking/types/historical_info.go b/x/staking/types/historical_info.go index bfdbf454fa6e..514626d72518 100644 --- a/x/staking/types/historical_info.go +++ b/x/staking/types/historical_info.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) // NewHistoricalInfo will create a historical information struct from header and valset @@ -82,3 +83,14 @@ func (hi HistoricalInfo) UnpackInterfaces(c codectypes.AnyUnpacker) error { } return nil } + +// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces +func (hi ConsPubKeyRotationHistory) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + var oldPubKey cryptotypes.PubKey + err := unpacker.UnpackAny(hi.OldConsPubkey, &oldPubKey) + if err != nil { + return err + } + var newPubKey cryptotypes.PubKey + return unpacker.UnpackAny(hi.NewConsPubkey, &newPubKey) +} diff --git a/x/staking/types/hooks.go b/x/staking/types/hooks.go index bdc1ffd7776c..483602d92c4b 100644 --- a/x/staking/types/hooks.go +++ b/x/staking/types/hooks.go @@ -2,6 +2,7 @@ package types import ( sdkmath "cosmossdk.io/math" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -114,3 +115,12 @@ func (h MultiStakingHooks) AfterUnbondingInitiated(ctx sdk.Context, id uint64) e } return nil } + +func (h MultiStakingHooks) AfterConsensusPubKeyUpdate(ctx sdk.Context, oldPubKey, newPubKey cryptotypes.PubKey, rotationFee sdk.Coin) error { + for i := range h { + if err := h[i].AfterConsensusPubKeyUpdate(ctx, oldPubKey, newPubKey, rotationFee); err != nil { + return err + } + } + return nil +} diff --git a/x/staking/types/keys.go b/x/staking/types/keys.go index 4c905e1110c3..d8257933454f 100644 --- a/x/staking/types/keys.go +++ b/x/staking/types/keys.go @@ -54,6 +54,12 @@ var ( ParamsKey = []byte{0x51} // prefix for parameters for module x/staking + ValidatorConsPubKeyRotationHistoryKey = []byte{0x70} // prefix for consPubkey rotation history by validator + BlockConsPubKeyRotationHistoryKey = []byte{0x71} // prefix for consPubkey rotation history by height + ValidatorConsensusKeyRotationRecordQueueKey = []byte{0x72} // this key is used to set the unbonding period time on each rotation + ValidatorConsensusKeyRotationRecordIndexKey = []byte{0x73} // this key is used to restrict the validator next rotation within waiting (unbonding) period + RotatedConsKeyMapIndex = []byte{0x74} // prefix for rotated cons address to new cons address + DelegationByValIndexKey = []byte{0x71} // key for delegations by a validator ) @@ -422,3 +428,48 @@ func GetHistoricalInfoKey(height int64) []byte { binary.BigEndian.PutUint64(heightBytes, uint64(height)) return append(HistoricalInfoKey, heightBytes...) } + +func GetValidatorConsPubKeyRotationHistoryKey(history ConsPubKeyRotationHistory) []byte { + return append(append( + ValidatorConsPubKeyRotationHistoryKey, + []byte(history.OperatorAddress)...), + sdk.Uint64ToBigEndian(history.Height)...) +} + +func GetBlockConsPubKeyRotationHistoryKey(history ConsPubKeyRotationHistory) []byte { + return append(append( + BlockConsPubKeyRotationHistoryKey, + sdk.Uint64ToBigEndian(history.Height)...), + []byte(history.OperatorAddress)...) +} + +func GetValidatorConsPubKeyRotationHistoryPrefix(operatorAddress string) []byte { + return append( + ValidatorConsPubKeyRotationHistoryKey, + []byte(operatorAddress)...) +} + +func GetBlockConsPubKeyRotationHistoryPrefix(height int64) []byte { + return append( + BlockConsPubKeyRotationHistoryKey, + sdk.Uint64ToBigEndian(uint64(height))...) +} + +func GetConsKeyRotationHistoryKey(valAddr sdk.ValAddress, height uint64) []byte { + key := append(ValidatorConsPubKeyRotationHistoryKey, address.MustLengthPrefix(valAddr)...) + return append(key, sdk.Uint64ToBigEndian(height)...) +} + +func GetConsKeyRotationTimeKey(timestamp time.Time) []byte { + bz := sdk.FormatTimeBytes(timestamp) + return append(ValidatorConsensusKeyRotationRecordQueueKey, bz...) +} + +func GetConsKeyIndexKey(valAddr sdk.ValAddress, timestamp time.Time) []byte { + key := append(ValidatorConsensusKeyRotationRecordIndexKey, address.MustLengthPrefix(valAddr)...) + return append(key, sdk.FormatTimeBytes(timestamp)...) +} + +func GetKeyRotatedConsKey(addr []byte) []byte { + return append(RotatedConsKeyMapIndex, addr...) +} diff --git a/x/staking/types/msg.go b/x/staking/types/msg.go index 89012d1b5605..d5705fc1b10c 100644 --- a/x/staking/types/msg.go +++ b/x/staking/types/msg.go @@ -189,3 +189,39 @@ func (m MsgUpdateParams) GetSigners() []sdk.AccAddress { addr, _ := sdk.AccAddressFromBech32(m.Authority) return []sdk.AccAddress{addr} } + +// NewMsgRotateConsPubKey creates a new MsgRotateConsPubKey instance. +func NewMsgRotateConsPubKey(valAddr sdk.ValAddress, pubKey cryptotypes.PubKey) (*MsgRotateConsPubKey, error) { + var pkAny *codectypes.Any + if pubKey != nil { + var err error + if pkAny, err = codectypes.NewAnyWithValue(pubKey); err != nil { + return nil, err + } + } + return &MsgRotateConsPubKey{ + ValidatorAddress: valAddr.String(), + NewPubkey: pkAny, + }, nil +} + +// GetSigners implements the sdk.Msg interface. +func (msg MsgRotateConsPubKey) GetSigners() []sdk.AccAddress { + signer, _ := sdk.ValAddressFromBech32(msg.ValidatorAddress) + return []sdk.AccAddress{sdk.AccAddress(signer)} +} + +// ValidateBasic implements the sdk.Msg interface. +func (msg MsgRotateConsPubKey) ValidateBasic() error { + if _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) + } + + return nil +} + +// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces +func (msg MsgRotateConsPubKey) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + var pubKey cryptotypes.PubKey + return unpacker.UnpackAny(msg.NewPubkey, &pubKey) +} diff --git a/x/staking/types/params.go b/x/staking/types/params.go index 9687b206485c..02aad39736c4 100644 --- a/x/staking/types/params.go +++ b/x/staking/types/params.go @@ -31,11 +31,20 @@ const ( DefaultHistoricalEntries uint32 = 10000 ) -// DefaultMinCommissionRate is set to 0% -var DefaultMinCommissionRate = math.LegacyZeroDec() +var ( + // DefaultMinCommissionRate is set to 0% + DefaultMinCommissionRate = math.LegacyZeroDec() + + // DefaultKeyRotationFee is fees used to rotate the ConsPubkey or Operator key + DefaultKeyRotationFee = sdk.NewInt64Coin(sdk.DefaultBondDenom, 1000000) +) // NewParams creates a new Params instance -func NewParams(unbondingTime time.Duration, maxValidators, maxEntries, historicalEntries uint32, bondDenom string, minCommissionRate math.LegacyDec) Params { +func NewParams(unbondingTime time.Duration, + maxValidators, maxEntries, historicalEntries uint32, + bondDenom string, minCommissionRate sdk.Dec, + keyRotationFee sdk.Coin, +) Params { return Params{ UnbondingTime: unbondingTime, MaxValidators: maxValidators, @@ -43,6 +52,7 @@ func NewParams(unbondingTime time.Duration, maxValidators, maxEntries, historica HistoricalEntries: historicalEntries, BondDenom: bondDenom, MinCommissionRate: minCommissionRate, + KeyRotationFee: keyRotationFee, } } @@ -55,6 +65,7 @@ func DefaultParams() Params { DefaultHistoricalEntries, sdk.DefaultBondDenom, DefaultMinCommissionRate, + DefaultKeyRotationFee, ) } @@ -104,6 +115,10 @@ func (p Params) Validate() error { return err } + if err := validateKeyRotationFee(p.KeyRotationFee); err != nil { + return err + } + return nil } @@ -203,3 +218,19 @@ func validateMinCommissionRate(i interface{}) error { return nil } + +func validateKeyRotationFee(i interface{}) error { + v, ok := i.(sdk.Coin) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + if v.IsNil() { + return fmt.Errorf("cons pubkey rotation fee cannot be nil: %s", v) + } + if v.IsLTE(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(0))) { + return fmt.Errorf("cons pubkey rotation fee cannot be negative or zero: %s", v) + } + + return nil +} diff --git a/x/staking/types/params_test.go b/x/staking/types/params_test.go index a5bf8454358c..8b2159b5577e 100644 --- a/x/staking/types/params_test.go +++ b/x/staking/types/params_test.go @@ -6,6 +6,7 @@ import ( "cosmossdk.io/math" "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -26,13 +27,22 @@ func TestParamsEqual(t *testing.T) { func TestValidateParams(t *testing.T) { params := types.DefaultParams() + coinZero := sdk.NewInt64Coin("stake", 0) + // default params have no error require.NoError(t, params.Validate()) - // validate mincommission + // validate min commission rate params.MinCommissionRate = math.LegacyNewDec(-1) require.Error(t, params.Validate()) params.MinCommissionRate = math.LegacyNewDec(2) require.Error(t, params.Validate()) + + // reset params to default + params = types.DefaultParams() + + // check keyRotationFee + params.KeyRotationFee = coinZero + require.Error(t, params.Validate()) } diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 9833486af700..d02dc0917440 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -932,6 +932,9 @@ type Params struct { BondDenom string `protobuf:"bytes,5,opt,name=bond_denom,json=bondDenom,proto3" json:"bond_denom,omitempty"` // min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators MinCommissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=min_commission_rate,json=minCommissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"min_commission_rate" yaml:"min_commission_rate"` + // key_rotation_fee is fee to be spent when rotating validator's key + // (either consensus pubkey or operator key) + KeyRotationFee types2.Coin `protobuf:"bytes,7,opt,name=key_rotation_fee,json=keyRotationFee,proto3" json:"key_rotation_fee"` } func (m *Params) Reset() { *m = Params{} } @@ -1002,6 +1005,13 @@ func (m *Params) GetBondDenom() string { return "" } +func (m *Params) GetKeyRotationFee() types2.Coin { + if m != nil { + return m.KeyRotationFee + } + return types2.Coin{} +} + // DelegationResponse is equivalent to Delegation except that it contains a // balance in addition to shares which is more suitable for client responses. type DelegationResponse struct { @@ -1245,6 +1255,99 @@ func (m *ValidatorUpdates) GetUpdates() []types3.ValidatorUpdate { return nil } +// ConsPubKeyRotationHistory contains a validator's consensus public key rotation history. +type ConsPubKeyRotationHistory struct { + // operator_address defines the address of the validator's operator; bech encoded in JSON. + OperatorAddress string `protobuf:"bytes,1,opt,name=operator_address,json=operatorAddress,proto3" json:"operator_address,omitempty" yaml:"operator_address"` + // old_cons_pubkey is the old consensus public key of the validator, as a Protobuf Any. + OldConsPubkey *types1.Any `protobuf:"bytes,2,opt,name=old_cons_pubkey,json=oldConsPubkey,proto3" json:"old_cons_pubkey,omitempty"` + // new_cons_pubkey is the new consensus public key of the validator, as a Protobuf Any. + NewConsPubkey *types1.Any `protobuf:"bytes,3,opt,name=new_cons_pubkey,json=newConsPubkey,proto3" json:"new_cons_pubkey,omitempty"` + // height defines the block height at which the rotation event occured. + Height uint64 `protobuf:"varint,4,opt,name=height,proto3" json:"height,omitempty"` + // fee holds the amount of fee deduced for the rotation. + Fee types2.Coin `protobuf:"bytes,5,opt,name=fee,proto3" json:"fee"` +} + +func (m *ConsPubKeyRotationHistory) Reset() { *m = ConsPubKeyRotationHistory{} } +func (m *ConsPubKeyRotationHistory) String() string { return proto.CompactTextString(m) } +func (*ConsPubKeyRotationHistory) ProtoMessage() {} +func (*ConsPubKeyRotationHistory) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{21} +} +func (m *ConsPubKeyRotationHistory) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ConsPubKeyRotationHistory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ConsPubKeyRotationHistory.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 *ConsPubKeyRotationHistory) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConsPubKeyRotationHistory.Merge(m, src) +} +func (m *ConsPubKeyRotationHistory) XXX_Size() int { + return m.Size() +} +func (m *ConsPubKeyRotationHistory) XXX_DiscardUnknown() { + xxx_messageInfo_ConsPubKeyRotationHistory.DiscardUnknown(m) +} + +var xxx_messageInfo_ConsPubKeyRotationHistory proto.InternalMessageInfo + +// ValAddrsOfRotatedConsKeys contains the array of validator addresses which rotated their keys +// This is to block the validator's next rotation till unbonding period. +type ValAddrsOfRotatedConsKeys struct { + Addresses []string `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (m *ValAddrsOfRotatedConsKeys) Reset() { *m = ValAddrsOfRotatedConsKeys{} } +func (m *ValAddrsOfRotatedConsKeys) String() string { return proto.CompactTextString(m) } +func (*ValAddrsOfRotatedConsKeys) ProtoMessage() {} +func (*ValAddrsOfRotatedConsKeys) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{22} +} +func (m *ValAddrsOfRotatedConsKeys) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValAddrsOfRotatedConsKeys) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ValAddrsOfRotatedConsKeys.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 *ValAddrsOfRotatedConsKeys) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValAddrsOfRotatedConsKeys.Merge(m, src) +} +func (m *ValAddrsOfRotatedConsKeys) XXX_Size() int { + return m.Size() +} +func (m *ValAddrsOfRotatedConsKeys) XXX_DiscardUnknown() { + xxx_messageInfo_ValAddrsOfRotatedConsKeys.DiscardUnknown(m) +} + +var xxx_messageInfo_ValAddrsOfRotatedConsKeys proto.InternalMessageInfo + +func (m *ValAddrsOfRotatedConsKeys) GetAddresses() []string { + if m != nil { + return m.Addresses + } + return nil +} + func init() { proto.RegisterEnum("cosmos.staking.v1beta1.BondStatus", BondStatus_name, BondStatus_value) proto.RegisterEnum("cosmos.staking.v1beta1.Infraction", Infraction_name, Infraction_value) @@ -1269,6 +1372,8 @@ func init() { proto.RegisterType((*RedelegationResponse)(nil), "cosmos.staking.v1beta1.RedelegationResponse") proto.RegisterType((*Pool)(nil), "cosmos.staking.v1beta1.Pool") proto.RegisterType((*ValidatorUpdates)(nil), "cosmos.staking.v1beta1.ValidatorUpdates") + proto.RegisterType((*ConsPubKeyRotationHistory)(nil), "cosmos.staking.v1beta1.ConsPubKeyRotationHistory") + proto.RegisterType((*ValAddrsOfRotatedConsKeys)(nil), "cosmos.staking.v1beta1.ValAddrsOfRotatedConsKeys") } func init() { @@ -1276,125 +1381,134 @@ func init() { } var fileDescriptor_64c30c6cf92913c9 = []byte{ - // 1883 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x3d, 0x6c, 0x23, 0xc7, - 0x15, 0xd6, 0x92, 0x32, 0x25, 0x3d, 0x4a, 0x22, 0x35, 0x27, 0xdf, 0xf1, 0x78, 0x89, 0x48, 0xd3, - 0x17, 0x5b, 0x3e, 0xf8, 0xa8, 0x9c, 0x02, 0xa4, 0x50, 0x8c, 0x04, 0xa2, 0xa8, 0xf3, 0xd1, 0xb1, - 0x25, 0x61, 0x29, 0x29, 0x71, 0x7e, 0xb0, 0x18, 0xee, 0x8e, 0xa8, 0x89, 0xb8, 0xb3, 0xc4, 0xce, - 0xf0, 0x2c, 0xb6, 0x41, 0x0a, 0x43, 0x45, 0x62, 0x20, 0x4d, 0x9a, 0x03, 0x0e, 0x48, 0x11, 0xa7, - 0x73, 0x61, 0xc4, 0x45, 0x90, 0x22, 0x9d, 0x93, 0x34, 0x07, 0x57, 0x41, 0x0a, 0x25, 0xb8, 0x2b, - 0x6c, 0xa4, 0x0a, 0xd2, 0x25, 0x55, 0x30, 0xb3, 0xb3, 0x3f, 0x14, 0xc5, 0x93, 0x74, 0x50, 0x0c, - 0x03, 0x6e, 0xc8, 0x9d, 0x99, 0xf7, 0xbe, 0x99, 0xf7, 0xbd, 0x9f, 0xf9, 0x81, 0x9b, 0xb6, 0xc7, - 0x5d, 0x8f, 0x2f, 0x71, 0x81, 0x0f, 0x28, 0x6b, 0x2f, 0xdd, 0xbf, 0xd3, 0x22, 0x02, 0xdf, 0x09, - 0xdb, 0xd5, 0xae, 0xef, 0x09, 0x0f, 0x5d, 0x0d, 0xa4, 0xaa, 0x61, 0xaf, 0x96, 0x2a, 0xce, 0xb7, - 0xbd, 0xb6, 0xa7, 0x44, 0x96, 0xe4, 0x57, 0x20, 0x5d, 0xbc, 0xde, 0xf6, 0xbc, 0x76, 0x87, 0x2c, - 0xa9, 0x56, 0xab, 0xb7, 0xb7, 0x84, 0x59, 0x5f, 0x0f, 0x2d, 0x9c, 0x1c, 0x72, 0x7a, 0x3e, 0x16, - 0xd4, 0x63, 0x7a, 0xbc, 0x74, 0x72, 0x5c, 0x50, 0x97, 0x70, 0x81, 0xdd, 0x6e, 0x88, 0x1d, 0xac, - 0xc4, 0x0a, 0x26, 0xd5, 0xcb, 0xd2, 0xd8, 0xda, 0x94, 0x16, 0xe6, 0x24, 0xb2, 0xc3, 0xf6, 0x68, - 0x88, 0x3d, 0x87, 0x5d, 0xca, 0xbc, 0x25, 0xf5, 0xab, 0xbb, 0xbe, 0x22, 0x08, 0x73, 0x88, 0xef, - 0x52, 0x26, 0x96, 0x44, 0xbf, 0x4b, 0x78, 0xf0, 0xab, 0x47, 0x6f, 0x24, 0x46, 0x71, 0xcb, 0xa6, - 0xc9, 0xc1, 0xca, 0x2f, 0x0d, 0x98, 0xbd, 0x47, 0xb9, 0xf0, 0x7c, 0x6a, 0xe3, 0x4e, 0x83, 0xed, - 0x79, 0xe8, 0x5b, 0x90, 0xd9, 0x27, 0xd8, 0x21, 0x7e, 0xc1, 0x28, 0x1b, 0x8b, 0xd9, 0xe5, 0x42, - 0x35, 0x06, 0xa8, 0x06, 0xba, 0xf7, 0xd4, 0x78, 0x6d, 0xea, 0xe3, 0xe3, 0xd2, 0xd8, 0xfb, 0x9f, - 0x7e, 0x70, 0xcb, 0x30, 0xb5, 0x0a, 0xaa, 0x43, 0xe6, 0x3e, 0xee, 0x70, 0x22, 0x0a, 0xa9, 0x72, - 0x7a, 0x31, 0xbb, 0xfc, 0x42, 0xf5, 0x74, 0xce, 0xab, 0xbb, 0xb8, 0x43, 0x1d, 0x2c, 0xbc, 0x41, - 0x94, 0x40, 0xb7, 0xf2, 0x51, 0x0a, 0x72, 0x6b, 0x9e, 0xeb, 0x52, 0xce, 0xa9, 0xc7, 0x4c, 0x2c, - 0x08, 0x47, 0x3b, 0x30, 0xee, 0x63, 0x41, 0xd4, 0xa2, 0xa6, 0x6a, 0xab, 0x52, 0xe9, 0x6f, 0xc7, - 0xa5, 0x97, 0xda, 0x54, 0xec, 0xf7, 0x5a, 0x55, 0xdb, 0x73, 0x35, 0x8d, 0xfa, 0xef, 0x36, 0x77, - 0x0e, 0xb4, 0xa5, 0x75, 0x62, 0x7f, 0xf2, 0xe1, 0x6d, 0xd0, 0x0b, 0xa9, 0x13, 0x3b, 0x98, 0x4c, - 0xc1, 0xa1, 0x1f, 0xc1, 0xa4, 0x8b, 0x0f, 0x2d, 0x05, 0x9d, 0xba, 0x2c, 0xe8, 0x09, 0x17, 0x1f, - 0xca, 0x55, 0x23, 0x0a, 0x39, 0x89, 0x6e, 0xef, 0x63, 0xd6, 0x26, 0xc1, 0x24, 0xe9, 0xcb, 0x9a, - 0x64, 0xc6, 0xc5, 0x87, 0x6b, 0x0a, 0x58, 0x4e, 0xb5, 0x32, 0xfe, 0xd9, 0xc3, 0x92, 0x51, 0xf9, - 0xa3, 0x01, 0x10, 0x33, 0x87, 0x30, 0xe4, 0xed, 0xa8, 0xa5, 0xe6, 0xe7, 0xda, 0xab, 0x2f, 0x8f, - 0x72, 0xcc, 0x09, 0xde, 0x6b, 0x33, 0x72, 0xa5, 0x8f, 0x8e, 0x4b, 0x46, 0x30, 0x6b, 0xce, 0x3e, - 0xe1, 0x97, 0x37, 0x20, 0xdb, 0xeb, 0x3a, 0x58, 0x10, 0x4b, 0x06, 0xb9, 0xe2, 0x30, 0xbb, 0x5c, - 0xac, 0x06, 0x19, 0x50, 0x0d, 0x33, 0xa0, 0xba, 0x1d, 0x66, 0x40, 0x00, 0xf8, 0xde, 0xdf, 0x43, - 0x40, 0x08, 0xb4, 0xe5, 0xb8, 0xb6, 0xe1, 0x7d, 0x03, 0xb2, 0x75, 0xc2, 0x6d, 0x9f, 0x76, 0x65, - 0x4e, 0xa1, 0x02, 0x4c, 0xb8, 0x1e, 0xa3, 0x07, 0x3a, 0x22, 0xa7, 0xcc, 0xb0, 0x89, 0x8a, 0x30, - 0x49, 0x1d, 0xc2, 0x04, 0x15, 0xfd, 0xc0, 0x79, 0x66, 0xd4, 0x96, 0x5a, 0xef, 0x90, 0x16, 0xa7, - 0x21, 0xe5, 0x66, 0xd8, 0x44, 0xaf, 0x40, 0x9e, 0x13, 0xbb, 0xe7, 0x53, 0xd1, 0xb7, 0x6c, 0x8f, - 0x09, 0x6c, 0x8b, 0xc2, 0xb8, 0x12, 0xc9, 0x85, 0xfd, 0x6b, 0x41, 0xb7, 0x04, 0x71, 0x88, 0xc0, - 0xb4, 0xc3, 0x0b, 0xcf, 0x05, 0x20, 0xba, 0xa9, 0x97, 0xfa, 0xd1, 0x04, 0x4c, 0x45, 0x91, 0x8c, - 0xd6, 0x20, 0xef, 0x75, 0x89, 0x2f, 0xbf, 0x2d, 0xec, 0x38, 0x3e, 0xe1, 0x5c, 0x87, 0x6b, 0xe1, - 0x93, 0x0f, 0x6f, 0xcf, 0x6b, 0xc2, 0x57, 0x83, 0x91, 0xa6, 0xf0, 0x29, 0x6b, 0x9b, 0xb9, 0x50, - 0x43, 0x77, 0xa3, 0xb7, 0xa5, 0xcb, 0x18, 0x27, 0x8c, 0xf7, 0xb8, 0xd5, 0xed, 0xb5, 0x0e, 0x48, - 0x5f, 0x93, 0x3a, 0x3f, 0x44, 0xea, 0x2a, 0xeb, 0xd7, 0x0a, 0x7f, 0x8e, 0xa1, 0x6d, 0xbf, 0xdf, - 0x15, 0x5e, 0x75, 0xab, 0xd7, 0xfa, 0x2e, 0xe9, 0x4b, 0x57, 0x69, 0x9c, 0x2d, 0x05, 0x83, 0xae, - 0x42, 0xe6, 0x27, 0x98, 0x76, 0x88, 0xa3, 0x18, 0x99, 0x34, 0x75, 0x0b, 0xad, 0x40, 0x86, 0x0b, - 0x2c, 0x7a, 0x5c, 0xd1, 0x30, 0xbb, 0x5c, 0x19, 0x15, 0x1b, 0x35, 0x8f, 0x39, 0x4d, 0x25, 0x69, - 0x6a, 0x0d, 0xb4, 0x0d, 0x19, 0xe1, 0x1d, 0x10, 0xa6, 0x09, 0xaa, 0xbd, 0x76, 0x81, 0xc0, 0x6e, - 0x30, 0x91, 0x08, 0xec, 0x06, 0x13, 0xa6, 0xc6, 0x42, 0x6d, 0xc8, 0x3b, 0xa4, 0x43, 0xda, 0x8a, - 0x4a, 0xbe, 0x8f, 0x7d, 0xc2, 0x0b, 0x99, 0x0b, 0xe3, 0x0f, 0x25, 0x8e, 0x99, 0x8b, 0x50, 0x9b, - 0x0a, 0x14, 0x6d, 0x41, 0xd6, 0x89, 0x43, 0xad, 0x30, 0xa1, 0x88, 0x7e, 0x71, 0x94, 0xfd, 0x89, - 0xa8, 0x4c, 0x96, 0xad, 0x24, 0x84, 0x8c, 0xae, 0x1e, 0x6b, 0x79, 0xcc, 0xa1, 0xac, 0x6d, 0xed, - 0x13, 0xda, 0xde, 0x17, 0x85, 0xc9, 0xb2, 0xb1, 0x98, 0x36, 0x73, 0x51, 0xff, 0x3d, 0xd5, 0x8d, - 0xb6, 0x60, 0x36, 0x16, 0x55, 0xd9, 0x33, 0x75, 0xd1, 0xec, 0x99, 0x89, 0x00, 0xa4, 0x08, 0x7a, - 0x0b, 0x20, 0xce, 0xcf, 0x02, 0x28, 0xb4, 0xca, 0xd9, 0x99, 0x9e, 0x34, 0x26, 0x01, 0x80, 0x3a, - 0x70, 0xc5, 0xa5, 0xcc, 0xe2, 0xa4, 0xb3, 0x67, 0x69, 0xe6, 0x24, 0x6e, 0xf6, 0x12, 0x3c, 0x3d, - 0xe7, 0x52, 0xd6, 0x24, 0x9d, 0xbd, 0x7a, 0x04, 0x8b, 0x5e, 0x83, 0x1b, 0x31, 0x1d, 0x1e, 0xb3, - 0xf6, 0xbd, 0x8e, 0x63, 0xf9, 0x64, 0xcf, 0xb2, 0xbd, 0x1e, 0x13, 0x85, 0x69, 0x45, 0xe2, 0xb5, - 0x48, 0x64, 0x93, 0xdd, 0xf3, 0x3a, 0x8e, 0x49, 0xf6, 0xd6, 0xe4, 0x30, 0x7a, 0x11, 0x62, 0x2e, - 0x2c, 0xea, 0xf0, 0xc2, 0x4c, 0x39, 0xbd, 0x38, 0x6e, 0x4e, 0x47, 0x9d, 0x0d, 0x87, 0xaf, 0x4c, - 0xbe, 0xfb, 0xb0, 0x34, 0xf6, 0xd9, 0xc3, 0xd2, 0x58, 0xe5, 0x2e, 0x4c, 0xef, 0xe2, 0x8e, 0x4e, - 0x3a, 0xc2, 0xd1, 0x37, 0x61, 0x0a, 0x87, 0x8d, 0x82, 0x51, 0x4e, 0x3f, 0x35, 0x69, 0x63, 0xd1, - 0xca, 0x43, 0x03, 0x32, 0xf5, 0xdd, 0x2d, 0x4c, 0x7d, 0xb4, 0x0e, 0x73, 0x71, 0xd0, 0x9e, 0x37, - 0xff, 0xe3, 0x38, 0x0f, 0x0b, 0xc0, 0x3a, 0xcc, 0xdd, 0x0f, 0x4b, 0x4a, 0x04, 0x93, 0x3a, 0x0b, - 0x26, 0x52, 0xd1, 0xfd, 0x09, 0x53, 0xdf, 0x80, 0x89, 0x60, 0x85, 0x1c, 0x7d, 0x07, 0x9e, 0xeb, - 0xca, 0x0f, 0x65, 0x61, 0x76, 0x79, 0x61, 0x64, 0xa0, 0x2b, 0xf9, 0x64, 0x58, 0x04, 0x7a, 0x95, - 0xff, 0x18, 0x00, 0xf5, 0xdd, 0xdd, 0x6d, 0x9f, 0x76, 0x3b, 0x44, 0x5c, 0x96, 0xc9, 0x6f, 0xc2, - 0xf3, 0xb1, 0xc9, 0xdc, 0xb7, 0xcf, 0x6d, 0xf6, 0x95, 0x48, 0xad, 0xe9, 0xdb, 0xa7, 0xa2, 0x39, - 0x5c, 0x44, 0x68, 0xe9, 0x73, 0xa3, 0xd5, 0xb9, 0x18, 0xe6, 0xf1, 0xfb, 0x90, 0x8d, 0x4d, 0xe7, - 0xa8, 0x01, 0x93, 0x42, 0x7f, 0x6b, 0x3a, 0x2b, 0xa3, 0xe9, 0x0c, 0xd5, 0x92, 0x94, 0x46, 0xea, - 0x95, 0xff, 0x4a, 0x56, 0xe3, 0x44, 0xf8, 0x42, 0x05, 0x92, 0xac, 0xf0, 0xba, 0x02, 0xa7, 0x2f, - 0xa1, 0x02, 0x6b, 0xac, 0x04, 0xad, 0x3f, 0x4b, 0xc1, 0x95, 0x9d, 0x30, 0x49, 0xbf, 0xb0, 0x2c, - 0xec, 0xc0, 0x04, 0x61, 0xc2, 0xa7, 0x8a, 0x06, 0xe9, 0xec, 0xaf, 0x8f, 0x72, 0xf6, 0x29, 0xb6, - 0xac, 0x33, 0xe1, 0xf7, 0x93, 0xae, 0x0f, 0xb1, 0x12, 0x34, 0xfc, 0x21, 0x0d, 0x85, 0x51, 0xaa, - 0xe8, 0x65, 0xc8, 0xd9, 0x3e, 0x51, 0x1d, 0xe1, 0x9e, 0x62, 0xa8, 0x72, 0x38, 0x1b, 0x76, 0xeb, - 0x2d, 0xc5, 0x04, 0x79, 0x40, 0x93, 0x51, 0x25, 0x45, 0x9f, 0xed, 0x44, 0x36, 0x1b, 0x23, 0xa8, - 0x4d, 0x85, 0x40, 0x8e, 0x32, 0x2a, 0x28, 0xee, 0x58, 0x2d, 0xdc, 0xc1, 0xcc, 0x26, 0xcf, 0x10, - 0x09, 0xc3, 0x3b, 0xc0, 0xac, 0x06, 0xad, 0x05, 0x98, 0x68, 0x17, 0x26, 0x42, 0xf8, 0xf1, 0x4b, - 0x80, 0x0f, 0xc1, 0xd0, 0x0b, 0x30, 0x9d, 0xdc, 0x18, 0xd4, 0x39, 0x65, 0xdc, 0xcc, 0x26, 0xf6, - 0x85, 0xb3, 0x76, 0x9e, 0xcc, 0x53, 0x77, 0x1e, 0x7d, 0x14, 0xfc, 0x7d, 0x1a, 0xe6, 0x4c, 0xe2, - 0x7c, 0x09, 0x1d, 0xf7, 0x43, 0x80, 0x20, 0xa9, 0x65, 0xb1, 0x7d, 0x06, 0xdf, 0x0d, 0x17, 0x89, - 0xa9, 0x00, 0xaf, 0xce, 0xc5, 0xe7, 0xe5, 0xbd, 0xbf, 0xa4, 0x60, 0x3a, 0xe9, 0xbd, 0x2f, 0xc1, - 0xce, 0x86, 0x36, 0xe2, 0x92, 0x36, 0xae, 0x4a, 0xda, 0x2b, 0xa3, 0x4a, 0xda, 0x50, 0x5c, 0x9f, - 0x51, 0xcb, 0x7e, 0x93, 0x86, 0xcc, 0x16, 0xf6, 0xb1, 0xcb, 0xd1, 0xe6, 0xd0, 0x19, 0x37, 0xb8, - 0x7f, 0x5e, 0x1f, 0x0a, 0xeb, 0xba, 0x7e, 0x43, 0x09, 0xa2, 0xfa, 0x57, 0xa3, 0x8e, 0xb8, 0x5f, - 0x83, 0x59, 0x79, 0xa5, 0x8e, 0x0c, 0x0a, 0xa8, 0x9c, 0x51, 0xd7, 0xe1, 0xe8, 0x2a, 0xc6, 0x51, - 0x09, 0xb2, 0x52, 0x2c, 0xae, 0xd9, 0x52, 0x06, 0x5c, 0x7c, 0xb8, 0x1e, 0xf4, 0xa0, 0xdb, 0x80, - 0xf6, 0xa3, 0x87, 0x0f, 0x2b, 0x26, 0x42, 0xca, 0xcd, 0xc5, 0x23, 0xa1, 0xf8, 0x57, 0x01, 0xe4, - 0x2a, 0x2c, 0x87, 0x30, 0xcf, 0xd5, 0x97, 0xc1, 0x29, 0xd9, 0x53, 0x97, 0x1d, 0xe8, 0x17, 0x46, - 0x70, 0x54, 0x3e, 0x71, 0xdb, 0xd6, 0x97, 0x16, 0xeb, 0x62, 0xd9, 0xf0, 0xef, 0xe3, 0x52, 0xb1, - 0x8f, 0xdd, 0xce, 0x4a, 0xe5, 0x14, 0xc8, 0xca, 0x69, 0x6f, 0x01, 0xf2, 0x34, 0x3d, 0x78, 0x71, - 0x5f, 0xb9, 0x29, 0xe3, 0xfa, 0xe8, 0xd3, 0x0f, 0x6e, 0xdd, 0x48, 0x4c, 0x71, 0x18, 0xbd, 0x90, - 0x05, 0xee, 0xa9, 0xfc, 0xd6, 0x00, 0x14, 0x6f, 0x36, 0x26, 0xe1, 0x5d, 0x79, 0x67, 0x94, 0xf7, - 0x88, 0xc4, 0x79, 0xdf, 0x78, 0xfa, 0x3d, 0x22, 0xd6, 0x1f, 0xb8, 0x47, 0x24, 0x92, 0xe9, 0xdb, - 0x71, 0x69, 0x4f, 0x69, 0xef, 0x6b, 0xac, 0x16, 0xe6, 0x24, 0x71, 0x21, 0xa1, 0x03, 0x10, 0xa1, - 0x92, 0xca, 0xd1, 0xb1, 0xca, 0xb1, 0x01, 0xd7, 0x87, 0x22, 0x31, 0x5a, 0xb2, 0x0d, 0xc8, 0x4f, - 0x0c, 0x2a, 0x8f, 0xf6, 0xf5, 0xd2, 0x9f, 0x2d, 0xb0, 0xe7, 0xfc, 0xa1, 0x72, 0xfe, 0x7f, 0xda, - 0xa3, 0x74, 0x11, 0xfa, 0x93, 0x01, 0xf3, 0xc9, 0x15, 0x45, 0xb6, 0x35, 0x61, 0x3a, 0xb9, 0x16, - 0x6d, 0xd5, 0xcd, 0xf3, 0x58, 0x95, 0x34, 0x68, 0x00, 0x44, 0xda, 0x12, 0x46, 0x7d, 0xf0, 0x56, - 0x77, 0xe7, 0xdc, 0x2c, 0x85, 0x0b, 0x3b, 0xb5, 0x0c, 0x04, 0xce, 0xfa, 0x79, 0x0a, 0xc6, 0xb7, - 0x3c, 0xaf, 0x83, 0x7e, 0x6a, 0xc0, 0x1c, 0xf3, 0x84, 0x25, 0x73, 0x85, 0x38, 0x96, 0x7e, 0x2c, - 0x08, 0x2a, 0xe9, 0xee, 0xc5, 0xd8, 0xfb, 0xe7, 0x71, 0x69, 0x18, 0x6a, 0x90, 0x52, 0xfd, 0x48, - 0xc5, 0x3c, 0x51, 0x53, 0x42, 0xdb, 0xc1, 0x7b, 0xc2, 0x3b, 0x30, 0x33, 0x38, 0x7f, 0x50, 0x7e, - 0xcd, 0x0b, 0xcf, 0x3f, 0x73, 0xe6, 0xdc, 0xd3, 0xad, 0xc4, 0xc4, 0x2b, 0x93, 0xd2, 0xb1, 0xff, - 0x92, 0xce, 0x7d, 0x1b, 0xf2, 0x51, 0x79, 0xda, 0x51, 0x4f, 0x5e, 0xf2, 0x6c, 0x3a, 0x11, 0xbc, - 0x7e, 0x85, 0x37, 0x88, 0x72, 0xf2, 0xad, 0x15, 0xb7, 0x6c, 0x5a, 0x3d, 0xa1, 0x33, 0xc0, 0xb8, - 0xd6, 0xbd, 0xf5, 0x3b, 0x03, 0x20, 0x7e, 0x9a, 0x41, 0xaf, 0xc2, 0xb5, 0xda, 0xe6, 0x46, 0xdd, - 0x6a, 0x6e, 0xaf, 0x6e, 0xef, 0x34, 0xad, 0x9d, 0x8d, 0xe6, 0xd6, 0xfa, 0x5a, 0xe3, 0x6e, 0x63, - 0xbd, 0x9e, 0x1f, 0x2b, 0xe6, 0x8e, 0x1e, 0x94, 0xb3, 0x3b, 0x8c, 0x77, 0x89, 0x4d, 0xf7, 0x28, - 0x71, 0xd0, 0x4b, 0x30, 0x3f, 0x28, 0x2d, 0x5b, 0xeb, 0xf5, 0xbc, 0x51, 0x9c, 0x3e, 0x7a, 0x50, - 0x9e, 0x0c, 0x8e, 0xa4, 0xc4, 0x41, 0x8b, 0xf0, 0xfc, 0xb0, 0x5c, 0x63, 0xe3, 0xf5, 0x7c, 0xaa, - 0x38, 0x73, 0xf4, 0xa0, 0x3c, 0x15, 0x9d, 0x5d, 0x51, 0x05, 0x50, 0x52, 0x52, 0xe3, 0xa5, 0x8b, - 0x70, 0xf4, 0xa0, 0x9c, 0x09, 0xdc, 0x52, 0x1c, 0x7f, 0xf7, 0xd7, 0x0b, 0x63, 0xb7, 0x7e, 0x0c, - 0xd0, 0x60, 0x7b, 0x3e, 0xb6, 0x55, 0x40, 0x16, 0xe1, 0x6a, 0x63, 0xe3, 0xae, 0xb9, 0xba, 0xb6, - 0xdd, 0xd8, 0xdc, 0x18, 0x5c, 0xf6, 0x89, 0xb1, 0xfa, 0xe6, 0x4e, 0xed, 0xcd, 0x75, 0xab, 0xd9, - 0x78, 0x7d, 0x23, 0x6f, 0xa0, 0x6b, 0x70, 0x65, 0x60, 0xec, 0x7b, 0x1b, 0xdb, 0x8d, 0xb7, 0xd6, - 0xf3, 0xa9, 0xda, 0xdd, 0x8f, 0x1f, 0x2f, 0x18, 0x8f, 0x1e, 0x2f, 0x18, 0xff, 0x78, 0xbc, 0x60, - 0xbc, 0xf7, 0x64, 0x61, 0xec, 0xd1, 0x93, 0x85, 0xb1, 0xbf, 0x3e, 0x59, 0x18, 0xfb, 0xc1, 0xab, - 0x4f, 0x75, 0x78, 0x5c, 0x25, 0x95, 0xeb, 0x5b, 0x19, 0xb5, 0x47, 0x7d, 0xe3, 0x7f, 0x01, 0x00, - 0x00, 0xff, 0xff, 0x93, 0xd7, 0xc2, 0x0d, 0x66, 0x18, 0x00, 0x00, + // 2020 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x4b, 0x6c, 0x1b, 0xc7, + 0x19, 0xd6, 0x92, 0x34, 0x25, 0xfd, 0x94, 0x44, 0x6a, 0xec, 0xd8, 0x14, 0xdd, 0x8a, 0x0c, 0xe3, + 0x26, 0x8e, 0x11, 0x53, 0xb5, 0x0b, 0xe4, 0xa0, 0x06, 0x2d, 0x4c, 0x51, 0x8a, 0x99, 0x87, 0x24, + 0x2c, 0x25, 0xb5, 0xe9, 0x03, 0x8b, 0xe1, 0xee, 0x90, 0xda, 0x8a, 0x9c, 0x25, 0x76, 0x86, 0xb6, + 0x79, 0x2d, 0x7a, 0x08, 0x74, 0x68, 0x03, 0xf4, 0xd2, 0x8b, 0x01, 0x03, 0xbd, 0xa4, 0xb7, 0x1c, + 0x82, 0xe6, 0x50, 0xf4, 0xd0, 0x5b, 0xda, 0x5e, 0x8c, 0x9c, 0x8a, 0x1e, 0xd4, 0xc2, 0x3e, 0x24, + 0x28, 0x50, 0xa0, 0xc8, 0xa5, 0x68, 0x4f, 0xc5, 0x3c, 0xf6, 0x41, 0x51, 0xb4, 0x1e, 0x55, 0x8b, + 0x00, 0xb9, 0x90, 0x3b, 0x33, 0xff, 0xff, 0xcd, 0xfc, 0xcf, 0x99, 0xff, 0x87, 0x6b, 0xb6, 0xc7, + 0xba, 0x1e, 0x5b, 0x62, 0x1c, 0xef, 0xb9, 0xb4, 0xbd, 0x74, 0xef, 0x56, 0x93, 0x70, 0x7c, 0x2b, + 0x18, 0x57, 0x7a, 0xbe, 0xc7, 0x3d, 0x74, 0x59, 0x51, 0x55, 0x82, 0x59, 0x4d, 0x55, 0xb8, 0xd4, + 0xf6, 0xda, 0x9e, 0x24, 0x59, 0x12, 0x5f, 0x8a, 0xba, 0xb0, 0xd0, 0xf6, 0xbc, 0x76, 0x87, 0x2c, + 0xc9, 0x51, 0xb3, 0xdf, 0x5a, 0xc2, 0x74, 0xa0, 0x97, 0x16, 0x0f, 0x2f, 0x39, 0x7d, 0x1f, 0x73, + 0xd7, 0xa3, 0x7a, 0xbd, 0x78, 0x78, 0x9d, 0xbb, 0x5d, 0xc2, 0x38, 0xee, 0xf6, 0x02, 0x6c, 0x75, + 0x12, 0x4b, 0x6d, 0xaa, 0x8f, 0xa5, 0xb1, 0xb5, 0x28, 0x4d, 0xcc, 0x48, 0x28, 0x87, 0xed, 0xb9, + 0x01, 0xf6, 0x3c, 0xee, 0xba, 0xd4, 0x5b, 0x92, 0xbf, 0x7a, 0xea, 0x2b, 0x9c, 0x50, 0x87, 0xf8, + 0x5d, 0x97, 0xf2, 0x25, 0x3e, 0xe8, 0x11, 0xa6, 0x7e, 0xf5, 0xea, 0xd5, 0xd8, 0x2a, 0x6e, 0xda, + 0x6e, 0x7c, 0xb1, 0xfc, 0x73, 0x03, 0xe6, 0xee, 0xba, 0x8c, 0x7b, 0xbe, 0x6b, 0xe3, 0x4e, 0x9d, + 0xb6, 0x3c, 0xf4, 0x4d, 0x48, 0xef, 0x12, 0xec, 0x10, 0x3f, 0x6f, 0x94, 0x8c, 0xeb, 0x99, 0xdb, + 0xf9, 0x4a, 0x04, 0x50, 0x51, 0xbc, 0x77, 0xe5, 0x7a, 0x75, 0xfa, 0xe3, 0x83, 0xe2, 0xc4, 0xfb, + 0x9f, 0x7e, 0x70, 0xc3, 0x30, 0x35, 0x0b, 0xaa, 0x41, 0xfa, 0x1e, 0xee, 0x30, 0xc2, 0xf3, 0x89, + 0x52, 0xf2, 0x7a, 0xe6, 0xf6, 0xf3, 0x95, 0xa3, 0x75, 0x5e, 0xd9, 0xc1, 0x1d, 0xd7, 0xc1, 0xdc, + 0x1b, 0x46, 0x51, 0xbc, 0xe5, 0x8f, 0x12, 0x90, 0x5d, 0xf1, 0xba, 0x5d, 0x97, 0x31, 0xd7, 0xa3, + 0x26, 0xe6, 0x84, 0xa1, 0x6d, 0x48, 0xf9, 0x98, 0x13, 0x79, 0xa8, 0xe9, 0xea, 0x1d, 0xc1, 0xf4, + 0xe7, 0x83, 0xe2, 0x8b, 0x6d, 0x97, 0xef, 0xf6, 0x9b, 0x15, 0xdb, 0xeb, 0x6a, 0x35, 0xea, 0xbf, + 0x9b, 0xcc, 0xd9, 0xd3, 0x92, 0xd6, 0x88, 0xfd, 0xc9, 0x87, 0x37, 0x41, 0x1f, 0xa4, 0x46, 0x6c, + 0xb5, 0x99, 0x84, 0x43, 0x3f, 0x80, 0xa9, 0x2e, 0x7e, 0x60, 0x49, 0xe8, 0xc4, 0x79, 0x41, 0x4f, + 0x76, 0xf1, 0x03, 0x71, 0x6a, 0xe4, 0x42, 0x56, 0xa0, 0xdb, 0xbb, 0x98, 0xb6, 0x89, 0xda, 0x24, + 0x79, 0x5e, 0x9b, 0xcc, 0x76, 0xf1, 0x83, 0x15, 0x09, 0x2c, 0xb6, 0x5a, 0x4e, 0x7d, 0xf6, 0xa8, + 0x68, 0x94, 0x7f, 0x67, 0x00, 0x44, 0x9a, 0x43, 0x18, 0x72, 0x76, 0x38, 0x92, 0xfb, 0x33, 0x6d, + 0xd5, 0x97, 0xc6, 0x19, 0xe6, 0x90, 0xde, 0xab, 0xb3, 0xe2, 0xa4, 0x8f, 0x0f, 0x8a, 0x86, 0xda, + 0x35, 0x6b, 0x1f, 0xb2, 0xcb, 0x1b, 0x90, 0xe9, 0xf7, 0x1c, 0xcc, 0x89, 0x25, 0x9c, 0x5c, 0xea, + 0x30, 0x73, 0xbb, 0x50, 0x51, 0x11, 0x50, 0x09, 0x22, 0xa0, 0xb2, 0x15, 0x44, 0x80, 0x02, 0x7c, + 0xef, 0x2f, 0x01, 0x20, 0x28, 0x6e, 0xb1, 0xae, 0x65, 0x78, 0xdf, 0x80, 0x4c, 0x8d, 0x30, 0xdb, + 0x77, 0x7b, 0x22, 0xa6, 0x50, 0x1e, 0x26, 0xbb, 0x1e, 0x75, 0xf7, 0xb4, 0x47, 0x4e, 0x9b, 0xc1, + 0x10, 0x15, 0x60, 0xca, 0x75, 0x08, 0xe5, 0x2e, 0x1f, 0x28, 0xe3, 0x99, 0xe1, 0x58, 0x70, 0xdd, + 0x27, 0x4d, 0xe6, 0x06, 0x2a, 0x37, 0x83, 0x21, 0x7a, 0x19, 0x72, 0x8c, 0xd8, 0x7d, 0xdf, 0xe5, + 0x03, 0xcb, 0xf6, 0x28, 0xc7, 0x36, 0xcf, 0xa7, 0x24, 0x49, 0x36, 0x98, 0x5f, 0x51, 0xd3, 0x02, + 0xc4, 0x21, 0x1c, 0xbb, 0x1d, 0x96, 0xbf, 0xa0, 0x40, 0xf4, 0x50, 0x1f, 0xf5, 0xa3, 0x49, 0x98, + 0x0e, 0x3d, 0x19, 0xad, 0x40, 0xce, 0xeb, 0x11, 0x5f, 0x7c, 0x5b, 0xd8, 0x71, 0x7c, 0xc2, 0x98, + 0x76, 0xd7, 0xfc, 0x27, 0x1f, 0xde, 0xbc, 0xa4, 0x15, 0x7e, 0x47, 0xad, 0x34, 0xb8, 0xef, 0xd2, + 0xb6, 0x99, 0x0d, 0x38, 0xf4, 0x34, 0x7a, 0x47, 0x98, 0x8c, 0x32, 0x42, 0x59, 0x9f, 0x59, 0xbd, + 0x7e, 0x73, 0x8f, 0x0c, 0xb4, 0x52, 0x2f, 0x8d, 0x28, 0xf5, 0x0e, 0x1d, 0x54, 0xf3, 0x7f, 0x88, + 0xa0, 0x6d, 0x7f, 0xd0, 0xe3, 0x5e, 0x65, 0xb3, 0xdf, 0x7c, 0x93, 0x0c, 0x84, 0xa9, 0x34, 0xce, + 0xa6, 0x84, 0x41, 0x97, 0x21, 0xfd, 0x23, 0xec, 0x76, 0x88, 0x23, 0x35, 0x32, 0x65, 0xea, 0x11, + 0x5a, 0x86, 0x34, 0xe3, 0x98, 0xf7, 0x99, 0x54, 0xc3, 0xdc, 0xed, 0xf2, 0x38, 0xdf, 0xa8, 0x7a, + 0xd4, 0x69, 0x48, 0x4a, 0x53, 0x73, 0xa0, 0x2d, 0x48, 0x73, 0x6f, 0x8f, 0x50, 0xad, 0xa0, 0xea, + 0x6b, 0xa7, 0x70, 0xec, 0x3a, 0xe5, 0x31, 0xc7, 0xae, 0x53, 0x6e, 0x6a, 0x2c, 0xd4, 0x86, 0x9c, + 0x43, 0x3a, 0xa4, 0x2d, 0x55, 0xc9, 0x76, 0xb1, 0x4f, 0x58, 0x3e, 0x7d, 0x6a, 0xfc, 0x91, 0xc0, + 0x31, 0xb3, 0x21, 0x6a, 0x43, 0x82, 0xa2, 0x4d, 0xc8, 0x38, 0x91, 0xab, 0xe5, 0x27, 0xa5, 0xa2, + 0x5f, 0x18, 0x27, 0x7f, 0xcc, 0x2b, 0xe3, 0x69, 0x2b, 0x0e, 0x21, 0xbc, 0xab, 0x4f, 0x9b, 0x1e, + 0x75, 0x5c, 0xda, 0xb6, 0x76, 0x89, 0xdb, 0xde, 0xe5, 0xf9, 0xa9, 0x92, 0x71, 0x3d, 0x69, 0x66, + 0xc3, 0xf9, 0xbb, 0x72, 0x1a, 0x6d, 0xc2, 0x5c, 0x44, 0x2a, 0xa3, 0x67, 0xfa, 0xb4, 0xd1, 0x33, + 0x1b, 0x02, 0x08, 0x12, 0xf4, 0x36, 0x40, 0x14, 0x9f, 0x79, 0x90, 0x68, 0xe5, 0xe3, 0x23, 0x3d, + 0x2e, 0x4c, 0x0c, 0x00, 0x75, 0xe0, 0x62, 0xd7, 0xa5, 0x16, 0x23, 0x9d, 0x96, 0xa5, 0x35, 0x27, + 0x70, 0x33, 0xe7, 0x60, 0xe9, 0xf9, 0xae, 0x4b, 0x1b, 0xa4, 0xd3, 0xaa, 0x85, 0xb0, 0xe8, 0x35, + 0xb8, 0x1a, 0xa9, 0xc3, 0xa3, 0xd6, 0xae, 0xd7, 0x71, 0x2c, 0x9f, 0xb4, 0x2c, 0xdb, 0xeb, 0x53, + 0x9e, 0x9f, 0x91, 0x4a, 0xbc, 0x12, 0x92, 0x6c, 0xd0, 0xbb, 0x5e, 0xc7, 0x31, 0x49, 0x6b, 0x45, + 0x2c, 0xa3, 0x17, 0x20, 0xd2, 0x85, 0xe5, 0x3a, 0x2c, 0x3f, 0x5b, 0x4a, 0x5e, 0x4f, 0x99, 0x33, + 0xe1, 0x64, 0xdd, 0x61, 0xcb, 0x53, 0xef, 0x3e, 0x2a, 0x4e, 0x7c, 0xf6, 0xa8, 0x38, 0x51, 0x5e, + 0x83, 0x99, 0x1d, 0xdc, 0xd1, 0x41, 0x47, 0x18, 0x7a, 0x15, 0xa6, 0x71, 0x30, 0xc8, 0x1b, 0xa5, + 0xe4, 0x33, 0x83, 0x36, 0x22, 0x2d, 0x3f, 0x32, 0x20, 0x5d, 0xdb, 0xd9, 0xc4, 0xae, 0x8f, 0x56, + 0x61, 0x3e, 0x72, 0xda, 0x93, 0xc6, 0x7f, 0xe4, 0xe7, 0x41, 0x02, 0x58, 0x85, 0xf9, 0x7b, 0x41, + 0x4a, 0x09, 0x61, 0x12, 0xc7, 0xc1, 0x84, 0x2c, 0x7a, 0x3e, 0x26, 0xea, 0x1b, 0x30, 0xa9, 0x4e, + 0xc8, 0xd0, 0xb7, 0xe1, 0x42, 0x4f, 0x7c, 0x48, 0x09, 0x33, 0xb7, 0x17, 0xc7, 0x3a, 0xba, 0xa4, + 0x8f, 0xbb, 0x85, 0xe2, 0x2b, 0xff, 0xcb, 0x00, 0xa8, 0xed, 0xec, 0x6c, 0xf9, 0x6e, 0xaf, 0x43, + 0xf8, 0x79, 0x89, 0xfc, 0x16, 0x3c, 0x17, 0x89, 0xcc, 0x7c, 0xfb, 0xc4, 0x62, 0x5f, 0x0c, 0xd9, + 0x1a, 0xbe, 0x7d, 0x24, 0x9a, 0xc3, 0x78, 0x88, 0x96, 0x3c, 0x31, 0x5a, 0x8d, 0xf1, 0x51, 0x3d, + 0x7e, 0x17, 0x32, 0x91, 0xe8, 0x0c, 0xd5, 0x61, 0x8a, 0xeb, 0x6f, 0xad, 0xce, 0xf2, 0x78, 0x75, + 0x06, 0x6c, 0x71, 0x95, 0x86, 0xec, 0xe5, 0x7f, 0x0b, 0xad, 0x46, 0x81, 0xf0, 0x85, 0x72, 0x24, + 0x91, 0xe1, 0x75, 0x06, 0x4e, 0x9e, 0x43, 0x06, 0xd6, 0x58, 0x31, 0xb5, 0xfe, 0x24, 0x01, 0x17, + 0xb7, 0x83, 0x20, 0xfd, 0xc2, 0x6a, 0x61, 0x1b, 0x26, 0x09, 0xe5, 0xbe, 0x2b, 0xd5, 0x20, 0x8c, + 0xfd, 0xf5, 0x71, 0xc6, 0x3e, 0x42, 0x96, 0x55, 0xca, 0xfd, 0x41, 0xdc, 0xf4, 0x01, 0x56, 0x4c, + 0x0d, 0xbf, 0x4d, 0x42, 0x7e, 0x1c, 0x2b, 0x7a, 0x09, 0xb2, 0xb6, 0x4f, 0xe4, 0x44, 0x70, 0xa7, + 0x18, 0x32, 0x1d, 0xce, 0x05, 0xd3, 0xfa, 0x4a, 0x31, 0x41, 0x3c, 0xd0, 0x84, 0x57, 0x09, 0xd2, + 0xb3, 0xbd, 0xc8, 0xe6, 0x22, 0x04, 0x79, 0xa9, 0x10, 0xc8, 0xba, 0xd4, 0xe5, 0x2e, 0xee, 0x58, + 0x4d, 0xdc, 0xc1, 0xd4, 0x26, 0x67, 0xf0, 0x84, 0xd1, 0x1b, 0x60, 0x4e, 0x83, 0x56, 0x15, 0x26, + 0xda, 0x81, 0xc9, 0x00, 0x3e, 0x75, 0x0e, 0xf0, 0x01, 0x18, 0x7a, 0x1e, 0x66, 0xe2, 0x17, 0x83, + 0x7c, 0xa7, 0xa4, 0xcc, 0x4c, 0xec, 0x5e, 0x38, 0xee, 0xe6, 0x49, 0x3f, 0xf3, 0xe6, 0xd1, 0x4f, + 0xc1, 0xdf, 0x24, 0x61, 0xde, 0x24, 0xce, 0x97, 0xd0, 0x70, 0xdf, 0x07, 0x50, 0x41, 0x2d, 0x92, + 0xed, 0x19, 0x6c, 0x37, 0x9a, 0x24, 0xa6, 0x15, 0x5e, 0x8d, 0xf1, 0xff, 0x97, 0xf5, 0xfe, 0x98, + 0x80, 0x99, 0xb8, 0xf5, 0xbe, 0x04, 0x37, 0x1b, 0x5a, 0x8f, 0x52, 0x5a, 0x4a, 0xa6, 0xb4, 0x97, + 0xc7, 0xa5, 0xb4, 0x11, 0xbf, 0x3e, 0x26, 0x97, 0xfd, 0x33, 0x09, 0xe9, 0x4d, 0xec, 0xe3, 0x2e, + 0x43, 0x1b, 0x23, 0x6f, 0x5c, 0x55, 0x7f, 0x2e, 0x8c, 0xb8, 0x75, 0x4d, 0xf7, 0x50, 0x94, 0x57, + 0xff, 0x62, 0xdc, 0x13, 0xf7, 0x6b, 0x30, 0x27, 0x4a, 0xea, 0x50, 0x20, 0xa5, 0xca, 0x59, 0x59, + 0x0e, 0x87, 0xa5, 0x18, 0x43, 0x45, 0xc8, 0x08, 0xb2, 0x28, 0x67, 0x0b, 0x1a, 0xe8, 0xe2, 0x07, + 0xab, 0x6a, 0x06, 0xdd, 0x04, 0xb4, 0x1b, 0x36, 0x3e, 0xac, 0x48, 0x11, 0x82, 0x6e, 0x3e, 0x5a, + 0x09, 0xc8, 0xbf, 0x0a, 0x20, 0x4e, 0x61, 0x39, 0x84, 0x7a, 0x5d, 0x5d, 0x0c, 0x4e, 0x8b, 0x99, + 0x9a, 0x98, 0x40, 0x3f, 0x33, 0xd4, 0x53, 0xf9, 0x50, 0xb5, 0xad, 0x8b, 0x16, 0xeb, 0x74, 0xd1, + 0xf0, 0xf9, 0x41, 0xb1, 0x30, 0xc0, 0xdd, 0xce, 0x72, 0xf9, 0x08, 0xc8, 0xf2, 0x51, 0xbd, 0x00, + 0xf1, 0x9a, 0x1e, 0x2e, 0xdc, 0xd1, 0x3a, 0xe4, 0xf6, 0xc8, 0xc0, 0xf2, 0x3d, 0xae, 0xb2, 0x4f, + 0x8b, 0x10, 0x5d, 0xde, 0x2c, 0x04, 0x66, 0x6e, 0x62, 0x46, 0x62, 0xd5, 0x80, 0x3b, 0x54, 0x07, + 0xcc, 0xed, 0x91, 0x81, 0xa9, 0x99, 0xd7, 0x08, 0x59, 0xbe, 0x26, 0xe2, 0x64, 0xff, 0xd3, 0x0f, + 0x6e, 0x5c, 0x8d, 0x1d, 0xf9, 0x41, 0xd8, 0x71, 0x53, 0xe6, 0x2e, 0xff, 0xca, 0x00, 0x14, 0x5d, + 0x5e, 0x26, 0x61, 0x3d, 0x51, 0x83, 0x8a, 0xba, 0x24, 0x56, 0x3f, 0x18, 0xcf, 0xae, 0x4b, 0x22, + 0xfe, 0xa1, 0xba, 0x24, 0x16, 0x9c, 0xdf, 0x8a, 0xae, 0x8a, 0xc4, 0x29, 0x44, 0x0a, 0x98, 0x64, + 0xcc, 0x4f, 0x94, 0x0f, 0x0c, 0x58, 0x18, 0xf1, 0xec, 0xf0, 0xc8, 0x36, 0x20, 0x3f, 0xb6, 0x28, + 0x3d, 0x64, 0xa0, 0x8f, 0x7e, 0xb6, 0x40, 0x99, 0xf7, 0x47, 0xae, 0x87, 0xff, 0xd1, 0x9d, 0xa7, + 0x93, 0xda, 0xef, 0x0d, 0xb8, 0x14, 0x3f, 0x51, 0x28, 0x5b, 0x03, 0x66, 0xe2, 0x67, 0xd1, 0x52, + 0x5d, 0x3b, 0x89, 0x54, 0x71, 0x81, 0x86, 0x40, 0x84, 0x2c, 0x41, 0x14, 0xa9, 0xde, 0xdf, 0xad, + 0x13, 0x6b, 0x29, 0x38, 0xd8, 0x91, 0x69, 0x45, 0x19, 0xeb, 0xa7, 0x09, 0x48, 0x6d, 0x7a, 0x5e, + 0x07, 0xfd, 0xd8, 0x80, 0x79, 0xea, 0x71, 0x4b, 0xc4, 0x1e, 0x71, 0x2c, 0xdd, 0x7c, 0x50, 0x99, + 0x79, 0xe7, 0x74, 0xda, 0xfb, 0xdb, 0x41, 0x71, 0x14, 0x6a, 0x58, 0xa5, 0xba, 0xe9, 0x45, 0x3d, + 0x5e, 0x95, 0x44, 0x5b, 0xaa, 0x3f, 0x71, 0x1f, 0x66, 0x87, 0xf7, 0x57, 0xe9, 0xdc, 0x3c, 0xf5, + 0xfe, 0xb3, 0xc7, 0xee, 0x3d, 0xd3, 0x8c, 0x6d, 0xbc, 0x3c, 0x25, 0x0c, 0xfb, 0x0f, 0x61, 0xdc, + 0x77, 0x20, 0x17, 0xa6, 0xbb, 0x6d, 0xd9, 0x42, 0x13, 0x6f, 0xdd, 0x49, 0xd5, 0x4d, 0x0b, 0x2a, + 0x92, 0x52, 0xbc, 0x77, 0x8b, 0x9b, 0xb6, 0x5b, 0x39, 0xc4, 0x33, 0xa4, 0x71, 0xcd, 0x5b, 0xfe, + 0x7b, 0x02, 0x16, 0x56, 0x3c, 0xca, 0x74, 0x1f, 0x49, 0x27, 0x01, 0xd5, 0x26, 0x1e, 0xa0, 0xb5, + 0xb1, 0x5d, 0xae, 0xab, 0x9f, 0x1f, 0x14, 0xaf, 0xa8, 0xc4, 0x75, 0x98, 0xa2, 0x3c, 0xda, 0xe8, + 0xda, 0x81, 0xac, 0xb8, 0xa8, 0x6d, 0x8f, 0xfe, 0x97, 0x7d, 0xae, 0x59, 0xaf, 0xe3, 0xe8, 0xe3, + 0xee, 0x11, 0x11, 0x53, 0x59, 0x4a, 0xee, 0x0f, 0xe1, 0x26, 0xcf, 0x86, 0x4b, 0xc9, 0xfd, 0x18, + 0xee, 0x65, 0x48, 0xeb, 0x17, 0x5c, 0x4a, 0xbe, 0x41, 0xf4, 0x08, 0xbd, 0x0a, 0x49, 0x91, 0x5b, + 0x2f, 0x9c, 0x22, 0x11, 0x09, 0x86, 0xd8, 0x75, 0xd9, 0x80, 0x05, 0xdd, 0x8b, 0x60, 0x1b, 0x2d, + 0xa9, 0x6e, 0x22, 0x05, 0x7a, 0x93, 0x0c, 0xce, 0xdc, 0x98, 0xb8, 0xf1, 0x6b, 0x03, 0x20, 0xea, + 0xd7, 0xa1, 0x57, 0xe0, 0x4a, 0x75, 0x63, 0xbd, 0x66, 0x35, 0xb6, 0xee, 0x6c, 0x6d, 0x37, 0xac, + 0xed, 0xf5, 0xc6, 0xe6, 0xea, 0x4a, 0x7d, 0xad, 0xbe, 0x5a, 0xcb, 0x4d, 0x14, 0xb2, 0xfb, 0x0f, + 0x4b, 0x99, 0x6d, 0xca, 0x7a, 0xc4, 0x76, 0x5b, 0x2e, 0x71, 0xd0, 0x8b, 0x70, 0x69, 0x98, 0x5a, + 0x8c, 0x56, 0x6b, 0x39, 0xa3, 0x30, 0xb3, 0xff, 0xb0, 0x34, 0xa5, 0xea, 0x14, 0xe2, 0xa0, 0xeb, + 0xf0, 0xdc, 0x28, 0x5d, 0x7d, 0xfd, 0xf5, 0x5c, 0xa2, 0x30, 0xbb, 0xff, 0xb0, 0x34, 0x1d, 0x16, + 0x34, 0xa8, 0x0c, 0x28, 0x4e, 0xa9, 0xf1, 0x92, 0x05, 0xd8, 0x7f, 0x58, 0x4a, 0xab, 0xd8, 0x2a, + 0xa4, 0xde, 0xfd, 0xe5, 0xe2, 0xc4, 0x8d, 0x1f, 0x02, 0xd4, 0x69, 0xcb, 0xc7, 0xb6, 0xcc, 0x2a, + 0x05, 0xb8, 0x5c, 0x5f, 0x5f, 0x33, 0xef, 0xac, 0x6c, 0xd5, 0x37, 0xd6, 0x87, 0x8f, 0x7d, 0x68, + 0xad, 0xb6, 0xb1, 0x5d, 0x7d, 0x6b, 0xd5, 0x6a, 0xd4, 0x5f, 0x5f, 0xcf, 0x19, 0xe8, 0x0a, 0x5c, + 0x1c, 0x5a, 0xfb, 0xce, 0xfa, 0x56, 0xfd, 0xed, 0xd5, 0x5c, 0xa2, 0xba, 0xf6, 0xf1, 0x93, 0x45, + 0xe3, 0xf1, 0x93, 0x45, 0xe3, 0xaf, 0x4f, 0x16, 0x8d, 0xf7, 0x9e, 0x2e, 0x4e, 0x3c, 0x7e, 0xba, + 0x38, 0xf1, 0xa7, 0xa7, 0x8b, 0x13, 0xdf, 0x7b, 0xe5, 0x99, 0x51, 0x1b, 0x5d, 0x75, 0x32, 0x7e, + 0x9b, 0x69, 0xe9, 0x45, 0xdf, 0xf8, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa0, 0xbd, 0xdc, 0xf1, + 0x7b, 0x1a, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1403,706 +1517,714 @@ func (this *Pool) Description() (desc *github_com_cosmos_gogoproto_protoc_gen_go func StakingDescription() (desc *github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 11178 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x90, 0x1c, 0x47, - 0x76, 0x1f, 0x3e, 0x7d, 0x4c, 0x1f, 0xaf, 0xaf, 0x9a, 0x9c, 0x01, 0x30, 0x68, 0x90, 0x33, 0xc3, - 0xe2, 0x92, 0x00, 0x41, 0x72, 0x40, 0x82, 0x04, 0x48, 0x0e, 0x96, 0xcb, 0x7f, 0x77, 0x4f, 0x63, - 0xd0, 0xe0, 0x5c, 0xac, 0xee, 0x01, 0x0f, 0x1d, 0xa5, 0x9a, 0xea, 0x9c, 0x9e, 0x22, 0xba, 0xab, - 0x7a, 0xab, 0xaa, 0x81, 0x19, 0xc6, 0x3f, 0x1c, 0x2b, 0xad, 0x64, 0xaf, 0x60, 0x59, 0x5a, 0x1d, - 0x61, 0xad, 0xa4, 0x85, 0xcc, 0x95, 0x2c, 0xed, 0x4a, 0xbe, 0x74, 0xac, 0xb5, 0x92, 0x15, 0x92, - 0x25, 0x87, 0x0f, 0x49, 0x76, 0x38, 0xd6, 0xfa, 0x60, 0x2b, 0x1c, 0x61, 0x5a, 0xe2, 0x2a, 0xa4, - 0xf5, 0x6a, 0x65, 0x5d, 0x94, 0x6d, 0x79, 0xc3, 0x0a, 0x47, 0x5e, 0x75, 0xf4, 0x31, 0xdd, 0x03, - 0x91, 0xd4, 0xda, 0xf2, 0x17, 0xa0, 0x2b, 0xf3, 0xbd, 0x5f, 0x65, 0xbe, 0x7c, 0xf9, 0xf2, 0xbd, - 0x97, 0x59, 0x39, 0xf0, 0x5b, 0x65, 0x58, 0x6a, 0x59, 0x56, 0xab, 0x8d, 0x2f, 0x74, 0x6d, 0xcb, - 0xb5, 0x76, 0x7b, 0x7b, 0x17, 0x9a, 0xd8, 0xd1, 0x6d, 0xa3, 0xeb, 0x5a, 0xf6, 0x32, 0x2d, 0x43, - 0x05, 0x46, 0xb1, 0x2c, 0x28, 0xe4, 0x0d, 0x98, 0xb9, 0x6a, 0xb4, 0xf1, 0xaa, 0x47, 0x58, 0xc7, - 0x2e, 0x7a, 0x16, 0xe2, 0x7b, 0x46, 0x1b, 0xcf, 0x47, 0x96, 0x62, 0xe7, 0x32, 0x17, 0x3f, 0xb0, - 0xdc, 0xc7, 0xb4, 0x1c, 0xe6, 0xd8, 0x26, 0xc5, 0x0a, 0xe5, 0x90, 0xff, 0x3c, 0x0e, 0xb3, 0x43, - 0x6a, 0x11, 0x82, 0xb8, 0xa9, 0x75, 0x08, 0x62, 0xe4, 0x5c, 0x5a, 0xa1, 0xbf, 0xd1, 0x3c, 0x24, - 0xbb, 0x9a, 0x7e, 0x53, 0x6b, 0xe1, 0xf9, 0x28, 0x2d, 0x16, 0x8f, 0x68, 0x01, 0xa0, 0x89, 0xbb, - 0xd8, 0x6c, 0x62, 0x53, 0x3f, 0x9c, 0x8f, 0x2d, 0xc5, 0xce, 0xa5, 0x95, 0x40, 0x09, 0x7a, 0x14, - 0x66, 0xba, 0xbd, 0xdd, 0xb6, 0xa1, 0xab, 0x01, 0x32, 0x58, 0x8a, 0x9d, 0x9b, 0x56, 0x24, 0x56, - 0xb1, 0xea, 0x13, 0x9f, 0x85, 0xc2, 0x6d, 0xac, 0xdd, 0x0c, 0x92, 0x66, 0x28, 0x69, 0x9e, 0x14, - 0x07, 0x08, 0x2b, 0x90, 0xed, 0x60, 0xc7, 0xd1, 0x5a, 0x58, 0x75, 0x0f, 0xbb, 0x78, 0x3e, 0x4e, - 0x7b, 0xbf, 0x34, 0xd0, 0xfb, 0xfe, 0x9e, 0x67, 0x38, 0x57, 0xe3, 0xb0, 0x8b, 0x51, 0x09, 0xd2, - 0xd8, 0xec, 0x75, 0x18, 0xc2, 0xf4, 0x08, 0xf9, 0x55, 0xcd, 0x5e, 0xa7, 0x1f, 0x25, 0x45, 0xd8, - 0x38, 0x44, 0xd2, 0xc1, 0xf6, 0x2d, 0x43, 0xc7, 0xf3, 0x09, 0x0a, 0x70, 0x76, 0x00, 0xa0, 0xce, - 0xea, 0xfb, 0x31, 0x04, 0x1f, 0xaa, 0x40, 0x1a, 0x1f, 0xb8, 0xd8, 0x74, 0x0c, 0xcb, 0x9c, 0x4f, - 0x52, 0x90, 0x87, 0x86, 0x8c, 0x22, 0x6e, 0x37, 0xfb, 0x21, 0x7c, 0x3e, 0x74, 0x19, 0x92, 0x56, - 0xd7, 0x35, 0x2c, 0xd3, 0x99, 0x4f, 0x2d, 0x45, 0xce, 0x65, 0x2e, 0xde, 0x37, 0x54, 0x11, 0xb6, - 0x18, 0x8d, 0x22, 0x88, 0x51, 0x0d, 0x24, 0xc7, 0xea, 0xd9, 0x3a, 0x56, 0x75, 0xab, 0x89, 0x55, - 0xc3, 0xdc, 0xb3, 0xe6, 0xd3, 0x14, 0x60, 0x71, 0xb0, 0x23, 0x94, 0xb0, 0x62, 0x35, 0x71, 0xcd, - 0xdc, 0xb3, 0x94, 0xbc, 0x13, 0x7a, 0x46, 0x27, 0x21, 0xe1, 0x1c, 0x9a, 0xae, 0x76, 0x30, 0x9f, - 0xa5, 0x1a, 0xc2, 0x9f, 0x88, 0xea, 0xe0, 0xa6, 0x41, 0x5e, 0x37, 0x9f, 0x63, 0xaa, 0xc3, 0x1f, - 0xe5, 0x9f, 0x4b, 0x40, 0x61, 0x12, 0xe5, 0xbb, 0x02, 0xd3, 0x7b, 0xa4, 0xff, 0xf3, 0xd1, 0xe3, - 0x48, 0x87, 0xf1, 0x84, 0xc5, 0x9b, 0xb8, 0x47, 0xf1, 0x96, 0x20, 0x63, 0x62, 0xc7, 0xc5, 0x4d, - 0xa6, 0x2b, 0xb1, 0x09, 0xb5, 0x0d, 0x18, 0xd3, 0xa0, 0xb2, 0xc5, 0xef, 0x49, 0xd9, 0x5e, 0x81, - 0x82, 0xd7, 0x24, 0xd5, 0xd6, 0xcc, 0x96, 0xd0, 0xda, 0x0b, 0xe3, 0x5a, 0xb2, 0x5c, 0x15, 0x7c, - 0x0a, 0x61, 0x53, 0xf2, 0x38, 0xf4, 0x8c, 0x56, 0x01, 0x2c, 0x13, 0x5b, 0x7b, 0x6a, 0x13, 0xeb, - 0xed, 0xf9, 0xd4, 0x08, 0x29, 0x6d, 0x11, 0x92, 0x01, 0x29, 0x59, 0xac, 0x54, 0x6f, 0xa3, 0xe7, - 0x7c, 0x25, 0x4c, 0x8e, 0xd0, 0xa1, 0x0d, 0x36, 0xfd, 0x06, 0xf4, 0x70, 0x07, 0xf2, 0x36, 0x26, - 0x33, 0x02, 0x37, 0x79, 0xcf, 0xd2, 0xb4, 0x11, 0xcb, 0x63, 0x7b, 0xa6, 0x70, 0x36, 0xd6, 0xb1, - 0x9c, 0x1d, 0x7c, 0x44, 0x0f, 0x82, 0x57, 0xa0, 0x52, 0xb5, 0x02, 0x6a, 0x9f, 0xb2, 0xa2, 0x70, - 0x53, 0xeb, 0xe0, 0xe2, 0x1b, 0x90, 0x0f, 0x8b, 0x07, 0xcd, 0xc1, 0xb4, 0xe3, 0x6a, 0xb6, 0x4b, - 0xb5, 0x70, 0x5a, 0x61, 0x0f, 0x48, 0x82, 0x18, 0x36, 0x9b, 0xd4, 0xfe, 0x4d, 0x2b, 0xe4, 0x27, - 0xfa, 0xff, 0xfc, 0x0e, 0xc7, 0x68, 0x87, 0x1f, 0x1e, 0x1c, 0xd1, 0x10, 0x72, 0x7f, 0xbf, 0x8b, - 0xcf, 0x40, 0x2e, 0xd4, 0x81, 0x49, 0x5f, 0x2d, 0xff, 0xff, 0x70, 0x62, 0x28, 0x34, 0x7a, 0x05, - 0xe6, 0x7a, 0xa6, 0x61, 0xba, 0xd8, 0xee, 0xda, 0x98, 0x68, 0x2c, 0x7b, 0xd5, 0xfc, 0xef, 0x26, - 0x47, 0xe8, 0xdc, 0x4e, 0x90, 0x9a, 0xa1, 0x28, 0xb3, 0xbd, 0xc1, 0xc2, 0xf3, 0xe9, 0xd4, 0x17, - 0x93, 0xd2, 0x47, 0x3e, 0xf2, 0x91, 0x8f, 0x44, 0xe5, 0x5f, 0x4e, 0xc0, 0xdc, 0xb0, 0x39, 0x33, - 0x74, 0xfa, 0x9e, 0x84, 0x84, 0xd9, 0xeb, 0xec, 0x62, 0x9b, 0x0a, 0x69, 0x5a, 0xe1, 0x4f, 0xa8, - 0x04, 0xd3, 0x6d, 0x6d, 0x17, 0xb7, 0xe7, 0xe3, 0x4b, 0x91, 0x73, 0xf9, 0x8b, 0x8f, 0x4e, 0x34, - 0x2b, 0x97, 0xd7, 0x09, 0x8b, 0xc2, 0x38, 0xd1, 0x87, 0x20, 0xce, 0x8d, 0x37, 0x41, 0x38, 0x3f, - 0x19, 0x02, 0x99, 0x4b, 0x0a, 0xe5, 0x43, 0x67, 0x20, 0x4d, 0xfe, 0x67, 0xba, 0x91, 0xa0, 0x6d, - 0x4e, 0x91, 0x02, 0xa2, 0x17, 0xa8, 0x08, 0x29, 0x3a, 0x4d, 0x9a, 0x58, 0x2c, 0x7a, 0xde, 0x33, - 0x51, 0xac, 0x26, 0xde, 0xd3, 0x7a, 0x6d, 0x57, 0xbd, 0xa5, 0xb5, 0x7b, 0x98, 0x2a, 0x7c, 0x5a, - 0xc9, 0xf2, 0xc2, 0x1b, 0xa4, 0x0c, 0x2d, 0x42, 0x86, 0xcd, 0x2a, 0xc3, 0x6c, 0xe2, 0x03, 0x6a, - 0x57, 0xa7, 0x15, 0x36, 0xd1, 0x6a, 0xa4, 0x84, 0xbc, 0xfe, 0x75, 0xc7, 0x32, 0x85, 0x6a, 0xd2, - 0x57, 0x90, 0x02, 0xfa, 0xfa, 0x67, 0xfa, 0x4d, 0xfa, 0xfd, 0xc3, 0xbb, 0x37, 0x30, 0x97, 0xce, - 0x42, 0x81, 0x52, 0x3c, 0xc5, 0x87, 0x5e, 0x6b, 0xcf, 0xcf, 0x2c, 0x45, 0xce, 0xa5, 0x94, 0x3c, - 0x2b, 0xde, 0xe2, 0xa5, 0xf2, 0xcf, 0x44, 0x21, 0x4e, 0x0d, 0x4b, 0x01, 0x32, 0x8d, 0x57, 0xb7, - 0xab, 0xea, 0xea, 0xd6, 0x4e, 0x79, 0xbd, 0x2a, 0x45, 0x50, 0x1e, 0x80, 0x16, 0x5c, 0x5d, 0xdf, - 0x2a, 0x35, 0xa4, 0xa8, 0xf7, 0x5c, 0xdb, 0x6c, 0x5c, 0x7e, 0x5a, 0x8a, 0x79, 0x0c, 0x3b, 0xac, - 0x20, 0x1e, 0x24, 0x78, 0xea, 0xa2, 0x34, 0x8d, 0x24, 0xc8, 0x32, 0x80, 0xda, 0x2b, 0xd5, 0xd5, - 0xcb, 0x4f, 0x4b, 0x89, 0x70, 0xc9, 0x53, 0x17, 0xa5, 0x24, 0xca, 0x41, 0x9a, 0x96, 0x94, 0xb7, - 0xb6, 0xd6, 0xa5, 0x94, 0x87, 0x59, 0x6f, 0x28, 0xb5, 0xcd, 0x35, 0x29, 0xed, 0x61, 0xae, 0x29, - 0x5b, 0x3b, 0xdb, 0x12, 0x78, 0x08, 0x1b, 0xd5, 0x7a, 0xbd, 0xb4, 0x56, 0x95, 0x32, 0x1e, 0x45, - 0xf9, 0xd5, 0x46, 0xb5, 0x2e, 0x65, 0x43, 0xcd, 0x7a, 0xea, 0xa2, 0x94, 0xf3, 0x5e, 0x51, 0xdd, - 0xdc, 0xd9, 0x90, 0xf2, 0x68, 0x06, 0x72, 0xec, 0x15, 0xa2, 0x11, 0x85, 0xbe, 0xa2, 0xcb, 0x4f, - 0x4b, 0x92, 0xdf, 0x10, 0x86, 0x32, 0x13, 0x2a, 0xb8, 0xfc, 0xb4, 0x84, 0xe4, 0x0a, 0x4c, 0x53, - 0x35, 0x44, 0x08, 0xf2, 0xeb, 0xa5, 0x72, 0x75, 0x5d, 0xdd, 0xda, 0x6e, 0xd4, 0xb6, 0x36, 0x4b, - 0xeb, 0x52, 0xc4, 0x2f, 0x53, 0xaa, 0x2f, 0xed, 0xd4, 0x94, 0xea, 0xaa, 0x14, 0x0d, 0x96, 0x6d, - 0x57, 0x4b, 0x8d, 0xea, 0xaa, 0x14, 0x93, 0x75, 0x98, 0x1b, 0x66, 0x50, 0x87, 0x4e, 0xa1, 0x80, - 0x2e, 0x44, 0x47, 0xe8, 0x02, 0xc5, 0xea, 0xd7, 0x05, 0xf9, 0x0b, 0x51, 0x98, 0x1d, 0xb2, 0xa8, - 0x0c, 0x7d, 0xc9, 0x0b, 0x30, 0xcd, 0x74, 0x99, 0x2d, 0xb3, 0x8f, 0x0c, 0x5d, 0x9d, 0xa8, 0x66, - 0x0f, 0x2c, 0xb5, 0x94, 0x2f, 0xe8, 0x84, 0xc4, 0x46, 0x38, 0x21, 0x04, 0x62, 0x40, 0x61, 0xbf, - 0x6e, 0xc0, 0xf8, 0xb3, 0xf5, 0xf1, 0xf2, 0x24, 0xeb, 0x23, 0x2d, 0x3b, 0xde, 0x22, 0x30, 0x3d, - 0x64, 0x11, 0xb8, 0x02, 0x33, 0x03, 0x40, 0x13, 0x1b, 0xe3, 0x8f, 0x46, 0x60, 0x7e, 0x94, 0x70, - 0xc6, 0x98, 0xc4, 0x68, 0xc8, 0x24, 0x5e, 0xe9, 0x97, 0xe0, 0x03, 0xa3, 0x07, 0x61, 0x60, 0xac, - 0x3f, 0x1d, 0x81, 0x93, 0xc3, 0x9d, 0xcd, 0xa1, 0x6d, 0xf8, 0x10, 0x24, 0x3a, 0xd8, 0xdd, 0xb7, - 0x84, 0x5b, 0xf5, 0xf0, 0x90, 0xc5, 0x9a, 0x54, 0xf7, 0x0f, 0x36, 0xe7, 0x0a, 0xae, 0xf6, 0xb1, - 0x51, 0x1e, 0x23, 0x6b, 0xcd, 0x40, 0x4b, 0xbf, 0x35, 0x0a, 0x27, 0x86, 0x82, 0x0f, 0x6d, 0xe8, - 0xfd, 0x00, 0x86, 0xd9, 0xed, 0xb9, 0xcc, 0x75, 0x62, 0x96, 0x38, 0x4d, 0x4b, 0xa8, 0xf1, 0x22, - 0x56, 0xb6, 0xe7, 0x7a, 0xf5, 0x31, 0x5a, 0x0f, 0xac, 0x88, 0x12, 0x3c, 0xeb, 0x37, 0x34, 0x4e, - 0x1b, 0xba, 0x30, 0xa2, 0xa7, 0x03, 0x8a, 0xf9, 0x04, 0x48, 0x7a, 0xdb, 0xc0, 0xa6, 0xab, 0x3a, - 0xae, 0x8d, 0xb5, 0x8e, 0x61, 0xb6, 0xe8, 0x52, 0x93, 0x5a, 0x99, 0xde, 0xd3, 0xda, 0x0e, 0x56, - 0x0a, 0xac, 0xba, 0x2e, 0x6a, 0x09, 0x07, 0x55, 0x20, 0x3b, 0xc0, 0x91, 0x08, 0x71, 0xb0, 0x6a, - 0x8f, 0x43, 0xfe, 0xce, 0x34, 0x64, 0x02, 0xae, 0x39, 0x7a, 0x00, 0xb2, 0xaf, 0x6b, 0xb7, 0x34, - 0x55, 0x84, 0x5b, 0x4c, 0x12, 0x19, 0x52, 0xb6, 0xcd, 0x43, 0xae, 0x27, 0x60, 0x8e, 0x92, 0x58, - 0x3d, 0x17, 0xdb, 0xaa, 0xde, 0xd6, 0x1c, 0x87, 0x0a, 0x2d, 0x45, 0x49, 0x11, 0xa9, 0xdb, 0x22, - 0x55, 0x15, 0x51, 0x83, 0x2e, 0xc1, 0x2c, 0xe5, 0xe8, 0xf4, 0xda, 0xae, 0xd1, 0x6d, 0x63, 0x95, - 0x04, 0x80, 0x0e, 0x5d, 0x72, 0xbc, 0x96, 0xcd, 0x10, 0x8a, 0x0d, 0x4e, 0x40, 0x5a, 0xe4, 0xa0, - 0x55, 0xb8, 0x9f, 0xb2, 0xb5, 0xb0, 0x89, 0x6d, 0xcd, 0xc5, 0x2a, 0xfe, 0x70, 0x4f, 0x6b, 0x3b, - 0xaa, 0x66, 0x36, 0xd5, 0x7d, 0xcd, 0xd9, 0x9f, 0x9f, 0x23, 0x00, 0xe5, 0xe8, 0x7c, 0x44, 0x39, - 0x4d, 0x08, 0xd7, 0x38, 0x5d, 0x95, 0x92, 0x95, 0xcc, 0xe6, 0x35, 0xcd, 0xd9, 0x47, 0x2b, 0x70, - 0x92, 0xa2, 0x38, 0xae, 0x6d, 0x98, 0x2d, 0x55, 0xdf, 0xc7, 0xfa, 0x4d, 0xb5, 0xe7, 0xee, 0x3d, - 0x3b, 0x7f, 0x26, 0xf8, 0x7e, 0xda, 0xc2, 0x3a, 0xa5, 0xa9, 0x10, 0x92, 0x1d, 0x77, 0xef, 0x59, - 0x54, 0x87, 0x2c, 0x19, 0x8c, 0x8e, 0xf1, 0x06, 0x56, 0xf7, 0x2c, 0x9b, 0xae, 0xa1, 0xf9, 0x21, - 0xa6, 0x29, 0x20, 0xc1, 0xe5, 0x2d, 0xce, 0xb0, 0x61, 0x35, 0xf1, 0xca, 0x74, 0x7d, 0xbb, 0x5a, - 0x5d, 0x55, 0x32, 0x02, 0xe5, 0xaa, 0x65, 0x13, 0x85, 0x6a, 0x59, 0x9e, 0x80, 0x33, 0x4c, 0xa1, - 0x5a, 0x96, 0x10, 0xef, 0x25, 0x98, 0xd5, 0x75, 0xd6, 0x67, 0x43, 0x57, 0x79, 0x98, 0xe6, 0xcc, - 0x4b, 0x21, 0x61, 0xe9, 0xfa, 0x1a, 0x23, 0xe0, 0x3a, 0xee, 0xa0, 0xe7, 0xe0, 0x84, 0x2f, 0xac, - 0x20, 0xe3, 0xcc, 0x40, 0x2f, 0xfb, 0x59, 0x2f, 0xc1, 0x6c, 0xf7, 0x70, 0x90, 0x11, 0x85, 0xde, - 0xd8, 0x3d, 0xec, 0x67, 0x7b, 0x06, 0xe6, 0xba, 0xfb, 0xdd, 0x41, 0xbe, 0xf3, 0x41, 0x3e, 0xd4, - 0xdd, 0xef, 0xf6, 0x33, 0x3e, 0x44, 0x63, 0x76, 0x1b, 0xeb, 0x9a, 0x8b, 0x9b, 0xf3, 0xa7, 0x82, - 0xe4, 0x81, 0x0a, 0xb4, 0x0c, 0x92, 0xae, 0xab, 0xd8, 0xd4, 0x76, 0xdb, 0x58, 0xd5, 0x6c, 0x6c, - 0x6a, 0xce, 0xfc, 0x22, 0x25, 0x8e, 0xbb, 0x76, 0x0f, 0x2b, 0x79, 0x5d, 0xaf, 0xd2, 0xca, 0x12, - 0xad, 0x43, 0xe7, 0x61, 0xc6, 0xda, 0x7d, 0x5d, 0x67, 0x1a, 0xa9, 0x76, 0x6d, 0xbc, 0x67, 0x1c, - 0xcc, 0x7f, 0x80, 0x8a, 0xb7, 0x40, 0x2a, 0xa8, 0x3e, 0x6e, 0xd3, 0x62, 0xf4, 0x08, 0x48, 0xba, - 0xb3, 0xaf, 0xd9, 0x5d, 0x6a, 0x92, 0x9d, 0xae, 0xa6, 0xe3, 0xf9, 0x87, 0x18, 0x29, 0x2b, 0xdf, - 0x14, 0xc5, 0x64, 0x46, 0x38, 0xb7, 0x8d, 0x3d, 0x57, 0x20, 0x9e, 0x65, 0x33, 0x82, 0x96, 0x71, - 0xb4, 0x73, 0x20, 0x11, 0x49, 0x84, 0x5e, 0x7c, 0x8e, 0x92, 0xe5, 0xbb, 0xfb, 0xdd, 0xe0, 0x7b, - 0x1f, 0x84, 0x1c, 0xa1, 0xf4, 0x5f, 0xfa, 0x08, 0x73, 0xdc, 0xba, 0xfb, 0x81, 0x37, 0x3e, 0x0d, - 0x27, 0x09, 0x51, 0x07, 0xbb, 0x5a, 0x53, 0x73, 0xb5, 0x00, 0xf5, 0x63, 0x94, 0x9a, 0x88, 0x7d, - 0x83, 0x57, 0x86, 0xda, 0x69, 0xf7, 0x76, 0x0f, 0x3d, 0xc5, 0x7a, 0x9c, 0xb5, 0x93, 0x94, 0x09, - 0xd5, 0x7a, 0xcf, 0x9c, 0x73, 0x79, 0x05, 0xb2, 0x41, 0xbd, 0x47, 0x69, 0x60, 0x9a, 0x2f, 0x45, - 0x88, 0x13, 0x54, 0xd9, 0x5a, 0x25, 0xee, 0xcb, 0x6b, 0x55, 0x29, 0x4a, 0xdc, 0xa8, 0xf5, 0x5a, - 0xa3, 0xaa, 0x2a, 0x3b, 0x9b, 0x8d, 0xda, 0x46, 0x55, 0x8a, 0x05, 0x1c, 0xfb, 0xeb, 0xf1, 0xd4, - 0xc3, 0xd2, 0x59, 0xf9, 0xe7, 0x63, 0x90, 0x0f, 0x47, 0x6a, 0xe8, 0x83, 0x70, 0x4a, 0x24, 0x5c, - 0x1c, 0xec, 0xaa, 0xb7, 0x0d, 0x9b, 0x4e, 0xc8, 0x8e, 0xc6, 0x16, 0x47, 0x4f, 0x7f, 0xe6, 0x38, - 0x55, 0x1d, 0xbb, 0x2f, 0x1b, 0x36, 0x99, 0x6e, 0x1d, 0xcd, 0x45, 0xeb, 0xb0, 0x68, 0x5a, 0xaa, - 0xe3, 0x6a, 0x66, 0x53, 0xb3, 0x9b, 0xaa, 0x9f, 0xea, 0x52, 0x35, 0x5d, 0xc7, 0x8e, 0x63, 0xb1, - 0x85, 0xd0, 0x43, 0xb9, 0xcf, 0xb4, 0xea, 0x9c, 0xd8, 0x5f, 0x21, 0x4a, 0x9c, 0xb4, 0x4f, 0x7d, - 0x63, 0xa3, 0xd4, 0xf7, 0x0c, 0xa4, 0x3b, 0x5a, 0x57, 0xc5, 0xa6, 0x6b, 0x1f, 0x52, 0xff, 0x3c, - 0xa5, 0xa4, 0x3a, 0x5a, 0xb7, 0x4a, 0x9e, 0xd1, 0x0d, 0x78, 0xd8, 0x27, 0x55, 0xdb, 0xb8, 0xa5, - 0xe9, 0x87, 0x2a, 0x75, 0xc6, 0x69, 0xda, 0x40, 0xd5, 0x2d, 0x73, 0xaf, 0x6d, 0xe8, 0xae, 0x43, - 0xed, 0x03, 0xb3, 0x71, 0xb2, 0xcf, 0xb1, 0x4e, 0x19, 0xae, 0x3b, 0x96, 0x49, 0x7d, 0xf0, 0x8a, - 0xa0, 0x7e, 0x5f, 0xc2, 0xaf, 0xeb, 0xf1, 0x54, 0x5c, 0x9a, 0xbe, 0x1e, 0x4f, 0x4d, 0x4b, 0x89, - 0xeb, 0xf1, 0x54, 0x42, 0x4a, 0x5e, 0x8f, 0xa7, 0x52, 0x52, 0xfa, 0x7a, 0x3c, 0x95, 0x96, 0x40, - 0xfe, 0x5c, 0x0a, 0xb2, 0xc1, 0xc8, 0x80, 0x04, 0x5a, 0x3a, 0x5d, 0x1b, 0x23, 0xd4, 0x7a, 0x3e, - 0x78, 0x64, 0x1c, 0xb1, 0x5c, 0x21, 0x8b, 0xe6, 0x4a, 0x82, 0xb9, 0xe1, 0x0a, 0xe3, 0x24, 0x0e, - 0x0b, 0x51, 0x6b, 0xcc, 0xdc, 0x9e, 0x94, 0xc2, 0x9f, 0xd0, 0x1a, 0x24, 0x5e, 0x77, 0x28, 0x76, - 0x82, 0x62, 0x7f, 0xe0, 0x68, 0xec, 0xeb, 0x75, 0x0a, 0x9e, 0xbe, 0x5e, 0x57, 0x37, 0xb7, 0x94, - 0x8d, 0xd2, 0xba, 0xc2, 0xd9, 0xd1, 0x69, 0x88, 0xb7, 0xb5, 0x37, 0x0e, 0xc3, 0xcb, 0x2b, 0x2d, - 0x42, 0xcb, 0x50, 0xe8, 0x99, 0xb7, 0xb0, 0x6d, 0xec, 0x19, 0x64, 0xa8, 0x08, 0x55, 0x21, 0x48, - 0x95, 0xf7, 0x6b, 0xd7, 0x09, 0xfd, 0x84, 0xea, 0x71, 0x1a, 0xe2, 0xb7, 0xb1, 0x76, 0x33, 0xbc, - 0x08, 0xd2, 0x22, 0x74, 0x0e, 0xb2, 0x4d, 0xbc, 0xdb, 0x6b, 0xa9, 0x36, 0x6e, 0x6a, 0xba, 0x1b, - 0x36, 0xfd, 0x19, 0x5a, 0xa5, 0xd0, 0x1a, 0xf4, 0x22, 0xa4, 0xc9, 0x18, 0x99, 0x74, 0x8c, 0x67, - 0xa8, 0x08, 0x1e, 0x3f, 0x5a, 0x04, 0x7c, 0x88, 0x05, 0x93, 0xe2, 0xf3, 0xa3, 0xab, 0x90, 0x70, - 0x35, 0xbb, 0x85, 0x5d, 0x6a, 0xf9, 0xf3, 0x43, 0x92, 0x1f, 0x43, 0x90, 0x1a, 0x94, 0x83, 0xc6, - 0xb4, 0x9c, 0xfb, 0x3d, 0xb4, 0x32, 0x17, 0x60, 0x9a, 0xaa, 0x07, 0x02, 0xe0, 0x0a, 0x22, 0x4d, - 0xa1, 0x14, 0xc4, 0x2b, 0x5b, 0x0a, 0xb1, 0x34, 0x12, 0x64, 0x59, 0xa9, 0xba, 0x5d, 0xab, 0x56, - 0xaa, 0x52, 0x54, 0xbe, 0x04, 0x09, 0x36, 0xe6, 0xc4, 0x0a, 0x79, 0xa3, 0x2e, 0x4d, 0xf1, 0x47, - 0x8e, 0x11, 0x11, 0xb5, 0x3b, 0x1b, 0xe5, 0xaa, 0x22, 0x45, 0xe5, 0x1d, 0x28, 0xf4, 0xc9, 0x09, - 0x9d, 0x80, 0x19, 0xa5, 0xda, 0xa8, 0x6e, 0x92, 0x38, 0x4b, 0xdd, 0xd9, 0x7c, 0x71, 0x73, 0xeb, - 0xe5, 0x4d, 0x69, 0x2a, 0x5c, 0x2c, 0x4c, 0x5a, 0x04, 0xcd, 0x81, 0xe4, 0x17, 0xd7, 0xb7, 0x76, - 0x14, 0xda, 0x9a, 0x6f, 0x8b, 0x82, 0xd4, 0x2f, 0x35, 0x74, 0x0a, 0x66, 0x1b, 0x25, 0x65, 0xad, - 0xda, 0x50, 0x59, 0xec, 0xe8, 0x41, 0xcf, 0x81, 0x14, 0xac, 0xb8, 0x5a, 0xa3, 0xa1, 0xf1, 0x22, - 0x9c, 0x09, 0x96, 0x56, 0x5f, 0x69, 0x54, 0x37, 0xeb, 0xf4, 0xe5, 0xa5, 0xcd, 0x35, 0x62, 0x5f, - 0xfb, 0xf0, 0x44, 0xb4, 0x1a, 0x23, 0x4d, 0x0d, 0xe3, 0x55, 0xd7, 0x57, 0xa5, 0x78, 0x7f, 0xf1, - 0xd6, 0x66, 0x75, 0xeb, 0xaa, 0x34, 0xdd, 0xff, 0x76, 0x1a, 0xc1, 0x26, 0x50, 0x11, 0x4e, 0xf6, - 0x97, 0xaa, 0xd5, 0xcd, 0x86, 0xf2, 0xaa, 0x94, 0xec, 0x7f, 0x71, 0xbd, 0xaa, 0xdc, 0xa8, 0x55, - 0xaa, 0x52, 0x0a, 0x9d, 0x04, 0x14, 0x6e, 0x51, 0xe3, 0xda, 0xd6, 0xaa, 0x94, 0x1e, 0xb0, 0x28, - 0xb2, 0x03, 0xd9, 0x60, 0x18, 0xf9, 0xfe, 0xe4, 0x92, 0x3e, 0x11, 0x85, 0x4c, 0x20, 0x2c, 0x24, - 0xfe, 0xbc, 0xd6, 0x6e, 0x5b, 0xb7, 0x55, 0xad, 0x6d, 0x68, 0x0e, 0xb7, 0x37, 0x40, 0x8b, 0x4a, - 0xa4, 0x64, 0xd2, 0xf9, 0x3d, 0xb9, 0x85, 0x4f, 0x7c, 0x35, 0x5a, 0xf8, 0x69, 0x29, 0x21, 0xff, - 0x60, 0x04, 0xa4, 0xfe, 0x78, 0xaf, 0xaf, 0xfb, 0x91, 0x51, 0xdd, 0x7f, 0x5f, 0xc6, 0xee, 0x93, - 0x11, 0xc8, 0x87, 0x83, 0xbc, 0xbe, 0xe6, 0x3d, 0xf0, 0x97, 0xda, 0xbc, 0xdf, 0x8c, 0x42, 0x2e, - 0x14, 0xda, 0x4d, 0xda, 0xba, 0x0f, 0xc3, 0x8c, 0xd1, 0xc4, 0x9d, 0xae, 0xe5, 0x62, 0x53, 0x3f, - 0x54, 0xdb, 0xf8, 0x16, 0x6e, 0xcf, 0xcb, 0xd4, 0x28, 0x5f, 0x38, 0x3a, 0x78, 0x5c, 0xae, 0xf9, - 0x7c, 0xeb, 0x84, 0x6d, 0x65, 0xb6, 0xb6, 0x5a, 0xdd, 0xd8, 0xde, 0x6a, 0x54, 0x37, 0x2b, 0xaf, - 0x0a, 0xeb, 0xa2, 0x48, 0x46, 0x1f, 0xd9, 0x7b, 0x68, 0xb4, 0xb7, 0x41, 0xea, 0x6f, 0x14, 0xb1, - 0x15, 0x43, 0x9a, 0x25, 0x4d, 0xa1, 0x59, 0x28, 0x6c, 0x6e, 0xa9, 0xf5, 0xda, 0x6a, 0x55, 0xad, - 0x5e, 0xbd, 0x5a, 0xad, 0x34, 0xea, 0x2c, 0x1d, 0xe8, 0x51, 0x37, 0xa4, 0x68, 0x50, 0xc4, 0xdf, - 0x1f, 0x83, 0xd9, 0x21, 0x2d, 0x41, 0x25, 0x1e, 0xc8, 0xb3, 0xdc, 0xc2, 0xe3, 0x93, 0xb4, 0x7e, - 0x99, 0xb8, 0xd2, 0xdb, 0x9a, 0xed, 0xf2, 0xb8, 0xff, 0x11, 0x20, 0x52, 0x32, 0x5d, 0xb2, 0xb2, - 0xdb, 0x3c, 0xcd, 0xca, 0xa2, 0xfb, 0x82, 0x5f, 0xce, 0x32, 0xad, 0x8f, 0x01, 0xea, 0x5a, 0x8e, - 0xe1, 0x1a, 0xb7, 0xb0, 0x6a, 0x98, 0x22, 0x27, 0x4b, 0xa2, 0xfd, 0xb8, 0x22, 0x89, 0x9a, 0x9a, - 0xe9, 0x7a, 0xd4, 0x26, 0x6e, 0x69, 0x7d, 0xd4, 0xc4, 0xf3, 0x88, 0x29, 0x92, 0xa8, 0xf1, 0xa8, - 0x1f, 0x80, 0x6c, 0xd3, 0xea, 0x91, 0x10, 0x88, 0xd1, 0x11, 0x6b, 0x11, 0x51, 0x32, 0xac, 0xcc, - 0x23, 0xe1, 0xc1, 0xad, 0x9f, 0x0c, 0xce, 0x2a, 0x19, 0x56, 0xc6, 0x48, 0xce, 0x42, 0x41, 0x6b, - 0xb5, 0x6c, 0x02, 0x2e, 0x80, 0x58, 0xb8, 0x9e, 0xf7, 0x8a, 0x29, 0x61, 0xf1, 0x3a, 0xa4, 0x84, - 0x1c, 0x88, 0x07, 0x4b, 0x24, 0xa1, 0x76, 0x59, 0x0e, 0x2a, 0x7a, 0x2e, 0xad, 0xa4, 0x4c, 0x51, - 0xf9, 0x00, 0x64, 0x0d, 0x47, 0xf5, 0xf7, 0xb6, 0xa2, 0x4b, 0xd1, 0x73, 0x29, 0x25, 0x63, 0x38, - 0xde, 0xbe, 0x80, 0xfc, 0xe9, 0x28, 0xe4, 0xc3, 0xbb, 0x76, 0x68, 0x15, 0x52, 0x6d, 0x4b, 0xd7, - 0xa8, 0x6a, 0xb1, 0x2d, 0xe3, 0x73, 0x63, 0x36, 0xfa, 0x96, 0xd7, 0x39, 0xbd, 0xe2, 0x71, 0x16, - 0xff, 0x6d, 0x04, 0x52, 0xa2, 0x18, 0x9d, 0x84, 0x78, 0x57, 0x73, 0xf7, 0x29, 0xdc, 0x74, 0x39, - 0x2a, 0x45, 0x14, 0xfa, 0x4c, 0xca, 0x9d, 0xae, 0x66, 0x52, 0x15, 0xe0, 0xe5, 0xe4, 0x99, 0x8c, - 0x6b, 0x1b, 0x6b, 0x4d, 0x9a, 0x0b, 0xb0, 0x3a, 0x1d, 0x6c, 0xba, 0x8e, 0x18, 0x57, 0x5e, 0x5e, - 0xe1, 0xc5, 0xe8, 0x51, 0x98, 0x71, 0x6d, 0xcd, 0x68, 0x87, 0x68, 0xe3, 0x94, 0x56, 0x12, 0x15, - 0x1e, 0xf1, 0x0a, 0x9c, 0x16, 0xb8, 0x4d, 0xec, 0x6a, 0xfa, 0x3e, 0x6e, 0xfa, 0x4c, 0x09, 0x9a, - 0xf3, 0x3b, 0xc5, 0x09, 0x56, 0x79, 0xbd, 0xe0, 0x95, 0x3f, 0x1f, 0x85, 0x19, 0x91, 0xbd, 0x68, - 0x7a, 0xc2, 0xda, 0x00, 0xd0, 0x4c, 0xd3, 0x72, 0x83, 0xe2, 0x1a, 0x54, 0xe5, 0x01, 0xbe, 0xe5, - 0x92, 0xc7, 0xa4, 0x04, 0x00, 0x8a, 0xbf, 0x17, 0x01, 0xf0, 0xab, 0x46, 0xca, 0x6d, 0x11, 0x32, - 0x7c, 0x4f, 0x96, 0x6e, 0xec, 0xb3, 0x84, 0x17, 0xb0, 0xa2, 0xab, 0x46, 0x9b, 0xa6, 0x25, 0x77, - 0x71, 0xcb, 0x30, 0xf9, 0x7e, 0x0a, 0x7b, 0x10, 0x69, 0xc9, 0xb8, 0xbf, 0x3d, 0xa5, 0x40, 0xca, - 0xc1, 0x1d, 0xcd, 0x74, 0x0d, 0x9d, 0xef, 0x90, 0x5c, 0x3e, 0x56, 0xe3, 0x97, 0xeb, 0x9c, 0x5b, - 0xf1, 0x70, 0xe4, 0x73, 0x90, 0x12, 0xa5, 0xc4, 0xf1, 0xdb, 0xdc, 0xda, 0xac, 0x4a, 0x53, 0x28, - 0x09, 0xb1, 0x7a, 0xb5, 0x21, 0x45, 0x48, 0xd8, 0x59, 0x5a, 0xaf, 0x95, 0xea, 0x52, 0xb4, 0xfc, - 0xd7, 0x60, 0x56, 0xb7, 0x3a, 0xfd, 0x2f, 0x2c, 0x4b, 0x7d, 0x29, 0x3f, 0xe7, 0x5a, 0xe4, 0xb5, - 0xc7, 0x39, 0x51, 0xcb, 0x6a, 0x6b, 0x66, 0x6b, 0xd9, 0xb2, 0x5b, 0xfe, 0xb1, 0x08, 0x12, 0x1d, - 0x38, 0x81, 0xc3, 0x11, 0xdd, 0xdd, 0xff, 0x11, 0x89, 0xfc, 0x50, 0x34, 0xb6, 0xb6, 0x5d, 0xfe, - 0xf1, 0x68, 0x71, 0x8d, 0x31, 0x6e, 0x8b, 0xee, 0x28, 0x78, 0xaf, 0x8d, 0x75, 0xd2, 0x78, 0xf8, - 0xfd, 0x47, 0x61, 0xae, 0x65, 0xb5, 0x2c, 0x8a, 0x74, 0x81, 0xfc, 0xe2, 0xe7, 0x2a, 0xd2, 0x5e, - 0x69, 0x71, 0xec, 0x21, 0x8c, 0x95, 0x4d, 0x98, 0xe5, 0xc4, 0x2a, 0xdd, 0xbe, 0x65, 0xc9, 0x05, - 0x74, 0x64, 0x66, 0x7b, 0xfe, 0x27, 0x7f, 0x9b, 0x7a, 0x25, 0xca, 0x0c, 0x67, 0x25, 0x75, 0x2c, - 0xff, 0xb0, 0xa2, 0xc0, 0x89, 0x10, 0x1e, 0xb3, 0x11, 0xd8, 0x1e, 0x83, 0xf8, 0x2f, 0x38, 0xe2, - 0x6c, 0x00, 0xb1, 0xce, 0x59, 0x57, 0x2a, 0x90, 0x3b, 0x0e, 0xd6, 0xbf, 0xe4, 0x58, 0x59, 0x1c, - 0x04, 0x59, 0x83, 0x02, 0x05, 0xd1, 0x7b, 0x8e, 0x6b, 0x75, 0xa8, 0x01, 0x3e, 0x1a, 0xe6, 0x5f, - 0xfd, 0x36, 0x9b, 0xb4, 0x79, 0xc2, 0x56, 0xf1, 0xb8, 0x56, 0x56, 0x80, 0xee, 0x58, 0x37, 0xb1, - 0xde, 0x1e, 0x83, 0xf0, 0x2b, 0xbc, 0x21, 0x1e, 0xfd, 0xca, 0x0d, 0x98, 0x23, 0xbf, 0xa9, 0x7d, - 0x0c, 0xb6, 0x64, 0x7c, 0x1a, 0x7c, 0xfe, 0xdf, 0x7d, 0x94, 0xd9, 0x85, 0x59, 0x0f, 0x20, 0xd0, - 0xa6, 0xc0, 0x28, 0xb6, 0xb0, 0xeb, 0x62, 0xdb, 0x51, 0xb5, 0xf6, 0xb0, 0xe6, 0x05, 0xf2, 0x88, - 0xf3, 0xdf, 0xf7, 0xe5, 0xf0, 0x28, 0xae, 0x31, 0xce, 0x52, 0xbb, 0xbd, 0xb2, 0x03, 0xa7, 0x86, - 0x68, 0xc5, 0x04, 0x98, 0xdf, 0xcf, 0x31, 0xe7, 0x06, 0x34, 0x83, 0xc0, 0x6e, 0x83, 0x28, 0xf7, - 0xc6, 0x72, 0x02, 0xcc, 0x1f, 0xe0, 0x98, 0x88, 0xf3, 0x8a, 0x21, 0x25, 0x88, 0xd7, 0x61, 0xe6, - 0x16, 0xb6, 0x77, 0x2d, 0x87, 0xe7, 0x6e, 0x27, 0x80, 0xfb, 0x24, 0x87, 0x2b, 0x70, 0x46, 0x9a, - 0xcc, 0x25, 0x58, 0xcf, 0x41, 0x6a, 0x4f, 0xd3, 0xf1, 0x04, 0x10, 0x77, 0x39, 0x44, 0x92, 0xd0, - 0x13, 0xd6, 0x12, 0x64, 0x5b, 0x16, 0x5f, 0x22, 0xc7, 0xb3, 0xff, 0x20, 0x67, 0xcf, 0x08, 0x1e, - 0x0e, 0xd1, 0xb5, 0xba, 0xbd, 0x36, 0x59, 0x3f, 0xc7, 0x43, 0xfc, 0x1d, 0x01, 0x21, 0x78, 0x38, - 0xc4, 0x31, 0xc4, 0xfa, 0xa6, 0x80, 0x70, 0x02, 0xf2, 0x7c, 0x01, 0x32, 0x96, 0xd9, 0x3e, 0xb4, - 0xcc, 0x49, 0x1a, 0xf1, 0x29, 0x8e, 0x00, 0x9c, 0x85, 0x00, 0x5c, 0x81, 0xf4, 0xa4, 0x03, 0xf1, - 0x23, 0x5f, 0x16, 0xd3, 0x43, 0x8c, 0xc0, 0x1a, 0x14, 0x84, 0x81, 0x32, 0x2c, 0x73, 0x02, 0x88, - 0x1f, 0xe5, 0x10, 0xf9, 0x00, 0x1b, 0xef, 0x86, 0x8b, 0x1d, 0xb7, 0x85, 0x27, 0x01, 0xf9, 0xb4, - 0xe8, 0x06, 0x67, 0xe1, 0xa2, 0xdc, 0xc5, 0xa6, 0xbe, 0x3f, 0x19, 0xc2, 0x67, 0x84, 0x28, 0x05, - 0x0f, 0x81, 0xa8, 0x40, 0xae, 0xa3, 0xd9, 0xce, 0xbe, 0xd6, 0x9e, 0x68, 0x38, 0x7e, 0x8c, 0x63, - 0x64, 0x3d, 0x26, 0x2e, 0x91, 0x9e, 0x79, 0x1c, 0x98, 0x1f, 0x17, 0x12, 0x09, 0xb0, 0xf1, 0xa9, - 0xe7, 0xb8, 0x34, 0xd1, 0x7d, 0x1c, 0xb4, 0xbf, 0x27, 0xa6, 0x1e, 0xe3, 0xdd, 0x08, 0x22, 0x5e, - 0x81, 0xb4, 0x63, 0xbc, 0x31, 0x11, 0xcc, 0xdf, 0x17, 0x23, 0x4d, 0x19, 0x08, 0xf3, 0xab, 0x70, - 0x7a, 0xe8, 0x32, 0x31, 0x01, 0xd8, 0x3f, 0xe0, 0x60, 0x27, 0x87, 0x2c, 0x15, 0xdc, 0x24, 0x1c, - 0x17, 0xf2, 0x1f, 0x0a, 0x93, 0x80, 0xfb, 0xb0, 0xb6, 0x49, 0xd0, 0xe2, 0x68, 0x7b, 0xc7, 0x93, - 0xda, 0x3f, 0x12, 0x52, 0x63, 0xbc, 0x21, 0xa9, 0x35, 0xe0, 0x24, 0x47, 0x3c, 0xde, 0xb8, 0xfe, - 0x84, 0x30, 0xac, 0x8c, 0x7b, 0x27, 0x3c, 0xba, 0x5f, 0x03, 0x45, 0x4f, 0x9c, 0xc2, 0x3b, 0x76, - 0xd4, 0x8e, 0xd6, 0x9d, 0x00, 0xf9, 0x27, 0x39, 0xb2, 0xb0, 0xf8, 0x9e, 0x7b, 0xed, 0x6c, 0x68, - 0x5d, 0x02, 0xfe, 0x0a, 0xcc, 0x0b, 0xf0, 0x9e, 0x69, 0x63, 0xdd, 0x6a, 0x99, 0xc6, 0x1b, 0xb8, - 0x39, 0x01, 0xf4, 0x4f, 0xf5, 0x0d, 0xd5, 0x4e, 0x80, 0x9d, 0x20, 0xd7, 0x40, 0xf2, 0x7c, 0x15, - 0xd5, 0xe8, 0x74, 0x2d, 0xdb, 0x1d, 0x83, 0xf8, 0xd3, 0x62, 0xa4, 0x3c, 0xbe, 0x1a, 0x65, 0x5b, - 0xa9, 0x02, 0x3b, 0xfd, 0x31, 0xa9, 0x4a, 0x7e, 0x96, 0x03, 0xe5, 0x7c, 0x2e, 0x6e, 0x38, 0x74, - 0xab, 0xd3, 0xd5, 0xec, 0x49, 0xec, 0xdf, 0x3f, 0x16, 0x86, 0x83, 0xb3, 0x70, 0xc3, 0x41, 0x3c, - 0x3a, 0xb2, 0xda, 0x4f, 0x80, 0xf0, 0x33, 0xc2, 0x70, 0x08, 0x1e, 0x0e, 0x21, 0x1c, 0x86, 0x09, - 0x20, 0x3e, 0x27, 0x20, 0x04, 0x0f, 0x81, 0x78, 0xc9, 0x5f, 0x68, 0x6d, 0xdc, 0x32, 0x1c, 0xd7, - 0x66, 0x2e, 0xf9, 0xd1, 0x50, 0x3f, 0xfb, 0xe5, 0xb0, 0x13, 0xa6, 0x04, 0x58, 0x89, 0x25, 0xe2, - 0x5b, 0x1f, 0x34, 0x64, 0x1b, 0xdf, 0xb0, 0x9f, 0x13, 0x96, 0x28, 0xc0, 0x46, 0xda, 0x16, 0xf0, - 0x10, 0x89, 0xd8, 0x75, 0x12, 0xa8, 0x4c, 0x00, 0xf7, 0x4f, 0xfa, 0x1a, 0x57, 0x17, 0xbc, 0x04, - 0x33, 0xe0, 0xff, 0xf4, 0xcc, 0x9b, 0xf8, 0x70, 0x22, 0xed, 0xfc, 0xf9, 0x3e, 0xff, 0x67, 0x87, - 0x71, 0x32, 0x1b, 0x52, 0xe8, 0xf3, 0xa7, 0xd0, 0xb8, 0xb3, 0x7e, 0xf3, 0xdf, 0xf8, 0x0e, 0xef, - 0x6f, 0xd8, 0x9d, 0x5a, 0x59, 0x27, 0x4a, 0x1e, 0x76, 0x7a, 0xc6, 0x83, 0x7d, 0xf4, 0x1d, 0x4f, - 0xcf, 0x43, 0x3e, 0xcf, 0xca, 0x55, 0xc8, 0x85, 0x1c, 0x9e, 0xf1, 0x50, 0xdf, 0xcc, 0xa1, 0xb2, - 0x41, 0x7f, 0x67, 0xe5, 0x12, 0xc4, 0x89, 0xf3, 0x32, 0x9e, 0xfd, 0x5b, 0x38, 0x3b, 0x25, 0x5f, - 0x79, 0x1e, 0x52, 0xc2, 0x69, 0x19, 0xcf, 0xfa, 0xd7, 0x39, 0xab, 0xc7, 0x42, 0xd8, 0x85, 0xc3, - 0x32, 0x9e, 0xfd, 0x6f, 0x08, 0x76, 0xc1, 0x42, 0xd8, 0x27, 0x17, 0xe1, 0x2f, 0xfd, 0xcd, 0x38, - 0x5f, 0x74, 0x84, 0xec, 0xae, 0x40, 0x92, 0x7b, 0x2a, 0xe3, 0xb9, 0xbf, 0x95, 0xbf, 0x5c, 0x70, - 0xac, 0x3c, 0x03, 0xd3, 0x13, 0x0a, 0xfc, 0x6f, 0x71, 0x56, 0x46, 0xbf, 0x52, 0x81, 0x4c, 0xc0, - 0x3b, 0x19, 0xcf, 0xfe, 0xed, 0x9c, 0x3d, 0xc8, 0x45, 0x9a, 0xce, 0xbd, 0x93, 0xf1, 0x00, 0xdf, - 0x21, 0x9a, 0xce, 0x39, 0x88, 0xd8, 0x84, 0x63, 0x32, 0x9e, 0xfb, 0xe3, 0x42, 0xea, 0x82, 0x65, - 0xe5, 0x05, 0x48, 0x7b, 0x8b, 0xcd, 0x78, 0xfe, 0xef, 0xe4, 0xfc, 0x3e, 0x0f, 0x91, 0x40, 0x60, - 0xb1, 0x1b, 0x0f, 0xf1, 0x5d, 0x42, 0x02, 0x01, 0x2e, 0x32, 0x8d, 0xfa, 0x1d, 0x98, 0xf1, 0x48, - 0xdf, 0x2d, 0xa6, 0x51, 0x9f, 0xff, 0x42, 0x46, 0x93, 0xda, 0xfc, 0xf1, 0x10, 0xdf, 0x23, 0x46, - 0x93, 0xd2, 0x93, 0x66, 0xf4, 0x7b, 0x04, 0xe3, 0x31, 0xbe, 0x57, 0x34, 0xa3, 0xcf, 0x21, 0x58, - 0xd9, 0x06, 0x34, 0xe8, 0x0d, 0x8c, 0xc7, 0xfb, 0x04, 0xc7, 0x9b, 0x19, 0x70, 0x06, 0x56, 0x5e, - 0x86, 0x93, 0xc3, 0x3d, 0x81, 0xf1, 0xa8, 0xdf, 0xf7, 0x4e, 0x5f, 0xec, 0x16, 0x74, 0x04, 0x56, - 0x1a, 0xfe, 0x92, 0x12, 0xf4, 0x02, 0xc6, 0xc3, 0x7e, 0xff, 0x3b, 0x61, 0xc3, 0x1d, 0x74, 0x02, - 0x56, 0x4a, 0x00, 0xfe, 0x02, 0x3c, 0x1e, 0xeb, 0x93, 0x1c, 0x2b, 0xc0, 0x44, 0xa6, 0x06, 0x5f, - 0x7f, 0xc7, 0xf3, 0xdf, 0x15, 0x53, 0x83, 0x73, 0x90, 0xa9, 0x21, 0x96, 0xde, 0xf1, 0xdc, 0x3f, - 0x28, 0xa6, 0x86, 0x60, 0x21, 0x9a, 0x1d, 0x58, 0xdd, 0xc6, 0x23, 0x7c, 0x4a, 0x68, 0x76, 0x80, - 0x6b, 0x65, 0x13, 0x66, 0x06, 0x16, 0xc4, 0xf1, 0x50, 0x3f, 0xc4, 0xa1, 0xa4, 0xfe, 0xf5, 0x30, - 0xb8, 0x78, 0xf1, 0xc5, 0x70, 0x3c, 0xda, 0x0f, 0xf7, 0x2d, 0x5e, 0x7c, 0x2d, 0x5c, 0xb9, 0x02, - 0x29, 0xb3, 0xd7, 0x6e, 0x93, 0xc9, 0x83, 0x8e, 0x3e, 0x9f, 0x3b, 0xff, 0x5f, 0xbe, 0xc2, 0xa5, - 0x23, 0x18, 0x56, 0x2e, 0xc1, 0x34, 0xee, 0xec, 0xe2, 0xe6, 0x38, 0xce, 0x2f, 0x7d, 0x45, 0x18, - 0x4c, 0x42, 0xbd, 0xf2, 0x02, 0x00, 0x4b, 0x8d, 0xd0, 0x8d, 0xf3, 0x31, 0xbc, 0xbf, 0xf7, 0x15, - 0x7e, 0x20, 0xce, 0x67, 0xf1, 0x01, 0xd8, 0xf1, 0xba, 0xa3, 0x01, 0xbe, 0x1c, 0x06, 0xa0, 0x23, - 0xf2, 0x1c, 0x24, 0x5f, 0x77, 0x2c, 0xd3, 0xd5, 0x5a, 0xe3, 0xb8, 0x7f, 0x9f, 0x73, 0x0b, 0x7a, - 0x22, 0xb0, 0x8e, 0x65, 0x63, 0x57, 0x6b, 0x39, 0xe3, 0x78, 0xff, 0x2b, 0xe7, 0xf5, 0x18, 0x08, - 0xb3, 0xae, 0x39, 0xee, 0x24, 0xfd, 0xfe, 0x03, 0xc1, 0x2c, 0x18, 0x48, 0xa3, 0xc9, 0xef, 0x9b, - 0xf8, 0x70, 0x1c, 0xef, 0x1f, 0x8a, 0x46, 0x73, 0xfa, 0x95, 0xe7, 0x21, 0x4d, 0x7e, 0xb2, 0x53, - 0xae, 0x63, 0x98, 0xff, 0x88, 0x33, 0xfb, 0x1c, 0xe4, 0xcd, 0x8e, 0xdb, 0x74, 0x8d, 0xf1, 0xc2, - 0xfe, 0x63, 0x3e, 0xd2, 0x82, 0x7e, 0xa5, 0x04, 0x19, 0xc7, 0x6d, 0x36, 0x7b, 0xdc, 0x3f, 0x1d, - 0xc3, 0xfe, 0x27, 0x5f, 0xf1, 0x52, 0x16, 0x1e, 0x0f, 0x19, 0xed, 0xdb, 0x37, 0xdd, 0xae, 0x45, - 0xf7, 0x5b, 0xc6, 0x21, 0xbc, 0xc3, 0x11, 0x02, 0x2c, 0x2b, 0x15, 0xc8, 0x92, 0xbe, 0xd8, 0xb8, - 0x8b, 0xe9, 0xe6, 0xd8, 0x18, 0x88, 0x3f, 0xe5, 0x02, 0x08, 0x31, 0x95, 0xbf, 0xe1, 0x57, 0xde, - 0x5e, 0x88, 0x7c, 0xfe, 0xed, 0x85, 0xc8, 0x6f, 0xbe, 0xbd, 0x10, 0xf9, 0xf8, 0x17, 0x16, 0xa6, - 0x3e, 0xff, 0x85, 0x85, 0xa9, 0xdf, 0xf8, 0xc2, 0xc2, 0xd4, 0xf0, 0x2c, 0x31, 0xac, 0x59, 0x6b, - 0x16, 0xcb, 0x0f, 0xbf, 0xf6, 0x50, 0xcb, 0x70, 0xf7, 0x7b, 0xbb, 0xcb, 0xba, 0xd5, 0xb9, 0xa0, - 0x5b, 0x4e, 0xc7, 0x72, 0x2e, 0x84, 0xf3, 0xba, 0xf4, 0x17, 0xfc, 0xaf, 0x08, 0x89, 0x99, 0xc3, - 0xe9, 0x5c, 0xcd, 0x3c, 0x1c, 0xf5, 0x31, 0xdd, 0x65, 0x88, 0x95, 0xcc, 0x43, 0x74, 0x9a, 0x19, - 0x38, 0xb5, 0x67, 0xb7, 0xf9, 0x51, 0xcb, 0x24, 0x79, 0xde, 0xb1, 0xdb, 0x68, 0xce, 0x3f, 0x0f, - 0x1d, 0x39, 0x97, 0xe5, 0x87, 0x9c, 0xcb, 0xdf, 0x1e, 0x39, 0x5e, 0x4f, 0x52, 0x25, 0xf3, 0x90, - 0x76, 0x64, 0x3b, 0xf2, 0xda, 0x63, 0x63, 0xf3, 0xdc, 0x37, 0x4d, 0xeb, 0xb6, 0x49, 0x9a, 0xdd, - 0xdd, 0x15, 0x39, 0xee, 0x85, 0xfe, 0x1c, 0xf7, 0xcb, 0xb8, 0xdd, 0x7e, 0x91, 0xd0, 0x35, 0x08, - 0xcb, 0x6e, 0x82, 0x9d, 0xea, 0x87, 0xef, 0x8e, 0xc2, 0xc2, 0x40, 0x3a, 0x9b, 0x2b, 0xc1, 0x28, - 0x21, 0xac, 0x40, 0x6a, 0x55, 0xe8, 0xd6, 0x3c, 0x24, 0x1d, 0xac, 0x5b, 0x66, 0xd3, 0xa1, 0x82, - 0x88, 0x29, 0xe2, 0x91, 0x08, 0xc2, 0xd4, 0x4c, 0xcb, 0xe1, 0x87, 0x95, 0xd9, 0x43, 0xf9, 0x07, - 0x8e, 0x29, 0x88, 0x9c, 0x78, 0x93, 0x90, 0xc6, 0x93, 0x13, 0x4a, 0x43, 0x74, 0x22, 0x94, 0xf9, - 0x9f, 0x54, 0x2a, 0xdf, 0x1b, 0x85, 0xc5, 0x7e, 0xa9, 0x90, 0x99, 0xe5, 0xb8, 0x5a, 0xa7, 0x3b, - 0x4a, 0x2c, 0x57, 0x20, 0xdd, 0x10, 0x34, 0xc7, 0x96, 0xcb, 0xdd, 0x63, 0xca, 0x25, 0xef, 0xbd, - 0x4a, 0x08, 0xe6, 0xe2, 0x84, 0x82, 0xf1, 0xfa, 0x71, 0x4f, 0x92, 0xf9, 0xb3, 0x04, 0x9c, 0x66, - 0xd3, 0x49, 0x65, 0x53, 0x89, 0x3d, 0x70, 0x99, 0x64, 0x83, 0x55, 0xe3, 0xf7, 0x49, 0xe4, 0x17, - 0x61, 0xb6, 0x46, 0xac, 0x05, 0x89, 0x82, 0xfc, 0x1d, 0x9e, 0xa1, 0xe7, 0xb9, 0x97, 0x42, 0x0e, - 0x3f, 0xdf, 0xdf, 0x0a, 0x16, 0xc9, 0xdf, 0x18, 0x01, 0xa9, 0xae, 0x6b, 0x6d, 0xcd, 0xfe, 0x8b, - 0x42, 0xa1, 0x67, 0x00, 0xd8, 0x71, 0x0f, 0xef, 0xc3, 0xbd, 0xfc, 0xc5, 0xf9, 0xe5, 0x60, 0xe7, - 0x96, 0xd9, 0x9b, 0xe8, 0x09, 0xaa, 0x34, 0xa5, 0x25, 0x3f, 0xcf, 0xbf, 0x02, 0xe0, 0x57, 0xa0, - 0x33, 0x70, 0xaa, 0x5e, 0x29, 0xad, 0x97, 0x14, 0x71, 0x48, 0xa8, 0xbe, 0x5d, 0xad, 0xd4, 0xae, - 0xd6, 0xaa, 0xab, 0xd2, 0x14, 0x3a, 0x09, 0x28, 0x58, 0xe9, 0x1d, 0x6a, 0x3a, 0x01, 0x33, 0xc1, - 0x72, 0xf6, 0x95, 0x4a, 0x94, 0x78, 0x8a, 0x46, 0xa7, 0xdb, 0xc6, 0x74, 0xe7, 0x51, 0x35, 0x84, - 0xd4, 0xc6, 0x3b, 0x21, 0xbf, 0xfa, 0xef, 0xd9, 0x97, 0x0b, 0xb3, 0x3e, 0xbb, 0x27, 0xf3, 0x95, - 0x75, 0x98, 0xd1, 0x74, 0x1d, 0x77, 0x43, 0x90, 0x63, 0x4c, 0x35, 0x01, 0xa4, 0x7b, 0xa9, 0x9c, - 0xd3, 0x47, 0x7b, 0x06, 0x12, 0x0e, 0xed, 0xfd, 0x38, 0x88, 0x5f, 0xe3, 0x10, 0x9c, 0x7c, 0xc5, - 0x84, 0x19, 0xe2, 0xf9, 0x69, 0x36, 0x0e, 0x34, 0xe3, 0xe8, 0x3c, 0xc3, 0x2f, 0xfc, 0xf4, 0x13, - 0x74, 0x67, 0xf5, 0x81, 0xf0, 0xb0, 0x0c, 0x51, 0x27, 0x45, 0xe2, 0xd8, 0x7e, 0x43, 0x31, 0xe4, - 0xc5, 0xfb, 0x78, 0x83, 0x8f, 0x7e, 0xd9, 0x2f, 0xf2, 0x97, 0x2d, 0x0c, 0xd3, 0x81, 0xc0, 0x9b, - 0x72, 0x1c, 0x95, 0x55, 0x94, 0xab, 0xa3, 0xe6, 0xf4, 0x6b, 0x8f, 0x0e, 0xae, 0x4e, 0xec, 0xbf, - 0xc7, 0x29, 0xf2, 0x95, 0xe0, 0x6b, 0xbc, 0xb9, 0xf7, 0x03, 0x71, 0x98, 0xd1, 0x3a, 0x86, 0x69, - 0x5d, 0xa0, 0xff, 0xf2, 0x39, 0x37, 0x4d, 0x1f, 0x26, 0xd8, 0x94, 0xbc, 0xcc, 0xa6, 0xc2, 0x78, - 0x8d, 0xf9, 0xa3, 0x6f, 0xfb, 0xd1, 0x69, 0x7f, 0xba, 0xac, 0x6c, 0x80, 0x24, 0x0e, 0xf1, 0x62, - 0x53, 0xb7, 0x9a, 0x13, 0x65, 0x29, 0xfe, 0x58, 0x60, 0x88, 0xfc, 0x56, 0x95, 0xb3, 0xae, 0x7c, - 0x10, 0x52, 0x1e, 0xcc, 0x38, 0xcf, 0x44, 0x80, 0x78, 0x1c, 0xc4, 0x2f, 0x61, 0x33, 0x73, 0x12, - 0x2f, 0xf4, 0x1d, 0xc1, 0xcf, 0x66, 0xe8, 0x26, 0xe9, 0xcd, 0x1a, 0xe4, 0x9b, 0x96, 0xe9, 0xaa, - 0x56, 0xc7, 0x70, 0x71, 0xa7, 0xeb, 0x8e, 0xf5, 0xeb, 0xfe, 0x94, 0x81, 0xa4, 0x94, 0x1c, 0xe1, - 0xdb, 0x12, 0x6c, 0xa4, 0x25, 0xec, 0x3b, 0xbd, 0x49, 0x5a, 0xf2, 0xdf, 0xbc, 0x96, 0x50, 0x1e, - 0xd2, 0x92, 0x7b, 0xd2, 0x0e, 0xa7, 0x79, 0x93, 0x1b, 0x73, 0xf7, 0x80, 0x69, 0x81, 0xa7, 0x1d, - 0x7f, 0x10, 0x83, 0x05, 0x4e, 0xbc, 0xab, 0x39, 0xf8, 0xc2, 0xad, 0x27, 0x77, 0xb1, 0xab, 0x3d, - 0x79, 0x41, 0xb7, 0x0c, 0xb1, 0x92, 0xcf, 0x72, 0x63, 0x4d, 0xea, 0x97, 0x79, 0x7d, 0x71, 0xe8, - 0x76, 0x77, 0x71, 0xb4, 0x91, 0x2f, 0x0e, 0xea, 0xa0, 0xfc, 0x1a, 0xc4, 0x2b, 0x96, 0x61, 0x92, - 0xb5, 0xad, 0x89, 0x4d, 0xab, 0xc3, 0xcd, 0x2d, 0x7b, 0x40, 0x97, 0x21, 0xa1, 0x75, 0xac, 0x9e, - 0xe9, 0x32, 0x53, 0x5b, 0x5e, 0xf8, 0x95, 0xb7, 0x16, 0xa7, 0xfe, 0xe3, 0x5b, 0x8b, 0xb1, 0x9a, - 0xe9, 0xfe, 0xfa, 0x67, 0x1f, 0x07, 0x8e, 0x5e, 0x33, 0xdd, 0xcf, 0xfc, 0xee, 0x4f, 0x9c, 0x8f, - 0x28, 0x9c, 0x7a, 0x25, 0xfe, 0xc5, 0x37, 0x17, 0x23, 0xf2, 0x2b, 0x90, 0x5c, 0xc5, 0xfa, 0x11, - 0xf0, 0x4f, 0xf6, 0xc1, 0x9f, 0x16, 0xf0, 0xab, 0x58, 0x0f, 0xc0, 0xaf, 0x62, 0xbd, 0x0f, 0xf9, - 0x19, 0x48, 0xd5, 0x4c, 0x97, 0x7d, 0x42, 0xf4, 0x28, 0xc4, 0x0c, 0x93, 0x9d, 0x4a, 0x0f, 0x20, - 0x0c, 0x34, 0x50, 0x21, 0x54, 0x84, 0x71, 0x15, 0xeb, 0x1e, 0x63, 0x13, 0xeb, 0xfd, 0x8c, 0x83, - 0xaf, 0x26, 0x54, 0xe5, 0xd5, 0xdf, 0xf8, 0xad, 0x85, 0xa9, 0x8f, 0xbc, 0xbd, 0x30, 0x35, 0x72, - 0xe8, 0xe5, 0xf1, 0x43, 0xef, 0x8d, 0xf8, 0x8f, 0xc6, 0xe1, 0x7e, 0xfa, 0x65, 0xa9, 0xdd, 0x31, - 0x4c, 0xf7, 0x82, 0x6e, 0x1f, 0x76, 0x5d, 0x8b, 0x18, 0x00, 0x6b, 0x8f, 0x0f, 0xf8, 0x8c, 0x5f, - 0xbd, 0xcc, 0xaa, 0x87, 0x0f, 0xb7, 0xbc, 0x07, 0xd3, 0xdb, 0x84, 0x8f, 0x88, 0xd8, 0xb5, 0x5c, - 0xad, 0xcd, 0xbd, 0x16, 0xf6, 0x40, 0x4a, 0xd9, 0xd7, 0xa8, 0x51, 0x56, 0x6a, 0x88, 0x0f, 0x51, - 0xdb, 0x58, 0xdb, 0x63, 0x1f, 0xf5, 0xc4, 0xa8, 0xbb, 0x9b, 0x22, 0x05, 0xf4, 0xfb, 0x9d, 0x39, - 0x98, 0xd6, 0x7a, 0xec, 0xe0, 0x4d, 0x8c, 0xf8, 0xc1, 0xf4, 0x41, 0x7e, 0x11, 0x92, 0x7c, 0xff, - 0x1d, 0x49, 0x10, 0xbb, 0x89, 0x0f, 0xe9, 0x7b, 0xb2, 0x0a, 0xf9, 0x89, 0x96, 0x61, 0x9a, 0x36, - 0x9e, 0x7f, 0xad, 0x38, 0xbf, 0x3c, 0xd0, 0xfa, 0x65, 0xda, 0x48, 0x85, 0x91, 0xc9, 0xd7, 0x21, - 0xb5, 0x6a, 0x11, 0x2d, 0x0c, 0xa3, 0xa5, 0x19, 0x1a, 0x6d, 0x73, 0xb7, 0xc7, 0xb5, 0x42, 0x61, - 0x0f, 0xe8, 0x24, 0x24, 0xd8, 0x47, 0x5e, 0xfc, 0xf0, 0x10, 0x7f, 0x92, 0x2b, 0x90, 0xa4, 0xd8, - 0x5b, 0x5d, 0xe2, 0x32, 0x78, 0xe7, 0xde, 0xd3, 0xfc, 0x93, 0x5f, 0x0e, 0x1f, 0xf5, 0x1b, 0x8b, - 0x20, 0xde, 0xd4, 0x5c, 0x8d, 0xf7, 0x9b, 0xfe, 0x96, 0x3f, 0x04, 0x29, 0x0e, 0xe2, 0xa0, 0x8b, - 0x10, 0xb3, 0xba, 0x0e, 0x3f, 0xfe, 0x53, 0x1c, 0xd5, 0x95, 0xad, 0x6e, 0x39, 0x4e, 0x74, 0x46, - 0x21, 0xc4, 0xe5, 0xcd, 0x91, 0x6a, 0xf1, 0x74, 0x48, 0x2d, 0x3a, 0xd8, 0xdd, 0xdd, 0x73, 0xfd, - 0x1f, 0x6c, 0x38, 0x07, 0x54, 0xc1, 0x53, 0x94, 0xbb, 0x51, 0x58, 0x08, 0xd4, 0xde, 0xc2, 0xb6, - 0x63, 0x58, 0x26, 0xd3, 0x26, 0xae, 0x29, 0x28, 0xd0, 0x40, 0x5e, 0x3f, 0x42, 0x55, 0x9e, 0x87, - 0x58, 0xa9, 0xdb, 0x45, 0x45, 0x48, 0xd1, 0x67, 0xdd, 0x62, 0xba, 0x12, 0x57, 0xbc, 0x67, 0x52, - 0xe7, 0x58, 0x7b, 0xee, 0x6d, 0xcd, 0xf6, 0xbe, 0x81, 0x16, 0xcf, 0xf2, 0x73, 0x90, 0xae, 0x58, - 0xa6, 0x83, 0x4d, 0xa7, 0x47, 0x7d, 0xe1, 0xdd, 0xb6, 0xa5, 0xdf, 0xe4, 0x08, 0xec, 0x81, 0x08, - 0x5b, 0xeb, 0x76, 0x29, 0x67, 0x5c, 0x21, 0x3f, 0xd9, 0x7c, 0x2d, 0x6f, 0x8d, 0x14, 0xcf, 0xa5, - 0xe3, 0x89, 0x87, 0x77, 0xd0, 0x77, 0x6a, 0x23, 0x70, 0xdf, 0xe0, 0x44, 0xba, 0x89, 0x0f, 0x9d, - 0xe3, 0xce, 0xa3, 0x57, 0x20, 0xbd, 0x4d, 0xaf, 0x27, 0x79, 0x11, 0x1f, 0xa2, 0x22, 0x24, 0x71, - 0xf3, 0xe2, 0xa5, 0x4b, 0x4f, 0x3e, 0xc7, 0xb4, 0xfc, 0xda, 0x94, 0x22, 0x0a, 0xd0, 0x02, 0xa4, - 0x1d, 0xac, 0x77, 0x2f, 0x5e, 0xba, 0x7c, 0xf3, 0x49, 0xa6, 0x56, 0xd7, 0xa6, 0x14, 0xbf, 0x68, - 0x25, 0x45, 0x7a, 0xfc, 0xc5, 0x4f, 0x2d, 0x46, 0xca, 0xd3, 0x10, 0x73, 0x7a, 0x9d, 0xf7, 0x4c, - 0x37, 0xfe, 0x30, 0x01, 0x4b, 0x81, 0x5a, 0xb6, 0xb8, 0xdc, 0xd2, 0xda, 0x46, 0x53, 0xf3, 0x2f, - 0x95, 0x91, 0x02, 0xfd, 0xa7, 0x14, 0x23, 0x56, 0x8d, 0x23, 0xa5, 0x28, 0xff, 0x54, 0x04, 0xb2, - 0x37, 0x04, 0x72, 0x1d, 0xbb, 0xe8, 0x0a, 0x80, 0xf7, 0x26, 0x31, 0x55, 0xce, 0x2c, 0xf7, 0xbf, - 0x6b, 0xd9, 0xe3, 0x51, 0x02, 0xe4, 0xe8, 0x19, 0xaa, 0x80, 0x5d, 0xcb, 0xe1, 0xdf, 0xc3, 0x8e, - 0x61, 0xf5, 0x88, 0xd1, 0x63, 0x80, 0xa8, 0x55, 0x53, 0x6f, 0x59, 0xae, 0x61, 0xb6, 0xd4, 0xae, - 0x75, 0x9b, 0xdf, 0x32, 0x10, 0x53, 0x24, 0x5a, 0x73, 0x83, 0x56, 0x6c, 0x93, 0x72, 0xd2, 0xe8, - 0xb4, 0x87, 0x42, 0xc2, 0x3a, 0xad, 0xd9, 0xb4, 0xb1, 0xe3, 0x70, 0xc3, 0x25, 0x1e, 0xd1, 0x15, - 0x48, 0x76, 0x7b, 0xbb, 0xaa, 0xb0, 0x12, 0x99, 0x8b, 0xf7, 0x0d, 0x9b, 0xf3, 0x42, 0x37, 0xf8, - 0xac, 0x4f, 0x74, 0x7b, 0xbb, 0x44, 0x53, 0x1e, 0x80, 0xec, 0x90, 0xc6, 0x64, 0x6e, 0xf9, 0xed, - 0xa0, 0x37, 0xe2, 0xf0, 0x1e, 0xa8, 0x5d, 0xdb, 0xb0, 0x6c, 0xc3, 0x3d, 0xa4, 0xc7, 0xf6, 0x62, - 0x8a, 0x24, 0x2a, 0xb6, 0x79, 0xb9, 0x7c, 0x13, 0x0a, 0x75, 0xea, 0xee, 0xfb, 0x2d, 0xbf, 0xe4, - 0xb7, 0x2f, 0x32, 0xbe, 0x7d, 0x23, 0x5b, 0x16, 0x1d, 0x68, 0xd9, 0xf9, 0xff, 0x10, 0x81, 0x4c, - 0x99, 0x4c, 0xdc, 0xda, 0xea, 0xd5, 0xb6, 0xd6, 0x42, 0x4f, 0xc2, 0x89, 0xf2, 0xfa, 0x56, 0xe5, - 0x45, 0xb5, 0xb6, 0xaa, 0x5e, 0x5d, 0x2f, 0xad, 0xf9, 0xe7, 0x84, 0x8b, 0x27, 0xef, 0xdc, 0x5d, - 0x42, 0x01, 0xda, 0x1d, 0x93, 0xc6, 0xa4, 0xe8, 0x02, 0xcc, 0x85, 0x59, 0x4a, 0xe5, 0x7a, 0x75, - 0xb3, 0x21, 0x45, 0x8a, 0x27, 0xee, 0xdc, 0x5d, 0x9a, 0x09, 0x70, 0x94, 0x76, 0x1d, 0x6c, 0xba, - 0x83, 0x0c, 0x95, 0xad, 0x8d, 0x8d, 0x5a, 0x43, 0x8a, 0x0e, 0x30, 0x54, 0xac, 0x4e, 0xc7, 0x70, - 0xd1, 0x23, 0x30, 0x13, 0x66, 0xd8, 0xac, 0xad, 0x4b, 0xb1, 0x22, 0xba, 0x73, 0x77, 0x29, 0x1f, - 0xa0, 0xde, 0x34, 0xda, 0xc5, 0xd4, 0xc7, 0x7e, 0x78, 0x61, 0xea, 0x33, 0x7f, 0x77, 0x21, 0x52, - 0xde, 0x18, 0x39, 0xe7, 0x9e, 0x3a, 0xde, 0x9c, 0x0b, 0xaf, 0xdb, 0x5f, 0xb9, 0x2f, 0x64, 0x6e, - 0xb8, 0x3f, 0x17, 0x30, 0xc6, 0x93, 0x4e, 0xb7, 0x71, 0x39, 0x8a, 0xe2, 0xd1, 0xee, 0x41, 0x71, - 0xcc, 0xa2, 0x50, 0x1c, 0x6b, 0x18, 0xe4, 0xe7, 0x20, 0xb7, 0xad, 0xd9, 0x6e, 0x1d, 0xbb, 0xd7, - 0xb0, 0xd6, 0xc4, 0x76, 0xd8, 0x7f, 0xc8, 0x09, 0xff, 0x01, 0x41, 0x9c, 0x3a, 0x09, 0x6c, 0xfd, - 0xa4, 0xbf, 0xe5, 0x7d, 0x88, 0xd3, 0x13, 0xc9, 0x9e, 0x6f, 0xc1, 0x39, 0x98, 0x6f, 0x41, 0x56, - 0x86, 0x43, 0x17, 0x3b, 0x22, 0x8d, 0x46, 0x1f, 0xd0, 0xd3, 0xc2, 0x43, 0x88, 0x1d, 0xed, 0x21, - 0xf0, 0xe9, 0xc5, 0xfd, 0x84, 0x36, 0x24, 0xf9, 0x10, 0x7b, 0x0d, 0x89, 0xf8, 0x0d, 0x41, 0x1b, - 0x50, 0xe8, 0x6a, 0xb6, 0x4b, 0xbf, 0x50, 0xdc, 0xa7, 0xbd, 0xe0, 0x33, 0x78, 0x71, 0xd0, 0x9e, - 0x84, 0x3a, 0xcb, 0xdf, 0x92, 0xeb, 0x06, 0x0b, 0xe5, 0xdf, 0x89, 0x43, 0x82, 0x0b, 0xe3, 0x79, - 0x48, 0x72, 0xb1, 0xf2, 0x39, 0x77, 0xff, 0xf2, 0xe0, 0x32, 0xbb, 0xec, 0x2d, 0x87, 0x1c, 0x4f, - 0xf0, 0xa0, 0x87, 0x21, 0xa5, 0xef, 0x6b, 0x86, 0xa9, 0x1a, 0x4d, 0xee, 0xda, 0x66, 0xde, 0x7e, - 0x6b, 0x31, 0x59, 0x21, 0x65, 0xb5, 0x55, 0x25, 0x49, 0x2b, 0x6b, 0x4d, 0xe2, 0xd3, 0xec, 0x63, - 0xa3, 0xb5, 0xef, 0x72, 0xbb, 0xc1, 0x9f, 0xd0, 0xb3, 0x10, 0x27, 0x0a, 0xc1, 0xbf, 0x5f, 0x2f, - 0x0e, 0x44, 0x28, 0x5e, 0x0a, 0xa9, 0x9c, 0x22, 0x2f, 0xfe, 0xf8, 0x7f, 0x5e, 0x8c, 0x28, 0x94, - 0x03, 0x55, 0x20, 0xd7, 0xd6, 0x1c, 0x57, 0xa5, 0xeb, 0x31, 0x79, 0xfd, 0x34, 0x85, 0x38, 0x3d, - 0x28, 0x10, 0x2e, 0x58, 0xde, 0xf4, 0x0c, 0xe1, 0x62, 0x45, 0x4d, 0x74, 0x0e, 0x24, 0x0a, 0xa2, - 0xd3, 0x19, 0xc8, 0xbc, 0xc4, 0x04, 0x95, 0x7b, 0x9e, 0x94, 0xb3, 0x89, 0x49, 0x7d, 0xc5, 0x33, - 0x90, 0xa6, 0x5f, 0xcc, 0x52, 0x12, 0x76, 0x0c, 0x3e, 0x45, 0x0a, 0x68, 0xe5, 0x59, 0x28, 0xf8, - 0x56, 0x9f, 0x91, 0xa4, 0x18, 0x8a, 0x5f, 0x4c, 0x09, 0x9f, 0x80, 0x39, 0x13, 0x1f, 0xd0, 0x83, - 0xf9, 0x21, 0xea, 0x34, 0xa5, 0x46, 0xa4, 0xee, 0x46, 0x98, 0xe3, 0x21, 0xc8, 0xeb, 0x42, 0xf8, - 0x8c, 0x16, 0x28, 0x6d, 0xce, 0x2b, 0xa5, 0x64, 0xa7, 0x21, 0xa5, 0x75, 0xbb, 0x8c, 0x20, 0xc3, - 0xad, 0x7e, 0xb7, 0x4b, 0xab, 0xce, 0xc3, 0x0c, 0xed, 0xa3, 0x8d, 0x9d, 0x5e, 0xdb, 0xe5, 0x20, - 0x59, 0x4a, 0x53, 0x20, 0x15, 0x0a, 0x2b, 0xa7, 0xb4, 0x0f, 0x42, 0x0e, 0xdf, 0x32, 0x9a, 0xd8, - 0xd4, 0x31, 0xa3, 0xcb, 0x51, 0xba, 0xac, 0x28, 0xa4, 0x44, 0x8f, 0x80, 0x67, 0xcd, 0x55, 0xb1, - 0xd2, 0xe4, 0x19, 0x9e, 0x28, 0x2f, 0xb1, 0x62, 0x79, 0x1e, 0xe2, 0xab, 0x9a, 0xab, 0x11, 0x77, - 0xc9, 0x3d, 0x60, 0xcb, 0x67, 0x56, 0x21, 0x3f, 0xe5, 0xcf, 0xc5, 0x20, 0x7e, 0xc3, 0x72, 0x31, - 0x7a, 0x2a, 0xe0, 0xca, 0xe6, 0x87, 0xe9, 0x73, 0xdd, 0x68, 0x99, 0xb8, 0xb9, 0xe1, 0xb4, 0x02, - 0xd7, 0xdb, 0xf8, 0xea, 0x14, 0x0d, 0xa9, 0xd3, 0x1c, 0x4c, 0xdb, 0x56, 0xcf, 0x6c, 0x8a, 0x03, - 0xe4, 0xf4, 0x01, 0x55, 0x21, 0xe5, 0x69, 0x49, 0x7c, 0x9c, 0x96, 0x14, 0x88, 0x96, 0x10, 0x1d, - 0xe6, 0x05, 0x4a, 0x72, 0x97, 0x2b, 0x4b, 0x19, 0xd2, 0x9e, 0xf1, 0xe2, 0xda, 0x36, 0x99, 0xc2, - 0xfa, 0x6c, 0x64, 0x89, 0xf4, 0xc6, 0xde, 0x13, 0x1e, 0xd3, 0x38, 0xc9, 0xab, 0xe0, 0xd2, 0x0b, - 0xa9, 0x15, 0xbf, 0x6a, 0x27, 0x49, 0xfb, 0xe5, 0xab, 0x15, 0xbb, 0x6e, 0xe7, 0x3e, 0x48, 0x3b, - 0x46, 0xcb, 0xd4, 0xdc, 0x9e, 0x8d, 0xb9, 0xe6, 0xf9, 0x05, 0xa4, 0xd6, 0xff, 0x98, 0x82, 0x69, - 0x5a, 0xe0, 0x06, 0xb0, 0x0b, 0x30, 0xeb, 0xdf, 0xbd, 0xe5, 0xa3, 0x30, 0x2d, 0x43, 0x5e, 0x55, - 0x5d, 0xd4, 0xc8, 0xbf, 0x14, 0x81, 0x04, 0x5f, 0xb1, 0xfc, 0x61, 0x88, 0x0c, 0x1f, 0x86, 0xe8, - 0xa8, 0x61, 0x88, 0xdd, 0xfb, 0x30, 0x94, 0x00, 0xbc, 0x66, 0x3a, 0xfc, 0x42, 0x95, 0x21, 0x6e, - 0x15, 0x6b, 0x62, 0xdd, 0x68, 0xf1, 0x79, 0x1f, 0x60, 0x92, 0xff, 0x53, 0x84, 0x78, 0xf8, 0xbc, - 0x1e, 0x95, 0x20, 0x27, 0xda, 0xa5, 0xee, 0xb5, 0xb5, 0x16, 0x57, 0xc5, 0xfb, 0x47, 0x36, 0x8e, - 0xac, 0xc2, 0x4a, 0x86, 0xb7, 0x87, 0xfa, 0x13, 0x43, 0x87, 0x35, 0x3a, 0x62, 0x58, 0x43, 0x7a, - 0x14, 0xbb, 0x37, 0x3d, 0x0a, 0x8d, 0x78, 0xbc, 0x6f, 0xc4, 0xe5, 0xdf, 0x8a, 0xf0, 0x9b, 0xbf, - 0x9a, 0xec, 0x4b, 0x90, 0xbf, 0xac, 0xa1, 0x7a, 0x8d, 0xeb, 0x56, 0x13, 0x37, 0xd5, 0x81, 0x31, - 0x7b, 0x70, 0x10, 0x31, 0xdc, 0x66, 0x7f, 0xec, 0x90, 0x40, 0xa9, 0xfb, 0x63, 0xf8, 0xd9, 0x28, - 0xcc, 0x0c, 0xd0, 0xff, 0xdf, 0x37, 0x96, 0xe1, 0xd9, 0x3b, 0x3d, 0xe1, 0xec, 0x4d, 0x8c, 0x9c, - 0xbd, 0x3f, 0x1d, 0xa5, 0x09, 0x80, 0xae, 0xe5, 0x68, 0xed, 0xf7, 0xc3, 0xf6, 0x9e, 0x81, 0x74, - 0xd7, 0x6a, 0xab, 0xac, 0x86, 0x7d, 0xc2, 0x93, 0xea, 0x5a, 0x6d, 0x65, 0x40, 0xcd, 0xa6, 0xdf, - 0x25, 0xc3, 0x9c, 0x78, 0x17, 0x06, 0x21, 0xd9, 0x3f, 0xa1, 0x6c, 0xc8, 0x32, 0x51, 0x70, 0xaf, - 0xe9, 0x09, 0x22, 0x03, 0xea, 0x86, 0x45, 0x06, 0xbd, 0x3c, 0xd6, 0x6c, 0x46, 0xa9, 0x70, 0x3a, - 0xc2, 0xc1, 0x9c, 0x8c, 0x61, 0x99, 0xa3, 0xa0, 0xc5, 0x52, 0x38, 0x9d, 0xfc, 0xb7, 0x23, 0x00, - 0xeb, 0x44, 0xb2, 0xb4, 0xbf, 0xc4, 0xdf, 0x71, 0x68, 0x13, 0xd4, 0xd0, 0x9b, 0x17, 0x46, 0x0d, - 0x1a, 0x7f, 0x7f, 0xd6, 0x09, 0xb6, 0xbb, 0x02, 0x39, 0x5f, 0xb7, 0x1d, 0x2c, 0x1a, 0xb3, 0x70, - 0x44, 0x54, 0x5a, 0xc7, 0xae, 0x92, 0xbd, 0x15, 0x78, 0x92, 0xff, 0x59, 0x04, 0xd2, 0xb4, 0x4d, - 0x1b, 0xd8, 0xd5, 0x42, 0x63, 0x18, 0xb9, 0xf7, 0x31, 0xbc, 0x1f, 0x80, 0xc1, 0x38, 0xc6, 0x1b, - 0x98, 0x6b, 0x56, 0x9a, 0x96, 0xd4, 0x8d, 0x37, 0x30, 0xba, 0xec, 0x09, 0x3c, 0x76, 0xb4, 0xc0, - 0x45, 0xd4, 0xca, 0xc5, 0x7e, 0x0a, 0x92, 0xf4, 0x6e, 0xca, 0x03, 0x87, 0x07, 0xa2, 0x09, 0xb3, - 0xd7, 0x69, 0x1c, 0x38, 0xf2, 0xeb, 0x90, 0x6c, 0x1c, 0xb0, 0x7c, 0xe2, 0x19, 0x48, 0xdb, 0x96, - 0xc5, 0xbd, 0x3f, 0xe6, 0x75, 0xa7, 0x48, 0x01, 0x75, 0x76, 0x44, 0x0e, 0x2d, 0xea, 0xe7, 0xd0, - 0xfc, 0x24, 0x60, 0x6c, 0xa2, 0x24, 0x20, 0x89, 0x3e, 0x73, 0xa1, 0x99, 0x84, 0x1e, 0x83, 0x53, - 0xf5, 0xda, 0xda, 0x66, 0x75, 0x55, 0xdd, 0xa8, 0xaf, 0xf5, 0x7d, 0x9e, 0x5f, 0x2c, 0xdc, 0xb9, - 0xbb, 0x94, 0xe1, 0x61, 0xe7, 0x28, 0xea, 0x6d, 0xa5, 0x7a, 0x63, 0xab, 0x51, 0x95, 0x22, 0x8c, - 0x7a, 0xdb, 0xc6, 0xb7, 0x2c, 0x97, 0x5d, 0xfe, 0xfa, 0x04, 0x9c, 0x1e, 0x42, 0xed, 0x05, 0x9f, - 0x33, 0x77, 0xee, 0x2e, 0xe5, 0xb6, 0x6d, 0xcc, 0xb4, 0x8c, 0x72, 0x2c, 0xc3, 0xfc, 0x20, 0xc7, - 0xd6, 0xf6, 0x56, 0xbd, 0xb4, 0x2e, 0x2d, 0x15, 0xa5, 0x3b, 0x77, 0x97, 0xb2, 0xc2, 0x64, 0x10, - 0xfa, 0xf7, 0x3e, 0xfa, 0xfc, 0xd6, 0x54, 0x28, 0x6b, 0xcc, 0xe2, 0xba, 0xae, 0x66, 0x6b, 0x9d, - 0xe3, 0x86, 0x9f, 0x63, 0x0e, 0x0e, 0xc8, 0x3f, 0x15, 0x85, 0x82, 0x17, 0xdc, 0x6c, 0xd3, 0x37, - 0xa0, 0xa7, 0x82, 0x19, 0xbf, 0xcc, 0xc8, 0xb5, 0x83, 0x51, 0x8b, 0x84, 0xe0, 0x07, 0x21, 0x25, - 0x9c, 0x64, 0x3e, 0xa9, 0x96, 0x86, 0xac, 0x6f, 0x9c, 0x82, 0xb3, 0x7a, 0x1c, 0xe8, 0x05, 0x48, - 0x7b, 0x53, 0xcc, 0xbb, 0x20, 0x6d, 0xf4, 0x9c, 0xe4, 0xfc, 0x3e, 0x0f, 0x7a, 0xce, 0x0f, 0xe3, - 0xe2, 0xa3, 0x02, 0xc3, 0x1b, 0x8c, 0x80, 0x33, 0x7b, 0x21, 0xdc, 0x13, 0x10, 0xd7, 0x76, 0x75, - 0x83, 0x1b, 0xe0, 0xfb, 0x06, 0xf9, 0x4a, 0xe5, 0x4a, 0x8d, 0x33, 0x51, 0x4a, 0xb9, 0xc6, 0x93, - 0x29, 0x5c, 0x5e, 0xf4, 0x3a, 0x9a, 0x03, 0x95, 0xc5, 0xc2, 0xcc, 0xbb, 0x48, 0x75, 0xb4, 0x83, - 0x32, 0x0d, 0x87, 0x4f, 0x41, 0x92, 0x54, 0xb6, 0xf8, 0x85, 0x07, 0x31, 0x25, 0xd1, 0xd1, 0x0e, - 0xd6, 0x34, 0xe7, 0x7a, 0x3c, 0x15, 0x93, 0xe2, 0xf2, 0x8f, 0x11, 0x4f, 0x25, 0x24, 0x15, 0xf4, - 0x28, 0x20, 0xc2, 0xa1, 0xb5, 0xb0, 0x4a, 0xa6, 0x2e, 0x15, 0xaf, 0xc0, 0x2d, 0x74, 0xb4, 0x83, - 0x52, 0x0b, 0x6f, 0xf6, 0x3a, 0xb4, 0x01, 0x0e, 0xda, 0x00, 0x49, 0x10, 0x8b, 0x91, 0xe5, 0xe2, - 0x3f, 0x3d, 0x78, 0xc1, 0x2a, 0x27, 0x60, 0x0b, 0xc0, 0x27, 0xc8, 0x02, 0x90, 0x67, 0x78, 0xde, - 0x51, 0x91, 0x50, 0x57, 0x62, 0xe1, 0xae, 0xc8, 0x2f, 0x40, 0xa1, 0x6f, 0x04, 0x90, 0x0c, 0x39, - 0x9e, 0xb1, 0xa2, 0xdb, 0xf0, 0x2c, 0xc2, 0x49, 0x2b, 0x19, 0x96, 0x99, 0xa2, 0xc7, 0x12, 0x56, - 0x52, 0x3f, 0xfb, 0xe6, 0x62, 0x84, 0x6e, 0xe6, 0x3c, 0x0a, 0xb9, 0xd0, 0x18, 0x88, 0x2c, 0x72, - 0xc4, 0xcf, 0x22, 0xfb, 0xc4, 0xaf, 0x41, 0x96, 0x18, 0x20, 0xdc, 0xe4, 0xb4, 0x0f, 0x43, 0x81, - 0x19, 0xc8, 0x7e, 0x59, 0x33, 0x87, 0x67, 0x43, 0x08, 0x5c, 0x16, 0x1e, 0x50, 0x58, 0xec, 0x19, - 0x41, 0xb5, 0xa6, 0x39, 0xf2, 0x16, 0x80, 0x3f, 0xa8, 0xa8, 0x04, 0xf7, 0x13, 0xe3, 0x11, 0x3c, - 0x36, 0xca, 0xaf, 0xc6, 0x0a, 0x79, 0x8c, 0x45, 0x42, 0xe4, 0x1f, 0x0d, 0x65, 0x17, 0x64, 0x5d, - 0xa3, 0x14, 0xe5, 0x97, 0x3e, 0xf3, 0xf6, 0x42, 0xe4, 0xbd, 0xb1, 0x05, 0xdf, 0xf5, 0x32, 0x9c, - 0x09, 0x54, 0x12, 0x05, 0x0c, 0x25, 0xa2, 0x0a, 0x01, 0x7d, 0x25, 0x95, 0xe3, 0x12, 0x4a, 0x47, - 0xe6, 0x7f, 0x8b, 0x47, 0x9b, 0x9d, 0xf1, 0xd9, 0xa6, 0xf1, 0xf9, 0xae, 0xe1, 0x49, 0xf9, 0x7f, - 0x9a, 0x86, 0xa4, 0x82, 0x3f, 0xdc, 0xc3, 0x8e, 0x8b, 0x2e, 0x42, 0x1c, 0xeb, 0xfb, 0xd6, 0xb0, - 0x1c, 0x28, 0xe9, 0xe0, 0x32, 0xa7, 0xab, 0xea, 0xfb, 0xd6, 0xb5, 0x29, 0x85, 0xd2, 0xa2, 0x4b, - 0x30, 0xbd, 0xd7, 0xee, 0xf1, 0xf4, 0x55, 0x9f, 0xcd, 0x0a, 0x32, 0x5d, 0x25, 0x44, 0xd7, 0xa6, - 0x14, 0x46, 0x4d, 0x5e, 0x45, 0x6f, 0xc6, 0x8e, 0x1d, 0xfd, 0xaa, 0x9a, 0xb9, 0x47, 0x5f, 0x45, - 0x68, 0x51, 0x19, 0xc0, 0x30, 0x0d, 0x57, 0xa5, 0xa9, 0x1d, 0x6e, 0x35, 0x1e, 0x18, 0xcd, 0x69, - 0xb8, 0x34, 0x19, 0x74, 0x6d, 0x4a, 0x49, 0x1b, 0xe2, 0x81, 0x34, 0xf7, 0xc3, 0x3d, 0x6c, 0x1f, - 0x72, 0x6f, 0x6d, 0x64, 0x73, 0x5f, 0x22, 0x44, 0xa4, 0xb9, 0x94, 0x9a, 0x18, 0x59, 0x76, 0xc9, - 0x9e, 0x7b, 0xc0, 0xaf, 0x8e, 0x5d, 0x1c, 0xc5, 0x49, 0x6f, 0xda, 0x6b, 0x1c, 0x5c, 0x9b, 0x52, - 0x92, 0x3a, 0xfb, 0x89, 0x9e, 0xf5, 0x5c, 0xb0, 0xcc, 0xa0, 0xd7, 0x13, 0xe2, 0x65, 0x69, 0x9f, - 0x29, 0xe1, 0x8a, 0xa1, 0x4d, 0xc8, 0xb7, 0x0d, 0xc7, 0x55, 0x1d, 0x53, 0xeb, 0x3a, 0xfb, 0x96, - 0xeb, 0xd0, 0xfc, 0x49, 0xe6, 0xe2, 0x43, 0xa3, 0x10, 0xd6, 0x0d, 0xc7, 0xad, 0x0b, 0xe2, 0x6b, - 0x53, 0x4a, 0xae, 0x1d, 0x2c, 0x20, 0x78, 0xd6, 0xde, 0x1e, 0xb6, 0x3d, 0x40, 0x9a, 0x67, 0x39, - 0x02, 0x6f, 0x8b, 0x50, 0x0b, 0x7e, 0x82, 0x67, 0x05, 0x0b, 0xd0, 0xd7, 0xc0, 0x6c, 0xdb, 0xd2, - 0x9a, 0x1e, 0x9c, 0xaa, 0xef, 0xf7, 0xcc, 0x9b, 0x34, 0x29, 0x93, 0xb9, 0xf8, 0xc8, 0xc8, 0x46, - 0x5a, 0x5a, 0x53, 0x40, 0x54, 0x08, 0xc3, 0xb5, 0x29, 0x65, 0xa6, 0xdd, 0x5f, 0x88, 0xbe, 0x1e, - 0xe6, 0xb4, 0x6e, 0xb7, 0x7d, 0xd8, 0x8f, 0x5e, 0xa0, 0xe8, 0xe7, 0x47, 0xa1, 0x97, 0x08, 0x4f, - 0x3f, 0x3c, 0xd2, 0x06, 0x4a, 0x51, 0x03, 0xa4, 0xae, 0x8d, 0xe9, 0x97, 0x57, 0x5d, 0xee, 0x65, - 0xd0, 0x7b, 0xa9, 0x32, 0x17, 0xcf, 0x8e, 0xc2, 0xde, 0x66, 0xf4, 0xc2, 0x29, 0xb9, 0x36, 0xa5, - 0x14, 0xba, 0xe1, 0x22, 0x86, 0x6a, 0xe9, 0x98, 0x5e, 0x9b, 0xc7, 0x51, 0x67, 0xc6, 0xa1, 0x52, - 0xfa, 0x30, 0x6a, 0xa8, 0x08, 0x55, 0x21, 0xc3, 0x42, 0x51, 0x95, 0x18, 0x43, 0x7a, 0x9b, 0x55, - 0xe6, 0xa2, 0x3c, 0x72, 0x86, 0x52, 0xd2, 0x1b, 0x96, 0x8b, 0xaf, 0x4d, 0x29, 0x80, 0xbd, 0x27, - 0xa4, 0xc1, 0x09, 0x7a, 0xb1, 0xd7, 0xa1, 0x1a, 0x36, 0xbc, 0xf3, 0xb3, 0x14, 0xf0, 0xd1, 0x51, - 0x80, 0x37, 0x28, 0xd3, 0x8d, 0xa0, 0x1d, 0xbe, 0x36, 0xa5, 0xcc, 0xde, 0x1a, 0x2c, 0x26, 0x2a, - 0xb6, 0x67, 0x98, 0x5a, 0xdb, 0x78, 0x03, 0xb3, 0x25, 0x94, 0x5e, 0x69, 0x79, 0x84, 0x8a, 0x5d, - 0xe5, 0xd4, 0x74, 0x61, 0x25, 0x2a, 0xb6, 0x17, 0x2c, 0x28, 0x27, 0xf9, 0x99, 0x51, 0xef, 0x8a, - 0xb6, 0xa4, 0x94, 0x62, 0xd7, 0xb2, 0x5d, 0x8f, 0xa7, 0x40, 0xca, 0xc8, 0x67, 0x21, 0x13, 0x30, - 0x4c, 0x68, 0x1e, 0x92, 0xfc, 0x54, 0x8d, 0x38, 0x7d, 0xca, 0x1f, 0xe5, 0x3c, 0x64, 0x83, 0xc6, - 0x48, 0xfe, 0x78, 0xc4, 0xe3, 0xa4, 0x77, 0x53, 0xcc, 0x87, 0x33, 0xd2, 0x69, 0xdf, 0x53, 0x79, - 0x50, 0x2c, 0x6d, 0xa2, 0x9e, 0x6d, 0xbf, 0x66, 0x69, 0x21, 0x5f, 0x59, 0xd1, 0x22, 0x64, 0xba, - 0x17, 0xbb, 0x1e, 0x49, 0x8c, 0x92, 0x40, 0xf7, 0x62, 0x57, 0x10, 0x3c, 0x00, 0x59, 0xd2, 0x6f, - 0x35, 0xe8, 0x2f, 0xa5, 0x95, 0x0c, 0x29, 0xe3, 0x24, 0xf2, 0xbf, 0x89, 0x82, 0xd4, 0x6f, 0xc0, - 0xbc, 0x54, 0x75, 0xe4, 0xd8, 0xa9, 0xea, 0xd3, 0xfd, 0x49, 0x72, 0x3f, 0x2f, 0xbe, 0x0e, 0x92, - 0x9f, 0xde, 0x65, 0x4b, 0xcd, 0x68, 0xff, 0xaf, 0xcf, 0x51, 0x55, 0x0a, 0x7a, 0x9f, 0xe7, 0x7a, - 0x35, 0xb4, 0x59, 0x29, 0xfe, 0x74, 0x44, 0xff, 0x80, 0x7b, 0x4e, 0xcc, 0x4e, 0xb7, 0xa9, 0xb9, - 0x58, 0xe4, 0xc7, 0x02, 0xfb, 0x96, 0x0f, 0x43, 0x41, 0xeb, 0x76, 0x55, 0xc7, 0xd5, 0x5c, 0xcc, - 0x7d, 0x0d, 0x96, 0x79, 0xc8, 0x69, 0xdd, 0x6e, 0x9d, 0x94, 0x32, 0x5f, 0xe3, 0x21, 0xc8, 0x13, - 0x9b, 0x6e, 0x68, 0x6d, 0xe1, 0x2a, 0x24, 0x98, 0x4b, 0xc2, 0x4b, 0x99, 0x77, 0x20, 0x37, 0xbd, - 0x11, 0xa7, 0xf6, 0xdc, 0x8b, 0xa9, 0x22, 0x81, 0x98, 0x0a, 0xf1, 0x3b, 0x43, 0x98, 0x7c, 0xc4, - 0x3d, 0x2b, 0xc3, 0x37, 0x0d, 0xe6, 0x68, 0xfc, 0x75, 0x8b, 0x25, 0x4b, 0x52, 0x0a, 0x7b, 0x90, - 0x15, 0xc8, 0x87, 0x6d, 0x3f, 0xca, 0x43, 0xd4, 0x3d, 0xe0, 0x6f, 0x89, 0xba, 0x07, 0xc4, 0xd3, - 0xf5, 0x6e, 0xda, 0xcd, 0x0f, 0x59, 0xed, 0x38, 0x9f, 0x9f, 0xeb, 0x90, 0x0b, 0x90, 0x0b, 0xad, - 0x09, 0xf2, 0x49, 0x98, 0x1b, 0x66, 0xe2, 0xe5, 0x7d, 0xaf, 0x3c, 0x64, 0xaa, 0xd1, 0x25, 0x48, - 0x79, 0x36, 0x7e, 0x48, 0x74, 0x4c, 0x5f, 0x2b, 0x88, 0x15, 0x8f, 0x34, 0x94, 0xce, 0x8f, 0x86, - 0xd2, 0xf9, 0xf2, 0x37, 0xc0, 0xfc, 0x28, 0xfb, 0xdd, 0x97, 0xe4, 0x8b, 0x7b, 0x02, 0x3b, 0x09, - 0x09, 0x7e, 0xa5, 0x65, 0x94, 0x6e, 0x60, 0xf1, 0x27, 0x22, 0x48, 0x66, 0xcb, 0x63, 0x6c, 0x5f, - 0x8b, 0x3e, 0xc8, 0x2a, 0x9c, 0x1e, 0x69, 0xc3, 0x47, 0x6f, 0x85, 0x31, 0x20, 0xbe, 0x15, 0xa6, - 0x8b, 0xe6, 0x38, 0xb4, 0xaf, 0xe2, 0x20, 0x0b, 0x7b, 0x92, 0x3f, 0x11, 0x83, 0x93, 0xc3, 0x2d, - 0x39, 0x5a, 0x82, 0x2c, 0xf1, 0x5b, 0xdd, 0xb0, 0x8b, 0x0b, 0x1d, 0xed, 0xa0, 0xc1, 0xfd, 0x5b, - 0xbe, 0x95, 0x10, 0xf5, 0xb6, 0x12, 0xd0, 0x0e, 0xcc, 0xb4, 0x2d, 0x5d, 0x6b, 0xab, 0x81, 0xad, - 0x1c, 0x3e, 0x89, 0x1e, 0x1c, 0x10, 0x76, 0x38, 0x65, 0x48, 0x0c, 0x0e, 0xd7, 0xff, 0x02, 0xc5, - 0x58, 0xf7, 0x76, 0x7d, 0xd0, 0x2a, 0x64, 0x3a, 0x86, 0xb3, 0x8b, 0xf7, 0xb5, 0x5b, 0x86, 0x65, - 0xf3, 0xd9, 0x34, 0xa8, 0x34, 0x1b, 0x3e, 0x8d, 0xd8, 0x61, 0x0a, 0xb0, 0x05, 0x86, 0x64, 0x7a, - 0xe8, 0xc6, 0x57, 0xe2, 0xd8, 0xd6, 0x64, 0xd4, 0x1e, 0x52, 0x72, 0xe4, 0x1e, 0xd2, 0xb0, 0x0d, - 0x9b, 0xd4, 0xf0, 0x0d, 0x9b, 0x8f, 0x05, 0x87, 0x26, 0xbc, 0xf6, 0x0d, 0xec, 0xe1, 0xa0, 0x3a, - 0xcc, 0x71, 0xfe, 0x66, 0x48, 0xf6, 0x43, 0x8e, 0x3a, 0xb0, 0xf9, 0xd5, 0x2f, 0x73, 0x24, 0xd8, - 0x47, 0x8b, 0x3d, 0x76, 0x6f, 0x62, 0x17, 0x9b, 0xa8, 0xf1, 0xc0, 0x26, 0xea, 0xff, 0x61, 0x43, - 0xf1, 0x02, 0xcc, 0x0c, 0xf8, 0x11, 0x43, 0x37, 0x87, 0x47, 0x24, 0x64, 0xe5, 0x4f, 0x46, 0xa0, - 0x38, 0xda, 0x71, 0x18, 0x0a, 0x75, 0xac, 0xdc, 0xf7, 0x28, 0xf3, 0xfc, 0x10, 0xe4, 0xfb, 0xdc, - 0x1a, 0x36, 0x0a, 0xb9, 0x50, 0x00, 0x29, 0x7f, 0x73, 0xcc, 0xb3, 0x99, 0x21, 0xdf, 0x63, 0x88, - 0xa2, 0xbd, 0x04, 0xb3, 0x4d, 0xac, 0x1b, 0xcd, 0x7b, 0xd5, 0xb3, 0x19, 0xce, 0xfd, 0xff, 0xd4, - 0x6c, 0x50, 0xcd, 0xbe, 0x07, 0x20, 0xa5, 0x60, 0xa7, 0x4b, 0x5c, 0x09, 0x54, 0x86, 0x34, 0x3e, - 0xd0, 0x71, 0xd7, 0xf5, 0xcf, 0x03, 0x0c, 0xf3, 0x6e, 0x19, 0x75, 0x55, 0x50, 0x92, 0xd8, 0xce, - 0x63, 0x43, 0x4f, 0xf1, 0xf0, 0x75, 0x74, 0x24, 0xca, 0xd9, 0x83, 0xf1, 0xeb, 0x65, 0x11, 0xbf, - 0xc6, 0x46, 0x86, 0x66, 0x8c, 0xab, 0x2f, 0x80, 0x7d, 0x8a, 0x07, 0xb0, 0xf1, 0x31, 0x2f, 0x0b, - 0x45, 0xb0, 0x95, 0x50, 0x04, 0x9b, 0x18, 0xd3, 0xcd, 0x11, 0x21, 0xec, 0x65, 0x11, 0xc2, 0x26, - 0xc7, 0xb4, 0xb8, 0x2f, 0x86, 0x7d, 0x3e, 0x10, 0xc3, 0xa6, 0x07, 0x13, 0x85, 0x21, 0xd6, 0x21, - 0x41, 0xec, 0x73, 0x5e, 0x10, 0x9b, 0x1d, 0x19, 0x00, 0x73, 0xe6, 0xfe, 0x28, 0x76, 0x6b, 0x20, - 0x8a, 0xcd, 0xf1, 0xbf, 0xed, 0x33, 0x0a, 0x62, 0x4c, 0x18, 0xbb, 0x35, 0x10, 0xc6, 0xe6, 0xc7, - 0x00, 0x8e, 0x89, 0x63, 0xbf, 0x76, 0x78, 0x1c, 0x3b, 0x3a, 0xd2, 0xe4, 0xcd, 0x9c, 0x2c, 0x90, - 0x55, 0x47, 0x04, 0xb2, 0xd2, 0xc8, 0xa0, 0x8b, 0xc1, 0x4f, 0x1c, 0xc9, 0xee, 0x0c, 0x89, 0x64, - 0x59, 0xcc, 0x79, 0x6e, 0x24, 0xf8, 0x04, 0xa1, 0xec, 0xce, 0x90, 0x50, 0x16, 0x8d, 0x85, 0x1d, - 0x1b, 0xcb, 0x5e, 0x0d, 0xc7, 0xb2, 0xb3, 0x23, 0x1c, 0x26, 0x7f, 0xb6, 0x8f, 0x08, 0x66, 0x77, - 0x47, 0x05, 0xb3, 0x2c, 0xe0, 0x7c, 0x6c, 0x24, 0xe2, 0x31, 0xa2, 0xd9, 0xad, 0x81, 0x68, 0xf6, - 0xc4, 0x18, 0x4d, 0x9b, 0x3c, 0x9c, 0x65, 0x77, 0x8d, 0xb3, 0x5b, 0xc6, 0x41, 0xca, 0x5c, 0x8f, - 0xa7, 0x32, 0x52, 0x56, 0x7e, 0x84, 0xac, 0xbe, 0x7d, 0x76, 0x8e, 0xb8, 0xb9, 0xd8, 0xb6, 0x2d, - 0x5b, 0x1c, 0xee, 0xa7, 0x0f, 0xf2, 0x39, 0x12, 0xde, 0xf8, 0x36, 0xed, 0x88, 0xd0, 0x97, 0x86, - 0x13, 0x01, 0x3b, 0x26, 0xff, 0x6c, 0xc4, 0xe7, 0xa5, 0xc1, 0x6f, 0x30, 0x34, 0x4a, 0xf3, 0xd0, - 0x28, 0x10, 0x10, 0x47, 0xc3, 0x01, 0xf1, 0x22, 0x64, 0x48, 0x98, 0xd0, 0x17, 0xeb, 0x6a, 0x5d, - 0x2f, 0xd6, 0x15, 0x67, 0x7f, 0x58, 0xd8, 0xcc, 0x97, 0x25, 0xb6, 0x11, 0x56, 0xf0, 0xce, 0x41, - 0xb1, 0x28, 0x0d, 0x3d, 0x0e, 0xb3, 0x01, 0x5a, 0x2f, 0xfc, 0x60, 0x81, 0x9f, 0xe4, 0x51, 0x97, - 0x78, 0x1c, 0xf2, 0xcf, 0x23, 0xbe, 0x84, 0xfc, 0x20, 0x79, 0x58, 0x3c, 0x1b, 0x79, 0x97, 0xe2, - 0xd9, 0xe8, 0x3d, 0xc7, 0xb3, 0xc1, 0x70, 0x2a, 0x16, 0x0e, 0xa7, 0xfe, 0x7b, 0xc4, 0x1f, 0x13, - 0x2f, 0x3a, 0xd5, 0xad, 0x26, 0xe6, 0x01, 0x0e, 0xfd, 0x4d, 0x5c, 0x92, 0xb6, 0xd5, 0xe2, 0x61, - 0x0c, 0xf9, 0x49, 0xa8, 0xbc, 0x85, 0x27, 0xcd, 0xd7, 0x15, 0x2f, 0x36, 0x9a, 0x0e, 0x7e, 0x82, - 0xc0, 0xcf, 0xe5, 0x27, 0xfc, 0x73, 0xf9, 0xde, 0xf7, 0xb7, 0xc9, 0xc0, 0xf7, 0xb7, 0xe8, 0x59, - 0x48, 0xd3, 0x3c, 0xb5, 0x6a, 0x75, 0xc5, 0x1f, 0xc6, 0x3a, 0x33, 0xfa, 0x4c, 0xbe, 0x43, 0x4f, - 0x0b, 0xb3, 0x73, 0xfc, 0xbe, 0xc7, 0x91, 0x0e, 0x79, 0x1c, 0xf7, 0x41, 0x9a, 0xb4, 0x9e, 0xfd, - 0x81, 0x07, 0xe0, 0x1f, 0x6f, 0x8b, 0x02, 0xf9, 0xc7, 0xa3, 0x50, 0xe8, 0x5b, 0x68, 0x86, 0xf6, - 0x7d, 0xd8, 0x0e, 0xe8, 0x64, 0xf2, 0x58, 0x00, 0x68, 0x69, 0x8e, 0x7a, 0x5b, 0x33, 0x5d, 0xdc, - 0xe4, 0x42, 0x09, 0x94, 0xa0, 0x22, 0xa4, 0xc8, 0x53, 0xcf, 0xc1, 0x4d, 0x9e, 0x38, 0xf0, 0x9e, - 0xd1, 0x35, 0x48, 0xe0, 0x5b, 0xf4, 0x82, 0x53, 0x76, 0x4d, 0xf0, 0xc9, 0xc1, 0x48, 0x8e, 0x54, - 0x97, 0xe7, 0xc9, 0x60, 0x7f, 0xe9, 0xad, 0x45, 0x89, 0x51, 0x3f, 0xe6, 0x7d, 0x33, 0xa5, 0x70, - 0xfe, 0xb0, 0x14, 0x52, 0x7d, 0x52, 0xa0, 0x29, 0xac, 0xac, 0x88, 0x4c, 0x89, 0x4c, 0xd9, 0xf1, - 0x64, 0x25, 0xd7, 0xc1, 0x9d, 0xae, 0x65, 0xb5, 0x55, 0x36, 0xc7, 0x4b, 0x90, 0x0f, 0xaf, 0xab, - 0xec, 0x8f, 0x2f, 0xb9, 0x9a, 0x61, 0xaa, 0x21, 0x27, 0x38, 0xcb, 0x0a, 0xd9, 0x9c, 0xba, 0x1e, - 0x4f, 0x45, 0xa4, 0xe8, 0xf5, 0x78, 0x2a, 0x2a, 0xc5, 0xe4, 0x6d, 0x38, 0x31, 0x74, 0x5d, 0x45, - 0xcf, 0x40, 0xda, 0x5f, 0x92, 0xd9, 0x09, 0xf3, 0x23, 0x92, 0x04, 0x3e, 0xad, 0xfc, 0x8b, 0x11, - 0x1f, 0x32, 0x9c, 0x76, 0xa8, 0x42, 0x82, 0x1d, 0xf7, 0xe3, 0x47, 0x3b, 0x1e, 0x9f, 0x6c, 0x45, - 0x5e, 0x66, 0x67, 0x01, 0x15, 0xce, 0x2c, 0x7f, 0x3d, 0x24, 0x58, 0x09, 0xca, 0x40, 0xd2, 0xbf, - 0x4a, 0x19, 0x20, 0x51, 0xaa, 0x54, 0xaa, 0xdb, 0xe2, 0x5e, 0xd4, 0xf2, 0x96, 0xd2, 0x90, 0xa2, - 0xa4, 0x58, 0xa9, 0x5e, 0xaf, 0x56, 0x1a, 0x52, 0x0c, 0xcd, 0x40, 0x8e, 0xfd, 0x56, 0xaf, 0x6e, - 0x29, 0x1b, 0xa5, 0x86, 0x14, 0x0f, 0x14, 0xd5, 0xab, 0x9b, 0xab, 0x55, 0x45, 0x9a, 0x96, 0x9f, - 0x84, 0xd3, 0x23, 0xd7, 0x70, 0x3f, 0xa7, 0x10, 0x09, 0xe4, 0x14, 0xe4, 0x4f, 0x44, 0x49, 0x50, - 0x33, 0x6a, 0x61, 0x46, 0xd7, 0xfb, 0x3a, 0x7e, 0xf1, 0x18, 0xab, 0x7a, 0x5f, 0xef, 0x49, 0x1c, - 0x63, 0xe3, 0x3d, 0xec, 0xea, 0xfb, 0xcc, 0x51, 0x60, 0x16, 0x28, 0xa7, 0xe4, 0x78, 0x29, 0x65, - 0x72, 0x18, 0xd9, 0xeb, 0x58, 0x77, 0x55, 0xa6, 0x44, 0x0e, 0xff, 0x5b, 0xb1, 0x39, 0x56, 0x5a, - 0x67, 0x85, 0xf2, 0x37, 0x1c, 0x4b, 0x96, 0x69, 0x98, 0x56, 0xaa, 0x0d, 0xe5, 0x55, 0x29, 0x86, - 0x10, 0xe4, 0xe9, 0x4f, 0xb5, 0xbe, 0x59, 0xda, 0xae, 0x5f, 0xdb, 0x22, 0xb2, 0x9c, 0x85, 0x82, - 0x90, 0xa5, 0x28, 0x9c, 0x96, 0x1f, 0x85, 0x53, 0x23, 0xbc, 0x8a, 0x21, 0xe7, 0x2f, 0x3f, 0x15, - 0x09, 0x52, 0x87, 0x3d, 0x83, 0x2d, 0x48, 0x38, 0xae, 0xe6, 0xf6, 0x1c, 0x2e, 0xc4, 0x67, 0x26, - 0x75, 0x33, 0x96, 0xc5, 0x8f, 0x3a, 0x65, 0x57, 0x38, 0x8c, 0x7c, 0x09, 0xf2, 0xe1, 0x9a, 0xd1, - 0x32, 0xf0, 0x95, 0x28, 0x2a, 0x5f, 0x01, 0x34, 0xe8, 0x7d, 0x0c, 0x09, 0x2f, 0x23, 0xc3, 0xc2, - 0xcb, 0x1f, 0x89, 0xc0, 0x99, 0x23, 0x3c, 0x0d, 0xf4, 0x52, 0x5f, 0x27, 0x9f, 0x3b, 0x8e, 0x9f, - 0xb2, 0xcc, 0xca, 0xfa, 0xba, 0xf9, 0x14, 0x64, 0x83, 0xe5, 0x93, 0x75, 0xf2, 0x4b, 0x51, 0x7f, - 0x12, 0x87, 0xe3, 0x60, 0xdf, 0x04, 0x46, 0xfe, 0x82, 0x26, 0xf0, 0x83, 0x00, 0xee, 0x81, 0x38, - 0x00, 0xcc, 0xd7, 0xd1, 0xfb, 0x87, 0xa4, 0xc6, 0xb0, 0xde, 0x38, 0xe0, 0x93, 0x20, 0xed, 0xf2, - 0x5f, 0x0e, 0xaa, 0x07, 0x93, 0x02, 0x3d, 0xba, 0xc6, 0x3a, 0xde, 0x5f, 0x8a, 0x9d, 0x6c, 0x31, - 0xf6, 0x93, 0x07, 0xac, 0xd8, 0x41, 0xaf, 0xc2, 0xa9, 0x3e, 0x47, 0xc1, 0x83, 0x8e, 0x4f, 0xea, - 0x2f, 0x9c, 0x08, 0xfb, 0x0b, 0x02, 0x3a, 0xb8, 0xda, 0x4f, 0x87, 0x57, 0xfb, 0x57, 0x01, 0xfc, - 0xe4, 0x80, 0x7f, 0x62, 0x2d, 0x12, 0x3c, 0xb1, 0x76, 0x09, 0xa6, 0x89, 0x26, 0x09, 0x39, 0x0d, - 0x9a, 0x62, 0xa2, 0x09, 0x81, 0xe4, 0x02, 0xa3, 0x96, 0x0d, 0x40, 0x83, 0xb9, 0xc5, 0x11, 0xaf, - 0x78, 0x3e, 0xfc, 0x8a, 0x07, 0x46, 0x66, 0x29, 0x87, 0xbf, 0xea, 0x0d, 0x98, 0xa6, 0x23, 0x3f, - 0xf4, 0x33, 0xc0, 0xaf, 0x03, 0xd0, 0x5c, 0xd7, 0x36, 0x76, 0x7b, 0xfe, 0x0b, 0x16, 0x87, 0x6b, - 0x4e, 0x49, 0xd0, 0x95, 0xef, 0xe3, 0x2a, 0x34, 0xe7, 0xb3, 0x06, 0xd4, 0x28, 0x00, 0x28, 0x6f, - 0x42, 0x3e, 0xcc, 0x3b, 0xfc, 0xb3, 0x46, 0xff, 0x7e, 0x91, 0xb4, 0xf0, 0x6f, 0x3c, 0xef, 0x88, - 0xdf, 0xf9, 0x43, 0x1f, 0xe4, 0x3f, 0x8f, 0x40, 0x36, 0xa8, 0x78, 0xef, 0xb2, 0x0b, 0x72, 0xff, - 0x10, 0x17, 0x24, 0xdd, 0xd2, 0x9c, 0x97, 0x99, 0x07, 0x72, 0x7a, 0xc0, 0x03, 0x49, 0xb6, 0x34, - 0x67, 0xe7, 0x7d, 0x74, 0x40, 0xe4, 0x6f, 0x89, 0x40, 0xca, 0xeb, 0xfc, 0x11, 0xa7, 0x74, 0xfd, - 0x8f, 0x5b, 0xbd, 0xac, 0x3b, 0xdb, 0xdf, 0x88, 0x79, 0xfb, 0x1b, 0x57, 0xbc, 0xc5, 0x6f, 0x54, - 0x3a, 0x24, 0x28, 0x69, 0x71, 0x52, 0x8e, 0xaf, 0xf5, 0x57, 0x26, 0xfb, 0x86, 0x6c, 0x0e, 0xa6, - 0x83, 0xdf, 0x7f, 0xb1, 0x07, 0xb9, 0x19, 0x38, 0x1a, 0xc3, 0xa6, 0x61, 0xf0, 0x63, 0xb3, 0xc8, - 0xb1, 0x3f, 0x36, 0xf3, 0xde, 0x12, 0x0d, 0xbe, 0xe5, 0xbb, 0x23, 0x90, 0x12, 0x33, 0x02, 0x7d, - 0x28, 0x78, 0x64, 0x4a, 0xec, 0xc9, 0x8d, 0xb4, 0x46, 0x1c, 0x3f, 0x70, 0x62, 0x6a, 0xe0, 0xa4, - 0x70, 0xec, 0xb8, 0x27, 0x85, 0xb9, 0x5f, 0xf7, 0x27, 0x11, 0x90, 0xfa, 0xe7, 0xeb, 0x5f, 0xb8, - 0x75, 0x83, 0x8b, 0x5c, 0x6c, 0xc8, 0x22, 0x37, 0xea, 0xf8, 0x6f, 0x7c, 0xd4, 0xf1, 0xdf, 0xc1, - 0x5e, 0x4f, 0xdf, 0x63, 0xaf, 0x3f, 0x1a, 0x85, 0x4c, 0x20, 0x39, 0x8a, 0x9e, 0x0e, 0x1d, 0x25, - 0x5e, 0x3a, 0x2a, 0x91, 0x1a, 0x38, 0x4b, 0x1c, 0x12, 0x53, 0xf4, 0xf8, 0x62, 0x7a, 0xf7, 0x3f, - 0x2b, 0x1a, 0xfe, 0xe5, 0xe5, 0xf4, 0x88, 0x2f, 0x2f, 0xbf, 0x29, 0x02, 0x29, 0xcf, 0xe9, 0x3e, - 0xee, 0xee, 0xdb, 0x49, 0x48, 0x70, 0xbf, 0x92, 0x6d, 0xbf, 0xf1, 0xa7, 0xa1, 0x49, 0xe5, 0x22, - 0xa4, 0xc4, 0x1f, 0xed, 0xe3, 0x6b, 0x9a, 0xf7, 0x7c, 0xfe, 0x39, 0xc8, 0x04, 0x76, 0x2e, 0x89, - 0x61, 0xdc, 0xac, 0xbe, 0x2c, 0x4d, 0x15, 0x93, 0x77, 0xee, 0x2e, 0xc5, 0x36, 0xf1, 0x6d, 0x32, - 0x9b, 0x95, 0x6a, 0xe5, 0x5a, 0xb5, 0xf2, 0xa2, 0x14, 0x29, 0x66, 0xee, 0xdc, 0x5d, 0x4a, 0x2a, - 0x98, 0xe6, 0x13, 0xcf, 0xbf, 0x08, 0x85, 0xbe, 0x81, 0x09, 0x3b, 0x2d, 0x08, 0xf2, 0xab, 0x3b, - 0xdb, 0xeb, 0xb5, 0x4a, 0xa9, 0x51, 0x55, 0xd9, 0x81, 0x53, 0x74, 0x0a, 0x66, 0xd7, 0x6b, 0x6b, - 0xd7, 0x1a, 0x6a, 0x65, 0xbd, 0x56, 0xdd, 0x6c, 0xa8, 0xa5, 0x46, 0xa3, 0x54, 0x79, 0x51, 0x8a, - 0x5e, 0xbc, 0x9b, 0x81, 0x78, 0xa9, 0x5c, 0xa9, 0xa1, 0x0a, 0xc4, 0x69, 0x22, 0xe4, 0xc8, 0xa3, - 0x4b, 0xc5, 0xa3, 0x33, 0xc3, 0xe8, 0x2a, 0x4c, 0xd3, 0x1c, 0x09, 0x3a, 0xfa, 0x2c, 0x53, 0x71, - 0x4c, 0xaa, 0x98, 0x34, 0x86, 0xce, 0xc8, 0x23, 0x0f, 0x37, 0x15, 0x8f, 0xce, 0x1c, 0xa3, 0x75, - 0x48, 0x8a, 0x10, 0x79, 0xdc, 0x89, 0xa3, 0xe2, 0xd8, 0x74, 0x2e, 0xe9, 0x1a, 0x4b, 0x35, 0x1c, - 0x7d, 0xee, 0xa9, 0x38, 0x26, 0xa7, 0x8c, 0x6a, 0xde, 0x87, 0x38, 0x63, 0x8e, 0x32, 0x15, 0xc7, - 0x65, 0x89, 0x91, 0x02, 0x69, 0x3f, 0x89, 0x33, 0xfe, 0x34, 0x57, 0x71, 0x82, 0x74, 0x39, 0xfa, - 0x7a, 0xc8, 0x85, 0x03, 0xdd, 0xc9, 0x8e, 0x4b, 0x15, 0x27, 0xcc, 0x47, 0x13, 0xfc, 0x70, 0xd4, - 0x3b, 0xd9, 0xf1, 0xa9, 0xe2, 0x84, 0xe9, 0x69, 0xf4, 0x3a, 0xcc, 0x0c, 0x46, 0xa5, 0x93, 0x9f, - 0xa6, 0x2a, 0x1e, 0x23, 0x61, 0x8d, 0x3a, 0x80, 0x86, 0x44, 0xb3, 0xc7, 0x38, 0x5c, 0x55, 0x3c, - 0x4e, 0xfe, 0x1a, 0x35, 0xa1, 0xd0, 0x1f, 0x22, 0x4e, 0x7a, 0xd8, 0xaa, 0x38, 0x71, 0x2e, 0x9b, - 0xbd, 0x25, 0x1c, 0x5a, 0x4e, 0x7a, 0xf8, 0xaa, 0x38, 0x71, 0x6a, 0x1b, 0xed, 0x00, 0x04, 0xa2, - 0xc3, 0x09, 0x0e, 0x63, 0x15, 0x27, 0x49, 0x72, 0xa3, 0x2e, 0xcc, 0x0e, 0x0b, 0x1b, 0x8f, 0x73, - 0x36, 0xab, 0x78, 0xac, 0xdc, 0x37, 0xd1, 0xe7, 0x70, 0x00, 0x38, 0xd9, 0x59, 0xad, 0xe2, 0x84, - 0x49, 0xf0, 0x72, 0x69, 0xe4, 0x01, 0xdd, 0xb3, 0x47, 0x1e, 0xd0, 0xf5, 0x8f, 0xdc, 0x7a, 0x87, - 0x72, 0x7f, 0xe7, 0x09, 0xf8, 0x00, 0xbf, 0xfa, 0xc5, 0x71, 0xb5, 0x9b, 0x86, 0xd9, 0xf2, 0xee, - 0xf2, 0xe1, 0xcf, 0xfc, 0x74, 0xee, 0x49, 0x7e, 0xbd, 0x8c, 0x28, 0x1d, 0x73, 0xa3, 0xcf, 0xc8, - 0x6b, 0x0e, 0xc7, 0x1d, 0xe4, 0x1f, 0x7f, 0xee, 0xf6, 0x88, 0xdb, 0x82, 0xc6, 0xdc, 0x49, 0x34, - 0xe4, 0x36, 0xa1, 0xe2, 0x91, 0x1f, 0xc7, 0x17, 0x8f, 0x3a, 0xb0, 0x4c, 0xbc, 0xd8, 0xfc, 0x35, - 0xc3, 0x71, 0x2d, 0xdb, 0xd0, 0xb5, 0x36, 0x5d, 0x5e, 0xae, 0x4c, 0xfa, 0x39, 0x51, 0x39, 0x4d, - 0xdc, 0x15, 0x7e, 0x05, 0x11, 0xff, 0xc4, 0x65, 0x15, 0x12, 0xb7, 0xb4, 0x36, 0xfb, 0x98, 0x27, - 0x78, 0xdb, 0x58, 0xbf, 0xcc, 0x03, 0x7e, 0x54, 0x10, 0x85, 0xf1, 0xca, 0x9f, 0xa3, 0x1f, 0x42, - 0x74, 0x3a, 0x86, 0x43, 0x74, 0x51, 0xa1, 0x81, 0xf4, 0x0e, 0xc4, 0x6d, 0xcd, 0xe5, 0xe1, 0x65, - 0xb9, 0xc4, 0x2f, 0x0e, 0x7a, 0x78, 0xfc, 0xf5, 0x3f, 0xcb, 0x03, 0x77, 0x0b, 0xb1, 0x97, 0x51, - 0x38, 0xf4, 0xb5, 0x90, 0xea, 0x68, 0x07, 0x2a, 0x85, 0x8e, 0xbe, 0x5b, 0xd0, 0xc9, 0x8e, 0x76, - 0x40, 0x5a, 0x8d, 0x0c, 0x28, 0x10, 0x74, 0x7d, 0x5f, 0x33, 0x5b, 0x98, 0xbd, 0x24, 0xf6, 0x6e, - 0xbd, 0x24, 0xd7, 0xd1, 0x0e, 0x2a, 0x14, 0x98, 0xbc, 0x8a, 0x5f, 0xd1, 0xf4, 0xcb, 0x11, 0x9e, - 0x54, 0xa0, 0x92, 0x43, 0x1a, 0x48, 0xba, 0xf7, 0x44, 0xdf, 0x2f, 0x76, 0x40, 0xce, 0x8e, 0x1a, - 0x98, 0x3e, 0xb9, 0x97, 0x73, 0xa4, 0xa5, 0x9f, 0x7f, 0x6b, 0x31, 0xc2, 0xde, 0x5a, 0xd0, 0xfb, - 0xc6, 0xe5, 0x3a, 0x64, 0x58, 0xae, 0x44, 0xa5, 0x4e, 0x6e, 0x74, 0xac, 0x93, 0x9b, 0x13, 0x4e, - 0x2e, 0x03, 0x04, 0xc6, 0x4d, 0xea, 0x79, 0x1f, 0x3e, 0x13, 0x81, 0xcc, 0x6a, 0xe0, 0x72, 0xc1, - 0x79, 0x48, 0x76, 0x2c, 0xd3, 0xb8, 0x89, 0x6d, 0x6f, 0x0b, 0x8b, 0x3d, 0x12, 0x47, 0x94, 0xfd, - 0x8d, 0x3a, 0xf7, 0x50, 0xdc, 0x9b, 0x23, 0x9e, 0x09, 0xd7, 0x6d, 0xbc, 0xeb, 0x18, 0x42, 0xe4, - 0x8a, 0x78, 0x44, 0x8f, 0x80, 0xe4, 0x60, 0xbd, 0x67, 0x1b, 0xee, 0xa1, 0xaa, 0x5b, 0xa6, 0xab, - 0xe9, 0x2e, 0x0f, 0xd3, 0x0b, 0xa2, 0xbc, 0xc2, 0x8a, 0x09, 0x48, 0x13, 0xbb, 0x9a, 0xd1, 0x66, - 0x67, 0x0e, 0xd3, 0x8a, 0x78, 0xe4, 0x4d, 0xfd, 0x5c, 0x32, 0x18, 0xa8, 0x56, 0x40, 0xb2, 0xba, - 0xd8, 0x0e, 0x9d, 0x57, 0x61, 0xea, 0x3a, 0xff, 0xeb, 0x9f, 0x7d, 0x7c, 0x8e, 0x0b, 0x9c, 0x9f, - 0x75, 0x60, 0x77, 0xe9, 0x2b, 0x05, 0xc1, 0x21, 0x0e, 0xb2, 0xbc, 0x1a, 0xda, 0xb4, 0xea, 0xed, - 0xfa, 0x17, 0xa4, 0xcc, 0x0d, 0x08, 0xb5, 0x64, 0x1e, 0x96, 0xe7, 0x7f, 0xcd, 0x87, 0xf6, 0x03, - 0xd9, 0x17, 0xf1, 0x61, 0x70, 0x07, 0x8b, 0xc2, 0x10, 0x1f, 0xff, 0x75, 0xcd, 0x68, 0x8b, 0x3f, - 0xe7, 0xa9, 0xf0, 0x27, 0xb4, 0xe2, 0x65, 0x1f, 0xe3, 0x34, 0x60, 0x92, 0x47, 0xe9, 0x46, 0xd9, - 0x32, 0x9b, 0xe1, 0x34, 0x23, 0x6a, 0x40, 0xc2, 0xb5, 0x6e, 0x62, 0x93, 0x0b, 0xa8, 0xfc, 0xc1, - 0x63, 0x28, 0xf6, 0xe0, 0x6d, 0x61, 0x1c, 0x0b, 0xb5, 0x40, 0x6a, 0xe2, 0x36, 0x6e, 0xb1, 0x4f, - 0x03, 0xf7, 0x35, 0x1b, 0xb3, 0x0f, 0xd3, 0x8f, 0x87, 0x3f, 0x78, 0xa9, 0x58, 0xc1, 0x43, 0xad, - 0x53, 0x50, 0xb4, 0x1d, 0xbe, 0xda, 0x32, 0xc9, 0xf7, 0x9d, 0x47, 0xf4, 0x3f, 0xa0, 0x95, 0x41, - 0xb3, 0x15, 0xba, 0x0a, 0xf3, 0x11, 0x90, 0x7a, 0xe6, 0xae, 0x65, 0xd2, 0xbf, 0x90, 0xc7, 0x43, - 0xb0, 0x14, 0xdb, 0xe4, 0xf4, 0xca, 0xf9, 0x26, 0xe7, 0x36, 0xe4, 0x7d, 0x52, 0x3a, 0x7b, 0xd2, - 0xc7, 0x9d, 0x3d, 0x39, 0x0f, 0x80, 0x90, 0xa0, 0x0d, 0x00, 0x7f, 0x7e, 0xd2, 0x5d, 0xb6, 0xcc, - 0xe8, 0xd1, 0xf4, 0x67, 0x7a, 0xb0, 0x33, 0x01, 0x00, 0xd4, 0x86, 0xd9, 0x8e, 0x61, 0xaa, 0x0e, - 0x6e, 0xef, 0xa9, 0x5c, 0x72, 0x04, 0x37, 0xf3, 0x2e, 0x8c, 0xf4, 0x4c, 0xc7, 0x30, 0xeb, 0xb8, - 0xbd, 0xb7, 0xea, 0xc1, 0xa2, 0x0f, 0xc2, 0x19, 0x5f, 0x1c, 0x96, 0xa9, 0xee, 0x5b, 0xed, 0xa6, - 0x6a, 0xe3, 0x3d, 0x55, 0xa7, 0x97, 0xd5, 0x65, 0xa9, 0x10, 0x4f, 0x79, 0x24, 0x5b, 0xe6, 0x35, - 0xab, 0xdd, 0x54, 0xf0, 0x5e, 0x85, 0x54, 0xa3, 0x07, 0xc1, 0x97, 0x85, 0x6a, 0x34, 0x9d, 0xf9, - 0xdc, 0x52, 0xec, 0x5c, 0x5c, 0xc9, 0x7a, 0x85, 0xb5, 0xa6, 0xb3, 0x92, 0xfa, 0xd8, 0x9b, 0x8b, - 0x53, 0x5f, 0x7c, 0x73, 0x71, 0x4a, 0xbe, 0x4a, 0xaf, 0x56, 0xe2, 0x93, 0x0e, 0x3b, 0xe8, 0x32, - 0xa4, 0x35, 0xf1, 0xc0, 0x3e, 0x9c, 0x3a, 0x62, 0xd2, 0xfa, 0xa4, 0xf2, 0x9b, 0x11, 0x48, 0xac, - 0xde, 0xd8, 0xd6, 0x0c, 0x1b, 0x55, 0x61, 0xc6, 0x57, 0xda, 0x49, 0xe7, 0xbf, 0xaf, 0xe7, 0xc2, - 0x00, 0x54, 0x47, 0x1d, 0x7b, 0x3b, 0x12, 0xa6, 0xff, 0x40, 0x5c, 0xa0, 0xab, 0xd7, 0x21, 0xc9, - 0x5a, 0xe8, 0xa0, 0x17, 0x60, 0xba, 0x4b, 0x7e, 0xf0, 0x24, 0xfe, 0xc2, 0x48, 0x45, 0xa7, 0xf4, - 0x41, 0xb5, 0x60, 0x7c, 0xf2, 0x9f, 0x45, 0x00, 0x56, 0x6f, 0xdc, 0x68, 0xd8, 0x46, 0xb7, 0x8d, - 0xdd, 0x77, 0xab, 0xcb, 0xeb, 0x70, 0x22, 0xf0, 0x25, 0xb0, 0xad, 0x4f, 0xdc, 0xed, 0x59, 0xff, - 0x5b, 0x60, 0x5b, 0x1f, 0x8a, 0xd6, 0x74, 0x5c, 0x0f, 0x2d, 0x36, 0x31, 0xda, 0xaa, 0xe3, 0x0e, - 0xca, 0xf1, 0x15, 0xc8, 0xf8, 0x5d, 0x77, 0x50, 0x0d, 0x52, 0x2e, 0xff, 0xcd, 0xc5, 0x29, 0x8f, - 0x16, 0xa7, 0x60, 0x0b, 0x8a, 0xd4, 0x63, 0x97, 0xff, 0x27, 0x91, 0xaa, 0x3f, 0x11, 0xbe, 0xaa, - 0x14, 0x89, 0x58, 0x78, 0x6e, 0x81, 0x63, 0xef, 0x82, 0x05, 0xe6, 0x58, 0x01, 0xb1, 0x7e, 0x73, - 0x14, 0x66, 0x77, 0xc4, 0x24, 0xfd, 0xaa, 0x95, 0xc2, 0x0e, 0x24, 0xb1, 0xe9, 0xda, 0x86, 0xb7, - 0xdb, 0xf4, 0xc4, 0xa8, 0xc1, 0x1e, 0xd2, 0x97, 0xaa, 0xe9, 0xda, 0x87, 0xc1, 0xa1, 0x17, 0x58, - 0x01, 0x31, 0xfc, 0x42, 0x0c, 0xe6, 0x47, 0xb1, 0xa2, 0xb3, 0x50, 0xd0, 0x6d, 0x4c, 0x0b, 0xc2, - 0xdf, 0x41, 0xe6, 0x45, 0x31, 0x5f, 0x52, 0x14, 0x20, 0x0e, 0x1a, 0xd1, 0x2a, 0x42, 0x7a, 0x6f, - 0x1e, 0x59, 0xde, 0x47, 0xa0, 0x8b, 0x0a, 0x86, 0x82, 0xf8, 0xb0, 0x62, 0x57, 0x6b, 0x6b, 0xa6, - 0x8e, 0xef, 0x41, 0x13, 0x06, 0x57, 0x00, 0xf1, 0xb5, 0x46, 0x99, 0x61, 0xa2, 0x1b, 0x90, 0x14, - 0xf0, 0xf1, 0x77, 0x01, 0x5e, 0x80, 0xa1, 0x07, 0x20, 0x1b, 0x5c, 0x18, 0xa8, 0x9f, 0x12, 0x57, - 0x32, 0x81, 0x75, 0x61, 0xdc, 0xca, 0x93, 0x38, 0x72, 0xe5, 0xe1, 0xae, 0xe0, 0xcf, 0xc7, 0x60, - 0x46, 0xc1, 0xcd, 0xbf, 0x82, 0x03, 0xf7, 0x35, 0x00, 0x6c, 0x52, 0x13, 0x63, 0x7b, 0x0f, 0x63, - 0x37, 0x68, 0x24, 0xd2, 0x0c, 0x6f, 0xd5, 0x71, 0xdf, 0xaf, 0xd1, 0xfb, 0xd7, 0x51, 0xc8, 0x06, - 0x47, 0xef, 0xaf, 0xc0, 0xca, 0x86, 0x36, 0x7d, 0x93, 0xc6, 0xbe, 0x27, 0x79, 0x64, 0x94, 0x49, - 0x1b, 0xd0, 0xeb, 0x31, 0xb6, 0xec, 0xd3, 0x31, 0x48, 0xf0, 0x53, 0x73, 0x5b, 0x03, 0x3e, 0x6e, - 0x64, 0xdc, 0x17, 0xf1, 0x39, 0xf1, 0x45, 0xfc, 0x50, 0x17, 0xf7, 0x21, 0xc8, 0x93, 0x90, 0x3a, - 0x74, 0x14, 0x2f, 0x72, 0x2e, 0x47, 0xc3, 0x61, 0xff, 0xe0, 0x39, 0x5a, 0x84, 0x0c, 0x21, 0xf3, - 0x6d, 0x36, 0xa1, 0x81, 0x8e, 0x76, 0x50, 0x65, 0x25, 0xe8, 0x71, 0x40, 0xfb, 0x5e, 0xe2, 0x43, - 0xf5, 0x05, 0x41, 0xe8, 0x66, 0xfc, 0x1a, 0x41, 0x7e, 0x3f, 0x00, 0x69, 0x85, 0xca, 0xee, 0x53, - 0xe6, 0x77, 0x53, 0x93, 0x92, 0x55, 0x7a, 0xa7, 0xf2, 0x77, 0x44, 0x98, 0xab, 0xdc, 0x17, 0x6d, - 0xf3, 0xa0, 0x45, 0x3d, 0xde, 0x6c, 0xf8, 0xe3, 0xb7, 0x16, 0x8b, 0x87, 0x5a, 0xa7, 0xbd, 0x22, - 0x0f, 0x81, 0x94, 0x87, 0xe5, 0x02, 0x88, 0x37, 0x1d, 0x0e, 0xdc, 0x57, 0x3e, 0x40, 0xf4, 0xfa, - 0xce, 0xef, 0xfe, 0xc4, 0xf9, 0x33, 0x81, 0x57, 0x1c, 0x78, 0x19, 0x32, 0x36, 0x3c, 0xf2, 0x8f, - 0x45, 0x00, 0xf9, 0x8b, 0x8d, 0x77, 0xf4, 0x7e, 0x03, 0x20, 0xe0, 0xef, 0x47, 0x8e, 0x8e, 0x23, - 0x7c, 0xfe, 0x50, 0x1c, 0x11, 0x98, 0x4c, 0x1f, 0xf2, 0x4d, 0xbb, 0xb8, 0x0f, 0x61, 0xc8, 0xcd, - 0xda, 0xcb, 0x15, 0xcb, 0x08, 0x41, 0x08, 0x26, 0x3a, 0x47, 0xa7, 0xe4, 0xb7, 0x22, 0x70, 0x7a, - 0x40, 0x13, 0xbd, 0x26, 0xeb, 0x80, 0xec, 0x40, 0x25, 0x1d, 0x51, 0xb1, 0xdb, 0x7b, 0x6f, 0x8a, - 0x3d, 0x63, 0x0f, 0x98, 0xf3, 0xf7, 0x68, 0x8d, 0xe2, 0x46, 0xe8, 0x57, 0x23, 0x30, 0x17, 0x6c, - 0x91, 0xd7, 0xb7, 0x3a, 0x64, 0x83, 0x6d, 0xe1, 0xbd, 0xfa, 0xc0, 0x24, 0xbd, 0x0a, 0x76, 0x28, - 0x04, 0x42, 0xfa, 0x22, 0xb4, 0x9e, 0xe5, 0xea, 0x9e, 0x9c, 0x58, 0x4a, 0xa2, 0x61, 0x43, 0xcd, - 0x00, 0x1b, 0xac, 0x6f, 0x8f, 0x42, 0x7c, 0xdb, 0xb2, 0xda, 0xe8, 0x9b, 0x22, 0x30, 0x63, 0x5a, - 0xae, 0x4a, 0xe6, 0x0a, 0x6e, 0xaa, 0x3c, 0x59, 0xc0, 0x2c, 0xe9, 0x8d, 0xe3, 0x49, 0xef, 0x4b, - 0x6f, 0x2d, 0x0e, 0x42, 0x0d, 0xbb, 0x10, 0xbd, 0x60, 0x5a, 0x6e, 0x99, 0x12, 0x35, 0x58, 0x3e, - 0xe1, 0x36, 0xe4, 0xc2, 0xef, 0x67, 0xe6, 0x57, 0x39, 0xf6, 0xfb, 0x73, 0x63, 0xdf, 0x9d, 0xdd, - 0x0d, 0xbc, 0x98, 0x5d, 0x4b, 0xfc, 0x87, 0x64, 0x70, 0x5f, 0x05, 0xe9, 0x46, 0xff, 0xb9, 0xa3, - 0x2a, 0x24, 0xc5, 0x39, 0xa3, 0xc8, 0x84, 0x47, 0x98, 0x82, 0x12, 0xe7, 0xbc, 0xe7, 0x7f, 0x26, - 0x02, 0xe0, 0xa7, 0x66, 0xd0, 0x63, 0x70, 0xaa, 0xbc, 0xb5, 0xb9, 0xaa, 0xd6, 0x1b, 0xa5, 0xc6, - 0x4e, 0x3d, 0xfc, 0x57, 0x34, 0xc4, 0x7d, 0x3e, 0x4e, 0x17, 0xeb, 0xc6, 0x9e, 0x81, 0x9b, 0xe8, - 0x61, 0x98, 0x0b, 0x53, 0x93, 0xa7, 0xea, 0xaa, 0x14, 0x29, 0x66, 0xef, 0xdc, 0x5d, 0x4a, 0x31, - 0x97, 0x14, 0x37, 0xd1, 0x39, 0x38, 0x31, 0x48, 0x57, 0xdb, 0x5c, 0x93, 0xa2, 0xc5, 0xdc, 0x9d, - 0xbb, 0x4b, 0x69, 0xcf, 0x77, 0x45, 0x32, 0xa0, 0x20, 0x25, 0xc7, 0x8b, 0x15, 0xe1, 0xce, 0xdd, - 0xa5, 0x04, 0x1b, 0x96, 0x62, 0xfc, 0x63, 0x3f, 0xbc, 0x30, 0x75, 0xfe, 0xeb, 0x00, 0x6a, 0xe6, - 0x9e, 0xad, 0xd1, 0x3f, 0x25, 0x8f, 0x8a, 0x70, 0xb2, 0xb6, 0x79, 0x55, 0x29, 0x55, 0x1a, 0xb5, - 0xad, 0xcd, 0xbe, 0x3f, 0xfe, 0x11, 0xae, 0x5b, 0xdd, 0xda, 0x29, 0xaf, 0x57, 0xd5, 0x7a, 0x6d, - 0x6d, 0x93, 0xed, 0x01, 0x87, 0xea, 0x5e, 0xde, 0x6c, 0xd4, 0x36, 0xaa, 0x52, 0xb4, 0x7c, 0x75, - 0xe4, 0x1e, 0xc3, 0x63, 0x47, 0x0e, 0xb8, 0x6f, 0x25, 0x43, 0x1b, 0x0d, 0xff, 0x3b, 0x00, 0x00, - 0xff, 0xff, 0xd6, 0xf2, 0x1e, 0x47, 0x50, 0xa0, 0x00, 0x00, + // 11311 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x90, 0x24, 0xd9, + 0x55, 0x1f, 0xde, 0xf5, 0xae, 0x3a, 0xf5, 0xca, 0xbe, 0xdd, 0x33, 0xd3, 0x53, 0xb3, 0xdb, 0xdd, + 0x9b, 0xab, 0xdd, 0x9d, 0x9d, 0xdd, 0xed, 0xd9, 0x9d, 0xdd, 0x99, 0xdd, 0xed, 0x91, 0xb4, 0xff, + 0xaa, 0xea, 0x9a, 0x9e, 0x9a, 0xed, 0x97, 0xb2, 0xaa, 0x67, 0x1f, 0x3c, 0x92, 0xec, 0xac, 0xdb, + 0xd5, 0xb9, 0x53, 0x95, 0x59, 0xca, 0xcc, 0x9a, 0xe9, 0xde, 0xf8, 0x87, 0x43, 0x20, 0xb0, 0xc5, + 0x18, 0x83, 0x78, 0x84, 0x11, 0xa0, 0xc1, 0x12, 0x18, 0x10, 0xf8, 0xc5, 0x43, 0x46, 0x60, 0x02, + 0x0c, 0x0e, 0x3f, 0x00, 0x3b, 0x1c, 0x32, 0x1f, 0x6c, 0xc2, 0x11, 0x5e, 0x83, 0x44, 0x18, 0x59, + 0x08, 0x03, 0x42, 0x18, 0x63, 0x85, 0x09, 0xc7, 0x7d, 0xe5, 0xa3, 0x1e, 0x5d, 0xd5, 0xa3, 0x5d, + 0x81, 0x8d, 0xbf, 0xcc, 0x54, 0xde, 0x7b, 0xce, 0x2f, 0xef, 0x3d, 0xf7, 0xdc, 0x73, 0xcf, 0x39, + 0xf7, 0xe6, 0x6d, 0xf8, 0xed, 0x0a, 0x2c, 0xb7, 0x2d, 0xab, 0xdd, 0xc1, 0x17, 0x7b, 0xb6, 0xe5, + 0x5a, 0x7b, 0xfd, 0xfd, 0x8b, 0x2d, 0xec, 0xe8, 0xb6, 0xd1, 0x73, 0x2d, 0x7b, 0x85, 0x96, 0xa1, + 0x22, 0xa3, 0x58, 0x11, 0x14, 0xf2, 0x26, 0xcc, 0x5e, 0x33, 0x3a, 0x78, 0xcd, 0x23, 0x6c, 0x60, + 0x17, 0xbd, 0x00, 0xf1, 0x7d, 0xa3, 0x83, 0x17, 0x22, 0xcb, 0xb1, 0xf3, 0xd9, 0x4b, 0xef, 0x5a, + 0x19, 0x60, 0x5a, 0x09, 0x73, 0xec, 0x90, 0x62, 0x85, 0x72, 0xc8, 0x7f, 0x1e, 0x87, 0xb9, 0x11, + 0xb5, 0x08, 0x41, 0xdc, 0xd4, 0xba, 0x04, 0x31, 0x72, 0x3e, 0xa3, 0xd0, 0xdf, 0x68, 0x01, 0x52, + 0x3d, 0x4d, 0xbf, 0xa5, 0xb5, 0xf1, 0x42, 0x94, 0x16, 0x8b, 0x47, 0xb4, 0x08, 0xd0, 0xc2, 0x3d, + 0x6c, 0xb6, 0xb0, 0xa9, 0x1f, 0x2d, 0xc4, 0x96, 0x63, 0xe7, 0x33, 0x4a, 0xa0, 0x04, 0x3d, 0x01, + 0xb3, 0xbd, 0xfe, 0x5e, 0xc7, 0xd0, 0xd5, 0x00, 0x19, 0x2c, 0xc7, 0xce, 0x27, 0x14, 0x89, 0x55, + 0xac, 0xf9, 0xc4, 0x8f, 0x41, 0xf1, 0x0e, 0xd6, 0x6e, 0x05, 0x49, 0xb3, 0x94, 0xb4, 0x40, 0x8a, + 0x03, 0x84, 0x55, 0xc8, 0x75, 0xb1, 0xe3, 0x68, 0x6d, 0xac, 0xba, 0x47, 0x3d, 0xbc, 0x10, 0xa7, + 0xbd, 0x5f, 0x1e, 0xea, 0xfd, 0x60, 0xcf, 0xb3, 0x9c, 0xab, 0x79, 0xd4, 0xc3, 0xa8, 0x0c, 0x19, + 0x6c, 0xf6, 0xbb, 0x0c, 0x21, 0x31, 0x46, 0x7e, 0x35, 0xb3, 0xdf, 0x1d, 0x44, 0x49, 0x13, 0x36, + 0x0e, 0x91, 0x72, 0xb0, 0x7d, 0xdb, 0xd0, 0xf1, 0x42, 0x92, 0x02, 0x3c, 0x36, 0x04, 0xd0, 0x60, + 0xf5, 0x83, 0x18, 0x82, 0x0f, 0x55, 0x21, 0x83, 0x0f, 0x5d, 0x6c, 0x3a, 0x86, 0x65, 0x2e, 0xa4, + 0x28, 0xc8, 0x23, 0x23, 0x46, 0x11, 0x77, 0x5a, 0x83, 0x10, 0x3e, 0x1f, 0xba, 0x02, 0x29, 0xab, + 0xe7, 0x1a, 0x96, 0xe9, 0x2c, 0xa4, 0x97, 0x23, 0xe7, 0xb3, 0x97, 0x1e, 0x18, 0xa9, 0x08, 0xdb, + 0x8c, 0x46, 0x11, 0xc4, 0xa8, 0x0e, 0x92, 0x63, 0xf5, 0x6d, 0x1d, 0xab, 0xba, 0xd5, 0xc2, 0xaa, + 0x61, 0xee, 0x5b, 0x0b, 0x19, 0x0a, 0xb0, 0x34, 0xdc, 0x11, 0x4a, 0x58, 0xb5, 0x5a, 0xb8, 0x6e, + 0xee, 0x5b, 0x4a, 0xc1, 0x09, 0x3d, 0xa3, 0xd3, 0x90, 0x74, 0x8e, 0x4c, 0x57, 0x3b, 0x5c, 0xc8, + 0x51, 0x0d, 0xe1, 0x4f, 0x44, 0x75, 0x70, 0xcb, 0x20, 0xaf, 0x5b, 0xc8, 0x33, 0xd5, 0xe1, 0x8f, + 0xf2, 0xcf, 0x27, 0xa1, 0x38, 0x8d, 0xf2, 0x5d, 0x85, 0xc4, 0x3e, 0xe9, 0xff, 0x42, 0xf4, 0x24, + 0xd2, 0x61, 0x3c, 0x61, 0xf1, 0x26, 0xef, 0x53, 0xbc, 0x65, 0xc8, 0x9a, 0xd8, 0x71, 0x71, 0x8b, + 0xe9, 0x4a, 0x6c, 0x4a, 0x6d, 0x03, 0xc6, 0x34, 0xac, 0x6c, 0xf1, 0xfb, 0x52, 0xb6, 0x57, 0xa1, + 0xe8, 0x35, 0x49, 0xb5, 0x35, 0xb3, 0x2d, 0xb4, 0xf6, 0xe2, 0xa4, 0x96, 0xac, 0xd4, 0x04, 0x9f, + 0x42, 0xd8, 0x94, 0x02, 0x0e, 0x3d, 0xa3, 0x35, 0x00, 0xcb, 0xc4, 0xd6, 0xbe, 0xda, 0xc2, 0x7a, + 0x67, 0x21, 0x3d, 0x46, 0x4a, 0xdb, 0x84, 0x64, 0x48, 0x4a, 0x16, 0x2b, 0xd5, 0x3b, 0xe8, 0x45, + 0x5f, 0x09, 0x53, 0x63, 0x74, 0x68, 0x93, 0x4d, 0xbf, 0x21, 0x3d, 0xdc, 0x85, 0x82, 0x8d, 0xc9, + 0x8c, 0xc0, 0x2d, 0xde, 0xb3, 0x0c, 0x6d, 0xc4, 0xca, 0xc4, 0x9e, 0x29, 0x9c, 0x8d, 0x75, 0x2c, + 0x6f, 0x07, 0x1f, 0xd1, 0xc3, 0xe0, 0x15, 0xa8, 0x54, 0xad, 0x80, 0xda, 0xa7, 0x9c, 0x28, 0xdc, + 0xd2, 0xba, 0xb8, 0xf4, 0x26, 0x14, 0xc2, 0xe2, 0x41, 0xf3, 0x90, 0x70, 0x5c, 0xcd, 0x76, 0xa9, + 0x16, 0x26, 0x14, 0xf6, 0x80, 0x24, 0x88, 0x61, 0xb3, 0x45, 0xed, 0x5f, 0x42, 0x21, 0x3f, 0xd1, + 0xff, 0xe7, 0x77, 0x38, 0x46, 0x3b, 0xfc, 0xe8, 0xf0, 0x88, 0x86, 0x90, 0x07, 0xfb, 0x5d, 0x7a, + 0x1e, 0xf2, 0xa1, 0x0e, 0x4c, 0xfb, 0x6a, 0xf9, 0xff, 0x87, 0x53, 0x23, 0xa1, 0xd1, 0xab, 0x30, + 0xdf, 0x37, 0x0d, 0xd3, 0xc5, 0x76, 0xcf, 0xc6, 0x44, 0x63, 0xd9, 0xab, 0x16, 0x7e, 0x37, 0x35, + 0x46, 0xe7, 0x76, 0x83, 0xd4, 0x0c, 0x45, 0x99, 0xeb, 0x0f, 0x17, 0x5e, 0xc8, 0xa4, 0x3f, 0x97, + 0x92, 0x3e, 0xf0, 0x81, 0x0f, 0x7c, 0x20, 0x2a, 0xff, 0x4a, 0x12, 0xe6, 0x47, 0xcd, 0x99, 0x91, + 0xd3, 0xf7, 0x34, 0x24, 0xcd, 0x7e, 0x77, 0x0f, 0xdb, 0x54, 0x48, 0x09, 0x85, 0x3f, 0xa1, 0x32, + 0x24, 0x3a, 0xda, 0x1e, 0xee, 0x2c, 0xc4, 0x97, 0x23, 0xe7, 0x0b, 0x97, 0x9e, 0x98, 0x6a, 0x56, + 0xae, 0x6c, 0x10, 0x16, 0x85, 0x71, 0xa2, 0xf7, 0x42, 0x9c, 0x1b, 0x6f, 0x82, 0x70, 0x61, 0x3a, + 0x04, 0x32, 0x97, 0x14, 0xca, 0x87, 0xce, 0x41, 0x86, 0xfc, 0xcf, 0x74, 0x23, 0x49, 0xdb, 0x9c, + 0x26, 0x05, 0x44, 0x2f, 0x50, 0x09, 0xd2, 0x74, 0x9a, 0xb4, 0xb0, 0x58, 0xf4, 0xbc, 0x67, 0xa2, + 0x58, 0x2d, 0xbc, 0xaf, 0xf5, 0x3b, 0xae, 0x7a, 0x5b, 0xeb, 0xf4, 0x31, 0x55, 0xf8, 0x8c, 0x92, + 0xe3, 0x85, 0x37, 0x49, 0x19, 0x5a, 0x82, 0x2c, 0x9b, 0x55, 0x86, 0xd9, 0xc2, 0x87, 0xd4, 0xae, + 0x26, 0x14, 0x36, 0xd1, 0xea, 0xa4, 0x84, 0xbc, 0xfe, 0x0d, 0xc7, 0x32, 0x85, 0x6a, 0xd2, 0x57, + 0x90, 0x02, 0xfa, 0xfa, 0xe7, 0x07, 0x4d, 0xfa, 0x83, 0xa3, 0xbb, 0x37, 0x34, 0x97, 0x1e, 0x83, + 0x22, 0xa5, 0x78, 0x96, 0x0f, 0xbd, 0xd6, 0x59, 0x98, 0x5d, 0x8e, 0x9c, 0x4f, 0x2b, 0x05, 0x56, + 0xbc, 0xcd, 0x4b, 0xe5, 0x9f, 0x8d, 0x42, 0x9c, 0x1a, 0x96, 0x22, 0x64, 0x9b, 0xaf, 0xed, 0xd4, + 0xd4, 0xb5, 0xed, 0xdd, 0xca, 0x46, 0x4d, 0x8a, 0xa0, 0x02, 0x00, 0x2d, 0xb8, 0xb6, 0xb1, 0x5d, + 0x6e, 0x4a, 0x51, 0xef, 0xb9, 0xbe, 0xd5, 0xbc, 0xf2, 0x9c, 0x14, 0xf3, 0x18, 0x76, 0x59, 0x41, + 0x3c, 0x48, 0xf0, 0xec, 0x25, 0x29, 0x81, 0x24, 0xc8, 0x31, 0x80, 0xfa, 0xab, 0xb5, 0xb5, 0x2b, + 0xcf, 0x49, 0xc9, 0x70, 0xc9, 0xb3, 0x97, 0xa4, 0x14, 0xca, 0x43, 0x86, 0x96, 0x54, 0xb6, 0xb7, + 0x37, 0xa4, 0xb4, 0x87, 0xd9, 0x68, 0x2a, 0xf5, 0xad, 0x75, 0x29, 0xe3, 0x61, 0xae, 0x2b, 0xdb, + 0xbb, 0x3b, 0x12, 0x78, 0x08, 0x9b, 0xb5, 0x46, 0xa3, 0xbc, 0x5e, 0x93, 0xb2, 0x1e, 0x45, 0xe5, + 0xb5, 0x66, 0xad, 0x21, 0xe5, 0x42, 0xcd, 0x7a, 0xf6, 0x92, 0x94, 0xf7, 0x5e, 0x51, 0xdb, 0xda, + 0xdd, 0x94, 0x0a, 0x68, 0x16, 0xf2, 0xec, 0x15, 0xa2, 0x11, 0xc5, 0x81, 0xa2, 0x2b, 0xcf, 0x49, + 0x92, 0xdf, 0x10, 0x86, 0x32, 0x1b, 0x2a, 0xb8, 0xf2, 0x9c, 0x84, 0xe4, 0x2a, 0x24, 0xa8, 0x1a, + 0x22, 0x04, 0x85, 0x8d, 0x72, 0xa5, 0xb6, 0xa1, 0x6e, 0xef, 0x34, 0xeb, 0xdb, 0x5b, 0xe5, 0x0d, + 0x29, 0xe2, 0x97, 0x29, 0xb5, 0xf7, 0xed, 0xd6, 0x95, 0xda, 0x9a, 0x14, 0x0d, 0x96, 0xed, 0xd4, + 0xca, 0xcd, 0xda, 0x9a, 0x14, 0x93, 0x75, 0x98, 0x1f, 0x65, 0x50, 0x47, 0x4e, 0xa1, 0x80, 0x2e, + 0x44, 0xc7, 0xe8, 0x02, 0xc5, 0x1a, 0xd4, 0x05, 0xf9, 0xb3, 0x51, 0x98, 0x1b, 0xb1, 0xa8, 0x8c, + 0x7c, 0xc9, 0x4b, 0x90, 0x60, 0xba, 0xcc, 0x96, 0xd9, 0xc7, 0x47, 0xae, 0x4e, 0x54, 0xb3, 0x87, + 0x96, 0x5a, 0xca, 0x17, 0x74, 0x42, 0x62, 0x63, 0x9c, 0x10, 0x02, 0x31, 0xa4, 0xb0, 0x5f, 0x37, + 0x64, 0xfc, 0xd9, 0xfa, 0x78, 0x65, 0x9a, 0xf5, 0x91, 0x96, 0x9d, 0x6c, 0x11, 0x48, 0x8c, 0x58, + 0x04, 0xae, 0xc2, 0xec, 0x10, 0xd0, 0xd4, 0xc6, 0xf8, 0x83, 0x11, 0x58, 0x18, 0x27, 0x9c, 0x09, + 0x26, 0x31, 0x1a, 0x32, 0x89, 0x57, 0x07, 0x25, 0xf8, 0xd0, 0xf8, 0x41, 0x18, 0x1a, 0xeb, 0x1f, + 0x8b, 0xc0, 0xe9, 0xd1, 0xce, 0xe6, 0xc8, 0x36, 0xbc, 0x17, 0x92, 0x5d, 0xec, 0x1e, 0x58, 0xc2, + 0xad, 0x7a, 0x74, 0xc4, 0x62, 0x4d, 0xaa, 0x07, 0x07, 0x9b, 0x73, 0x05, 0x57, 0xfb, 0xd8, 0x38, + 0x8f, 0x91, 0xb5, 0x66, 0xa8, 0xa5, 0xdf, 0x1a, 0x85, 0x53, 0x23, 0xc1, 0x47, 0x36, 0xf4, 0x41, + 0x00, 0xc3, 0xec, 0xf5, 0x5d, 0xe6, 0x3a, 0x31, 0x4b, 0x9c, 0xa1, 0x25, 0xd4, 0x78, 0x11, 0x2b, + 0xdb, 0x77, 0xbd, 0xfa, 0x18, 0xad, 0x07, 0x56, 0x44, 0x09, 0x5e, 0xf0, 0x1b, 0x1a, 0xa7, 0x0d, + 0x5d, 0x1c, 0xd3, 0xd3, 0x21, 0xc5, 0x7c, 0x1a, 0x24, 0xbd, 0x63, 0x60, 0xd3, 0x55, 0x1d, 0xd7, + 0xc6, 0x5a, 0xd7, 0x30, 0xdb, 0x74, 0xa9, 0x49, 0xaf, 0x26, 0xf6, 0xb5, 0x8e, 0x83, 0x95, 0x22, + 0xab, 0x6e, 0x88, 0x5a, 0xc2, 0x41, 0x15, 0xc8, 0x0e, 0x70, 0x24, 0x43, 0x1c, 0xac, 0xda, 0xe3, + 0x90, 0xbf, 0x33, 0x03, 0xd9, 0x80, 0x6b, 0x8e, 0x1e, 0x82, 0xdc, 0x1b, 0xda, 0x6d, 0x4d, 0x15, + 0xe1, 0x16, 0x93, 0x44, 0x96, 0x94, 0xed, 0xf0, 0x90, 0xeb, 0x69, 0x98, 0xa7, 0x24, 0x56, 0xdf, + 0xc5, 0xb6, 0xaa, 0x77, 0x34, 0xc7, 0xa1, 0x42, 0x4b, 0x53, 0x52, 0x44, 0xea, 0xb6, 0x49, 0x55, + 0x55, 0xd4, 0xa0, 0xcb, 0x30, 0x47, 0x39, 0xba, 0xfd, 0x8e, 0x6b, 0xf4, 0x3a, 0x58, 0x25, 0x01, + 0xa0, 0x43, 0x97, 0x1c, 0xaf, 0x65, 0xb3, 0x84, 0x62, 0x93, 0x13, 0x90, 0x16, 0x39, 0x68, 0x0d, + 0x1e, 0xa4, 0x6c, 0x6d, 0x6c, 0x62, 0x5b, 0x73, 0xb1, 0x8a, 0xdf, 0xdf, 0xd7, 0x3a, 0x8e, 0xaa, + 0x99, 0x2d, 0xf5, 0x40, 0x73, 0x0e, 0x16, 0xe6, 0x09, 0x40, 0x25, 0xba, 0x10, 0x51, 0xce, 0x12, + 0xc2, 0x75, 0x4e, 0x57, 0xa3, 0x64, 0x65, 0xb3, 0x75, 0x5d, 0x73, 0x0e, 0xd0, 0x2a, 0x9c, 0xa6, + 0x28, 0x8e, 0x6b, 0x1b, 0x66, 0x5b, 0xd5, 0x0f, 0xb0, 0x7e, 0x4b, 0xed, 0xbb, 0xfb, 0x2f, 0x2c, + 0x9c, 0x0b, 0xbe, 0x9f, 0xb6, 0xb0, 0x41, 0x69, 0xaa, 0x84, 0x64, 0xd7, 0xdd, 0x7f, 0x01, 0x35, + 0x20, 0x47, 0x06, 0xa3, 0x6b, 0xbc, 0x89, 0xd5, 0x7d, 0xcb, 0xa6, 0x6b, 0x68, 0x61, 0x84, 0x69, + 0x0a, 0x48, 0x70, 0x65, 0x9b, 0x33, 0x6c, 0x5a, 0x2d, 0xbc, 0x9a, 0x68, 0xec, 0xd4, 0x6a, 0x6b, + 0x4a, 0x56, 0xa0, 0x5c, 0xb3, 0x6c, 0xa2, 0x50, 0x6d, 0xcb, 0x13, 0x70, 0x96, 0x29, 0x54, 0xdb, + 0x12, 0xe2, 0xbd, 0x0c, 0x73, 0xba, 0xce, 0xfa, 0x6c, 0xe8, 0x2a, 0x0f, 0xd3, 0x9c, 0x05, 0x29, + 0x24, 0x2c, 0x5d, 0x5f, 0x67, 0x04, 0x5c, 0xc7, 0x1d, 0xf4, 0x22, 0x9c, 0xf2, 0x85, 0x15, 0x64, + 0x9c, 0x1d, 0xea, 0xe5, 0x20, 0xeb, 0x65, 0x98, 0xeb, 0x1d, 0x0d, 0x33, 0xa2, 0xd0, 0x1b, 0x7b, + 0x47, 0x83, 0x6c, 0xcf, 0xc3, 0x7c, 0xef, 0xa0, 0x37, 0xcc, 0x77, 0x21, 0xc8, 0x87, 0x7a, 0x07, + 0xbd, 0x41, 0xc6, 0x47, 0x68, 0xcc, 0x6e, 0x63, 0x5d, 0x73, 0x71, 0x6b, 0xe1, 0x4c, 0x90, 0x3c, + 0x50, 0x81, 0x56, 0x40, 0xd2, 0x75, 0x15, 0x9b, 0xda, 0x5e, 0x07, 0xab, 0x9a, 0x8d, 0x4d, 0xcd, + 0x59, 0x58, 0xa2, 0xc4, 0x71, 0xd7, 0xee, 0x63, 0xa5, 0xa0, 0xeb, 0x35, 0x5a, 0x59, 0xa6, 0x75, + 0xe8, 0x02, 0xcc, 0x5a, 0x7b, 0x6f, 0xe8, 0x4c, 0x23, 0xd5, 0x9e, 0x8d, 0xf7, 0x8d, 0xc3, 0x85, + 0x77, 0x51, 0xf1, 0x16, 0x49, 0x05, 0xd5, 0xc7, 0x1d, 0x5a, 0x8c, 0x1e, 0x07, 0x49, 0x77, 0x0e, + 0x34, 0xbb, 0x47, 0x4d, 0xb2, 0xd3, 0xd3, 0x74, 0xbc, 0xf0, 0x08, 0x23, 0x65, 0xe5, 0x5b, 0xa2, + 0x98, 0xcc, 0x08, 0xe7, 0x8e, 0xb1, 0xef, 0x0a, 0xc4, 0xc7, 0xd8, 0x8c, 0xa0, 0x65, 0x1c, 0xed, + 0x3c, 0x48, 0x44, 0x12, 0xa1, 0x17, 0x9f, 0xa7, 0x64, 0x85, 0xde, 0x41, 0x2f, 0xf8, 0xde, 0x87, + 0x21, 0x4f, 0x28, 0xfd, 0x97, 0x3e, 0xce, 0x1c, 0xb7, 0xde, 0x41, 0xe0, 0x8d, 0xcf, 0xc1, 0x69, + 0x42, 0xd4, 0xc5, 0xae, 0xd6, 0xd2, 0x5c, 0x2d, 0x40, 0xfd, 0x24, 0xa5, 0x26, 0x62, 0xdf, 0xe4, + 0x95, 0xa1, 0x76, 0xda, 0xfd, 0xbd, 0x23, 0x4f, 0xb1, 0x9e, 0x62, 0xed, 0x24, 0x65, 0x42, 0xb5, + 0xde, 0x31, 0xe7, 0x5c, 0x5e, 0x85, 0x5c, 0x50, 0xef, 0x51, 0x06, 0x98, 0xe6, 0x4b, 0x11, 0xe2, + 0x04, 0x55, 0xb7, 0xd7, 0x88, 0xfb, 0xf2, 0x7a, 0x4d, 0x8a, 0x12, 0x37, 0x6a, 0xa3, 0xde, 0xac, + 0xa9, 0xca, 0xee, 0x56, 0xb3, 0xbe, 0x59, 0x93, 0x62, 0x01, 0xc7, 0xfe, 0x46, 0x3c, 0xfd, 0xa8, + 0xf4, 0x98, 0xfc, 0x0b, 0x31, 0x28, 0x84, 0x23, 0x35, 0xf4, 0x6e, 0x38, 0x23, 0x12, 0x2e, 0x0e, + 0x76, 0xd5, 0x3b, 0x86, 0x4d, 0x27, 0x64, 0x57, 0x63, 0x8b, 0xa3, 0xa7, 0x3f, 0xf3, 0x9c, 0xaa, + 0x81, 0xdd, 0x57, 0x0c, 0x9b, 0x4c, 0xb7, 0xae, 0xe6, 0xa2, 0x0d, 0x58, 0x32, 0x2d, 0xd5, 0x71, + 0x35, 0xb3, 0xa5, 0xd9, 0x2d, 0xd5, 0x4f, 0x75, 0xa9, 0x9a, 0xae, 0x63, 0xc7, 0xb1, 0xd8, 0x42, + 0xe8, 0xa1, 0x3c, 0x60, 0x5a, 0x0d, 0x4e, 0xec, 0xaf, 0x10, 0x65, 0x4e, 0x3a, 0xa0, 0xbe, 0xb1, + 0x71, 0xea, 0x7b, 0x0e, 0x32, 0x5d, 0xad, 0xa7, 0x62, 0xd3, 0xb5, 0x8f, 0xa8, 0x7f, 0x9e, 0x56, + 0xd2, 0x5d, 0xad, 0x57, 0x23, 0xcf, 0xe8, 0x26, 0x3c, 0xea, 0x93, 0xaa, 0x1d, 0xdc, 0xd6, 0xf4, + 0x23, 0x95, 0x3a, 0xe3, 0x34, 0x6d, 0xa0, 0xea, 0x96, 0xb9, 0xdf, 0x31, 0x74, 0xd7, 0xa1, 0xf6, + 0x81, 0xd9, 0x38, 0xd9, 0xe7, 0xd8, 0xa0, 0x0c, 0x37, 0x1c, 0xcb, 0xa4, 0x3e, 0x78, 0x55, 0x50, + 0x7f, 0x55, 0xc2, 0xaf, 0x1b, 0xf1, 0x74, 0x5c, 0x4a, 0xdc, 0x88, 0xa7, 0x13, 0x52, 0xf2, 0x46, + 0x3c, 0x9d, 0x94, 0x52, 0x37, 0xe2, 0xe9, 0xb4, 0x94, 0xb9, 0x11, 0x4f, 0x67, 0x24, 0x90, 0x3f, + 0x95, 0x86, 0x5c, 0x30, 0x32, 0x20, 0x81, 0x96, 0x4e, 0xd7, 0xc6, 0x08, 0xb5, 0x9e, 0x0f, 0x1f, + 0x1b, 0x47, 0xac, 0x54, 0xc9, 0xa2, 0xb9, 0x9a, 0x64, 0x6e, 0xb8, 0xc2, 0x38, 0x89, 0xc3, 0x42, + 0xd4, 0x1a, 0x33, 0xb7, 0x27, 0xad, 0xf0, 0x27, 0xb4, 0x0e, 0xc9, 0x37, 0x1c, 0x8a, 0x9d, 0xa4, + 0xd8, 0xef, 0x3a, 0x1e, 0xfb, 0x46, 0x83, 0x82, 0x67, 0x6e, 0x34, 0xd4, 0xad, 0x6d, 0x65, 0xb3, + 0xbc, 0xa1, 0x70, 0x76, 0x74, 0x16, 0xe2, 0x1d, 0xed, 0xcd, 0xa3, 0xf0, 0xf2, 0x4a, 0x8b, 0xd0, + 0x0a, 0x14, 0xfb, 0xe6, 0x6d, 0x6c, 0x1b, 0xfb, 0x06, 0x19, 0x2a, 0x42, 0x55, 0x0c, 0x52, 0x15, + 0xfc, 0xda, 0x0d, 0x42, 0x3f, 0xa5, 0x7a, 0x9c, 0x85, 0xf8, 0x1d, 0xac, 0xdd, 0x0a, 0x2f, 0x82, + 0xb4, 0x08, 0x9d, 0x87, 0x5c, 0x0b, 0xef, 0xf5, 0xdb, 0xaa, 0x8d, 0x5b, 0x9a, 0xee, 0x86, 0x4d, + 0x7f, 0x96, 0x56, 0x29, 0xb4, 0x06, 0xbd, 0x0c, 0x19, 0x32, 0x46, 0x26, 0x1d, 0xe3, 0x59, 0x2a, + 0x82, 0xa7, 0x8e, 0x17, 0x01, 0x1f, 0x62, 0xc1, 0xa4, 0xf8, 0xfc, 0xe8, 0x1a, 0x24, 0x5d, 0xcd, + 0x6e, 0x63, 0x97, 0x5a, 0xfe, 0xc2, 0x88, 0xe4, 0xc7, 0x08, 0xa4, 0x26, 0xe5, 0xa0, 0x31, 0x2d, + 0xe7, 0x7e, 0x07, 0xad, 0xcc, 0x45, 0x48, 0x50, 0xf5, 0x40, 0x00, 0x5c, 0x41, 0xa4, 0x19, 0x94, + 0x86, 0x78, 0x75, 0x5b, 0x21, 0x96, 0x46, 0x82, 0x1c, 0x2b, 0x55, 0x77, 0xea, 0xb5, 0x6a, 0x4d, + 0x8a, 0xca, 0x97, 0x21, 0xc9, 0xc6, 0x9c, 0x58, 0x21, 0x6f, 0xd4, 0xa5, 0x19, 0xfe, 0xc8, 0x31, + 0x22, 0xa2, 0x76, 0x77, 0xb3, 0x52, 0x53, 0xa4, 0xa8, 0xbc, 0x0b, 0xc5, 0x01, 0x39, 0xa1, 0x53, + 0x30, 0xab, 0xd4, 0x9a, 0xb5, 0x2d, 0x12, 0x67, 0xa9, 0xbb, 0x5b, 0x2f, 0x6f, 0x6d, 0xbf, 0xb2, + 0x25, 0xcd, 0x84, 0x8b, 0x85, 0x49, 0x8b, 0xa0, 0x79, 0x90, 0xfc, 0xe2, 0xc6, 0xf6, 0xae, 0x42, + 0x5b, 0xf3, 0x6d, 0x51, 0x90, 0x06, 0xa5, 0x86, 0xce, 0xc0, 0x5c, 0xb3, 0xac, 0xac, 0xd7, 0x9a, + 0x2a, 0x8b, 0x1d, 0x3d, 0xe8, 0x79, 0x90, 0x82, 0x15, 0xd7, 0xea, 0x34, 0x34, 0x5e, 0x82, 0x73, + 0xc1, 0xd2, 0xda, 0xab, 0xcd, 0xda, 0x56, 0x83, 0xbe, 0xbc, 0xbc, 0xb5, 0x4e, 0xec, 0xeb, 0x00, + 0x9e, 0x88, 0x56, 0x63, 0xa4, 0xa9, 0x61, 0xbc, 0xda, 0xc6, 0x9a, 0x14, 0x1f, 0x2c, 0xde, 0xde, + 0xaa, 0x6d, 0x5f, 0x93, 0x12, 0x83, 0x6f, 0xa7, 0x11, 0x6c, 0x12, 0x95, 0xe0, 0xf4, 0x60, 0xa9, + 0x5a, 0xdb, 0x6a, 0x2a, 0xaf, 0x49, 0xa9, 0xc1, 0x17, 0x37, 0x6a, 0xca, 0xcd, 0x7a, 0xb5, 0x26, + 0xa5, 0xd1, 0x69, 0x40, 0xe1, 0x16, 0x35, 0xaf, 0x6f, 0xaf, 0x49, 0x99, 0x21, 0x8b, 0x22, 0x3b, + 0x90, 0x0b, 0x86, 0x91, 0x5f, 0x9d, 0x5c, 0xd2, 0x47, 0xa2, 0x90, 0x0d, 0x84, 0x85, 0xc4, 0x9f, + 0xd7, 0x3a, 0x1d, 0xeb, 0x8e, 0xaa, 0x75, 0x0c, 0xcd, 0xe1, 0xf6, 0x06, 0x68, 0x51, 0x99, 0x94, + 0x4c, 0x3b, 0xbf, 0xa7, 0xb7, 0xf0, 0xc9, 0xbf, 0x8c, 0x16, 0x3e, 0x21, 0x25, 0xe5, 0x1f, 0x8c, + 0x80, 0x34, 0x18, 0xef, 0x0d, 0x74, 0x3f, 0x32, 0xae, 0xfb, 0x5f, 0x95, 0xb1, 0xfb, 0x68, 0x04, + 0x0a, 0xe1, 0x20, 0x6f, 0xa0, 0x79, 0x0f, 0xfd, 0x85, 0x36, 0xef, 0xb7, 0xa2, 0x90, 0x0f, 0x85, + 0x76, 0xd3, 0xb6, 0xee, 0xfd, 0x30, 0x6b, 0xb4, 0x70, 0xb7, 0x67, 0xb9, 0xd8, 0xd4, 0x8f, 0xd4, + 0x0e, 0xbe, 0x8d, 0x3b, 0x0b, 0x32, 0x35, 0xca, 0x17, 0x8f, 0x0f, 0x1e, 0x57, 0xea, 0x3e, 0xdf, + 0x06, 0x61, 0x5b, 0x9d, 0xab, 0xaf, 0xd5, 0x36, 0x77, 0xb6, 0x9b, 0xb5, 0xad, 0xea, 0x6b, 0xc2, + 0xba, 0x28, 0x92, 0x31, 0x40, 0xf6, 0x0e, 0x1a, 0xed, 0x1d, 0x90, 0x06, 0x1b, 0x45, 0x6c, 0xc5, + 0x88, 0x66, 0x49, 0x33, 0x68, 0x0e, 0x8a, 0x5b, 0xdb, 0x6a, 0xa3, 0xbe, 0x56, 0x53, 0x6b, 0xd7, + 0xae, 0xd5, 0xaa, 0xcd, 0x06, 0x4b, 0x07, 0x7a, 0xd4, 0x4d, 0x29, 0x1a, 0x14, 0xf1, 0xf7, 0xc7, + 0x60, 0x6e, 0x44, 0x4b, 0x50, 0x99, 0x07, 0xf2, 0x2c, 0xb7, 0xf0, 0xd4, 0x34, 0xad, 0x5f, 0x21, + 0xae, 0xf4, 0x8e, 0x66, 0xbb, 0x3c, 0xee, 0x7f, 0x1c, 0x88, 0x94, 0x4c, 0x97, 0xac, 0xec, 0x36, + 0x4f, 0xb3, 0xb2, 0xe8, 0xbe, 0xe8, 0x97, 0xb3, 0x4c, 0xeb, 0x93, 0x80, 0x7a, 0x96, 0x63, 0xb8, + 0xc6, 0x6d, 0xac, 0x1a, 0xa6, 0xc8, 0xc9, 0x92, 0x68, 0x3f, 0xae, 0x48, 0xa2, 0xa6, 0x6e, 0xba, + 0x1e, 0xb5, 0x89, 0xdb, 0xda, 0x00, 0x35, 0xf1, 0x3c, 0x62, 0x8a, 0x24, 0x6a, 0x3c, 0xea, 0x87, + 0x20, 0xd7, 0xb2, 0xfa, 0x24, 0x04, 0x62, 0x74, 0xc4, 0x5a, 0x44, 0x94, 0x2c, 0x2b, 0xf3, 0x48, + 0x78, 0x70, 0xeb, 0x27, 0x83, 0x73, 0x4a, 0x96, 0x95, 0x31, 0x92, 0xc7, 0xa0, 0xa8, 0xb5, 0xdb, + 0x36, 0x01, 0x17, 0x40, 0x2c, 0x5c, 0x2f, 0x78, 0xc5, 0x94, 0xb0, 0x74, 0x03, 0xd2, 0x42, 0x0e, + 0xc4, 0x83, 0x25, 0x92, 0x50, 0x7b, 0x2c, 0x07, 0x15, 0x3d, 0x9f, 0x51, 0xd2, 0xa6, 0xa8, 0x7c, + 0x08, 0x72, 0x86, 0xa3, 0xfa, 0x7b, 0x5b, 0xd1, 0xe5, 0xe8, 0xf9, 0xb4, 0x92, 0x35, 0x1c, 0x6f, + 0x5f, 0x40, 0xfe, 0xb1, 0x28, 0x14, 0xc2, 0xbb, 0x76, 0x68, 0x0d, 0xd2, 0x1d, 0x4b, 0xd7, 0xa8, + 0x6a, 0xb1, 0x2d, 0xe3, 0xf3, 0x13, 0x36, 0xfa, 0x56, 0x36, 0x38, 0xbd, 0xe2, 0x71, 0x96, 0xfe, + 0x6d, 0x04, 0xd2, 0xa2, 0x18, 0x9d, 0x86, 0x78, 0x4f, 0x73, 0x0f, 0x28, 0x5c, 0xa2, 0x12, 0x95, + 0x22, 0x0a, 0x7d, 0x26, 0xe5, 0x4e, 0x4f, 0x33, 0xa9, 0x0a, 0xf0, 0x72, 0xf2, 0x4c, 0xc6, 0xb5, + 0x83, 0xb5, 0x16, 0xcd, 0x05, 0x58, 0xdd, 0x2e, 0x36, 0x5d, 0x47, 0x8c, 0x2b, 0x2f, 0xaf, 0xf2, + 0x62, 0xf4, 0x04, 0xcc, 0xba, 0xb6, 0x66, 0x74, 0x42, 0xb4, 0x71, 0x4a, 0x2b, 0x89, 0x0a, 0x8f, + 0x78, 0x15, 0xce, 0x0a, 0xdc, 0x16, 0x76, 0x35, 0xfd, 0x00, 0xb7, 0x7c, 0xa6, 0x24, 0xcd, 0xf9, + 0x9d, 0xe1, 0x04, 0x6b, 0xbc, 0x5e, 0xf0, 0xca, 0x9f, 0x8e, 0xc2, 0xac, 0xc8, 0x5e, 0xb4, 0x3c, + 0x61, 0x6d, 0x02, 0x68, 0xa6, 0x69, 0xb9, 0x41, 0x71, 0x0d, 0xab, 0xf2, 0x10, 0xdf, 0x4a, 0xd9, + 0x63, 0x52, 0x02, 0x00, 0xa5, 0xdf, 0x8b, 0x00, 0xf8, 0x55, 0x63, 0xe5, 0xb6, 0x04, 0x59, 0xbe, + 0x27, 0x4b, 0x37, 0xf6, 0x59, 0xc2, 0x0b, 0x58, 0xd1, 0x35, 0xa3, 0x43, 0xd3, 0x92, 0x7b, 0xb8, + 0x6d, 0x98, 0x7c, 0x3f, 0x85, 0x3d, 0x88, 0xb4, 0x64, 0xdc, 0xdf, 0x9e, 0x52, 0x20, 0xed, 0xe0, + 0xae, 0x66, 0xba, 0x86, 0xce, 0x77, 0x48, 0xae, 0x9c, 0xa8, 0xf1, 0x2b, 0x0d, 0xce, 0xad, 0x78, + 0x38, 0xf2, 0x79, 0x48, 0x8b, 0x52, 0xe2, 0xf8, 0x6d, 0x6d, 0x6f, 0xd5, 0xa4, 0x19, 0x94, 0x82, + 0x58, 0xa3, 0xd6, 0x94, 0x22, 0x24, 0xec, 0x2c, 0x6f, 0xd4, 0xcb, 0x0d, 0x29, 0x5a, 0xf9, 0x6b, + 0x30, 0xa7, 0x5b, 0xdd, 0xc1, 0x17, 0x56, 0xa4, 0x81, 0x94, 0x9f, 0x73, 0x3d, 0xf2, 0xfa, 0x53, + 0x9c, 0xa8, 0x6d, 0x75, 0x34, 0xb3, 0xbd, 0x62, 0xd9, 0x6d, 0xff, 0x58, 0x04, 0x89, 0x0e, 0x9c, + 0xc0, 0xe1, 0x88, 0xde, 0xde, 0xff, 0x88, 0x44, 0x7e, 0x28, 0x1a, 0x5b, 0xdf, 0xa9, 0xfc, 0x44, + 0xb4, 0xb4, 0xce, 0x18, 0x77, 0x44, 0x77, 0x14, 0xbc, 0xdf, 0xc1, 0x3a, 0x69, 0x3c, 0xfc, 0xfe, + 0x13, 0x30, 0xdf, 0xb6, 0xda, 0x16, 0x45, 0xba, 0x48, 0x7e, 0xf1, 0x73, 0x15, 0x19, 0xaf, 0xb4, + 0x34, 0xf1, 0x10, 0xc6, 0xea, 0x16, 0xcc, 0x71, 0x62, 0x95, 0x6e, 0xdf, 0xb2, 0xe4, 0x02, 0x3a, + 0x36, 0xb3, 0xbd, 0xf0, 0x53, 0xbf, 0x43, 0xbd, 0x12, 0x65, 0x96, 0xb3, 0x92, 0x3a, 0x96, 0x7f, + 0x58, 0x55, 0xe0, 0x54, 0x08, 0x8f, 0xd9, 0x08, 0x6c, 0x4f, 0x40, 0xfc, 0x17, 0x1c, 0x71, 0x2e, + 0x80, 0xd8, 0xe0, 0xac, 0xab, 0x55, 0xc8, 0x9f, 0x04, 0xeb, 0x5f, 0x72, 0xac, 0x1c, 0x0e, 0x82, + 0xac, 0x43, 0x91, 0x82, 0xe8, 0x7d, 0xc7, 0xb5, 0xba, 0xd4, 0x00, 0x1f, 0x0f, 0xf3, 0xaf, 0x7e, + 0x87, 0x4d, 0xda, 0x02, 0x61, 0xab, 0x7a, 0x5c, 0xab, 0xab, 0x40, 0x77, 0xac, 0x5b, 0x58, 0xef, + 0x4c, 0x40, 0xf8, 0x55, 0xde, 0x10, 0x8f, 0x7e, 0xf5, 0x26, 0xcc, 0x93, 0xdf, 0xd4, 0x3e, 0x06, + 0x5b, 0x32, 0x39, 0x0d, 0xbe, 0xf0, 0xef, 0x3e, 0xc8, 0xec, 0xc2, 0x9c, 0x07, 0x10, 0x68, 0x53, + 0x60, 0x14, 0xdb, 0xd8, 0x75, 0xb1, 0xed, 0xa8, 0x5a, 0x67, 0x54, 0xf3, 0x02, 0x79, 0xc4, 0x85, + 0xef, 0xfb, 0x42, 0x78, 0x14, 0xd7, 0x19, 0x67, 0xb9, 0xd3, 0x59, 0xdd, 0x85, 0x33, 0x23, 0xb4, + 0x62, 0x0a, 0xcc, 0xef, 0xe7, 0x98, 0xf3, 0x43, 0x9a, 0x41, 0x60, 0x77, 0x40, 0x94, 0x7b, 0x63, + 0x39, 0x05, 0xe6, 0x0f, 0x70, 0x4c, 0xc4, 0x79, 0xc5, 0x90, 0x12, 0xc4, 0x1b, 0x30, 0x7b, 0x1b, + 0xdb, 0x7b, 0x96, 0xc3, 0x73, 0xb7, 0x53, 0xc0, 0x7d, 0x94, 0xc3, 0x15, 0x39, 0x23, 0x4d, 0xe6, + 0x12, 0xac, 0x17, 0x21, 0xbd, 0xaf, 0xe9, 0x78, 0x0a, 0x88, 0x7b, 0x1c, 0x22, 0x45, 0xe8, 0x09, + 0x6b, 0x19, 0x72, 0x6d, 0x8b, 0x2f, 0x91, 0x93, 0xd9, 0x7f, 0x90, 0xb3, 0x67, 0x05, 0x0f, 0x87, + 0xe8, 0x59, 0xbd, 0x7e, 0x87, 0xac, 0x9f, 0x93, 0x21, 0xfe, 0x8e, 0x80, 0x10, 0x3c, 0x1c, 0xe2, + 0x04, 0x62, 0xfd, 0x98, 0x80, 0x70, 0x02, 0xf2, 0x7c, 0x09, 0xb2, 0x96, 0xd9, 0x39, 0xb2, 0xcc, + 0x69, 0x1a, 0xf1, 0x71, 0x8e, 0x00, 0x9c, 0x85, 0x00, 0x5c, 0x85, 0xcc, 0xb4, 0x03, 0xf1, 0x23, + 0x5f, 0x10, 0xd3, 0x43, 0x8c, 0xc0, 0x3a, 0x14, 0x85, 0x81, 0x32, 0x2c, 0x73, 0x0a, 0x88, 0x1f, + 0xe5, 0x10, 0x85, 0x00, 0x1b, 0xef, 0x86, 0x8b, 0x1d, 0xb7, 0x8d, 0xa7, 0x01, 0xf9, 0x31, 0xd1, + 0x0d, 0xce, 0xc2, 0x45, 0xb9, 0x87, 0x4d, 0xfd, 0x60, 0x3a, 0x84, 0x4f, 0x08, 0x51, 0x0a, 0x1e, + 0x02, 0x51, 0x85, 0x7c, 0x57, 0xb3, 0x9d, 0x03, 0xad, 0x33, 0xd5, 0x70, 0xfc, 0x38, 0xc7, 0xc8, + 0x79, 0x4c, 0x5c, 0x22, 0x7d, 0xf3, 0x24, 0x30, 0x3f, 0x21, 0x24, 0x12, 0x60, 0xe3, 0x53, 0xcf, + 0x71, 0x69, 0xa2, 0xfb, 0x24, 0x68, 0x7f, 0x4f, 0x4c, 0x3d, 0xc6, 0xbb, 0x19, 0x44, 0xbc, 0x0a, + 0x19, 0xc7, 0x78, 0x73, 0x2a, 0x98, 0xbf, 0x2f, 0x46, 0x9a, 0x32, 0x10, 0xe6, 0xd7, 0xe0, 0xec, + 0xc8, 0x65, 0x62, 0x0a, 0xb0, 0x7f, 0xc0, 0xc1, 0x4e, 0x8f, 0x58, 0x2a, 0xb8, 0x49, 0x38, 0x29, + 0xe4, 0x3f, 0x14, 0x26, 0x01, 0x0f, 0x60, 0xed, 0x90, 0xa0, 0xc5, 0xd1, 0xf6, 0x4f, 0x26, 0xb5, + 0x7f, 0x24, 0xa4, 0xc6, 0x78, 0x43, 0x52, 0x6b, 0xc2, 0x69, 0x8e, 0x78, 0xb2, 0x71, 0xfd, 0x49, + 0x61, 0x58, 0x19, 0xf7, 0x6e, 0x78, 0x74, 0xbf, 0x06, 0x4a, 0x9e, 0x38, 0x85, 0x77, 0xec, 0xa8, + 0x5d, 0xad, 0x37, 0x05, 0xf2, 0x4f, 0x71, 0x64, 0x61, 0xf1, 0x3d, 0xf7, 0xda, 0xd9, 0xd4, 0x7a, + 0x04, 0xfc, 0x55, 0x58, 0x10, 0xe0, 0x7d, 0xd3, 0xc6, 0xba, 0xd5, 0x36, 0x8d, 0x37, 0x71, 0x6b, + 0x0a, 0xe8, 0x9f, 0x1e, 0x18, 0xaa, 0xdd, 0x00, 0x3b, 0x41, 0xae, 0x83, 0xe4, 0xf9, 0x2a, 0xaa, + 0xd1, 0xed, 0x59, 0xb6, 0x3b, 0x01, 0xf1, 0x67, 0xc4, 0x48, 0x79, 0x7c, 0x75, 0xca, 0xb6, 0x5a, + 0x03, 0x76, 0xfa, 0x63, 0x5a, 0x95, 0xfc, 0x24, 0x07, 0xca, 0xfb, 0x5c, 0xdc, 0x70, 0xe8, 0x56, + 0xb7, 0xa7, 0xd9, 0xd3, 0xd8, 0xbf, 0x7f, 0x2c, 0x0c, 0x07, 0x67, 0xe1, 0x86, 0x83, 0x78, 0x74, + 0x64, 0xb5, 0x9f, 0x02, 0xe1, 0x67, 0x85, 0xe1, 0x10, 0x3c, 0x1c, 0x42, 0x38, 0x0c, 0x53, 0x40, + 0x7c, 0x4a, 0x40, 0x08, 0x1e, 0x02, 0xf1, 0x3e, 0x7f, 0xa1, 0xb5, 0x71, 0xdb, 0x70, 0x5c, 0x9b, + 0xb9, 0xe4, 0xc7, 0x43, 0xfd, 0xdc, 0x17, 0xc2, 0x4e, 0x98, 0x12, 0x60, 0x25, 0x96, 0x88, 0x6f, + 0x7d, 0xd0, 0x90, 0x6d, 0x72, 0xc3, 0x7e, 0x5e, 0x58, 0xa2, 0x00, 0x1b, 0x69, 0x5b, 0xc0, 0x43, + 0x24, 0x62, 0xd7, 0x49, 0xa0, 0x32, 0x05, 0xdc, 0x3f, 0x19, 0x68, 0x5c, 0x43, 0xf0, 0x12, 0xcc, + 0x80, 0xff, 0xd3, 0x37, 0x6f, 0xe1, 0xa3, 0xa9, 0xb4, 0xf3, 0x17, 0x06, 0xfc, 0x9f, 0x5d, 0xc6, + 0xc9, 0x6c, 0x48, 0x71, 0xc0, 0x9f, 0x42, 0x93, 0xce, 0xfa, 0x2d, 0x7c, 0xe3, 0x97, 0x78, 0x7f, + 0xc3, 0xee, 0xd4, 0xea, 0x06, 0x51, 0xf2, 0xb0, 0xd3, 0x33, 0x19, 0xec, 0x83, 0x5f, 0xf2, 0xf4, + 0x3c, 0xe4, 0xf3, 0xac, 0x5e, 0x83, 0x7c, 0xc8, 0xe1, 0x99, 0x0c, 0xf5, 0xcd, 0x1c, 0x2a, 0x17, + 0xf4, 0x77, 0x56, 0x2f, 0x43, 0x9c, 0x38, 0x2f, 0x93, 0xd9, 0xbf, 0x85, 0xb3, 0x53, 0xf2, 0xd5, + 0xf7, 0x40, 0x5a, 0x38, 0x2d, 0x93, 0x59, 0xff, 0x3a, 0x67, 0xf5, 0x58, 0x08, 0xbb, 0x70, 0x58, + 0x26, 0xb3, 0xff, 0x0d, 0xc1, 0x2e, 0x58, 0x08, 0xfb, 0xf4, 0x22, 0xfc, 0xe5, 0xbf, 0x19, 0xe7, + 0x8b, 0x8e, 0x90, 0xdd, 0x55, 0x48, 0x71, 0x4f, 0x65, 0x32, 0xf7, 0xb7, 0xf2, 0x97, 0x0b, 0x8e, + 0xd5, 0xe7, 0x21, 0x31, 0xa5, 0xc0, 0xff, 0x16, 0x67, 0x65, 0xf4, 0xab, 0x55, 0xc8, 0x06, 0xbc, + 0x93, 0xc9, 0xec, 0xdf, 0xce, 0xd9, 0x83, 0x5c, 0xa4, 0xe9, 0xdc, 0x3b, 0x99, 0x0c, 0xf0, 0x1d, + 0xa2, 0xe9, 0x9c, 0x83, 0x88, 0x4d, 0x38, 0x26, 0x93, 0xb9, 0x3f, 0x2c, 0xa4, 0x2e, 0x58, 0x56, + 0x5f, 0x82, 0x8c, 0xb7, 0xd8, 0x4c, 0xe6, 0xff, 0x4e, 0xce, 0xef, 0xf3, 0x10, 0x09, 0x04, 0x16, + 0xbb, 0xc9, 0x10, 0xdf, 0x25, 0x24, 0x10, 0xe0, 0x22, 0xd3, 0x68, 0xd0, 0x81, 0x99, 0x8c, 0xf4, + 0xdd, 0x62, 0x1a, 0x0d, 0xf8, 0x2f, 0x64, 0x34, 0xa9, 0xcd, 0x9f, 0x0c, 0xf1, 0x3d, 0x62, 0x34, + 0x29, 0x3d, 0x69, 0xc6, 0xa0, 0x47, 0x30, 0x19, 0xe3, 0x7b, 0x45, 0x33, 0x06, 0x1c, 0x82, 0xd5, + 0x1d, 0x40, 0xc3, 0xde, 0xc0, 0x64, 0xbc, 0x8f, 0x70, 0xbc, 0xd9, 0x21, 0x67, 0x60, 0xf5, 0x15, + 0x38, 0x3d, 0xda, 0x13, 0x98, 0x8c, 0xfa, 0x7d, 0x5f, 0x1a, 0x88, 0xdd, 0x82, 0x8e, 0xc0, 0x6a, + 0xd3, 0x5f, 0x52, 0x82, 0x5e, 0xc0, 0x64, 0xd8, 0xef, 0xff, 0x52, 0xd8, 0x70, 0x07, 0x9d, 0x80, + 0xd5, 0x32, 0x80, 0xbf, 0x00, 0x4f, 0xc6, 0xfa, 0x28, 0xc7, 0x0a, 0x30, 0x91, 0xa9, 0xc1, 0xd7, + 0xdf, 0xc9, 0xfc, 0xf7, 0xc4, 0xd4, 0xe0, 0x1c, 0x64, 0x6a, 0x88, 0xa5, 0x77, 0x32, 0xf7, 0x0f, + 0x8a, 0xa9, 0x21, 0x58, 0x88, 0x66, 0x07, 0x56, 0xb7, 0xc9, 0x08, 0x1f, 0x17, 0x9a, 0x1d, 0xe0, + 0x5a, 0xdd, 0x82, 0xd9, 0xa1, 0x05, 0x71, 0x32, 0xd4, 0x0f, 0x71, 0x28, 0x69, 0x70, 0x3d, 0x0c, + 0x2e, 0x5e, 0x7c, 0x31, 0x9c, 0x8c, 0xf6, 0xc3, 0x03, 0x8b, 0x17, 0x5f, 0x0b, 0x57, 0xaf, 0x42, + 0xda, 0xec, 0x77, 0x3a, 0x64, 0xf2, 0xa0, 0xe3, 0xcf, 0xe7, 0x2e, 0xfc, 0xd7, 0x2f, 0x73, 0xe9, + 0x08, 0x86, 0xd5, 0xcb, 0x90, 0xc0, 0xdd, 0x3d, 0xdc, 0x9a, 0xc4, 0xf9, 0xf9, 0x2f, 0x0b, 0x83, + 0x49, 0xa8, 0x57, 0x5f, 0x02, 0x60, 0xa9, 0x11, 0xba, 0x71, 0x3e, 0x81, 0xf7, 0xf7, 0xbe, 0xcc, + 0x0f, 0xc4, 0xf9, 0x2c, 0x3e, 0x00, 0x3b, 0x5e, 0x77, 0x3c, 0xc0, 0x17, 0xc2, 0x00, 0x74, 0x44, + 0x5e, 0x84, 0xd4, 0x1b, 0x8e, 0x65, 0xba, 0x5a, 0x7b, 0x12, 0xf7, 0xef, 0x73, 0x6e, 0x41, 0x4f, + 0x04, 0xd6, 0xb5, 0x6c, 0xec, 0x6a, 0x6d, 0x67, 0x12, 0xef, 0x7f, 0xe3, 0xbc, 0x1e, 0x03, 0x61, + 0xd6, 0x35, 0xc7, 0x9d, 0xa6, 0xdf, 0x7f, 0x20, 0x98, 0x05, 0x03, 0x69, 0x34, 0xf9, 0x7d, 0x0b, + 0x1f, 0x4d, 0xe2, 0xfd, 0x43, 0xd1, 0x68, 0x4e, 0xbf, 0xfa, 0x1e, 0xc8, 0x90, 0x9f, 0xec, 0x94, + 0xeb, 0x04, 0xe6, 0x3f, 0xe2, 0xcc, 0x3e, 0x07, 0x79, 0xb3, 0xe3, 0xb6, 0x5c, 0x63, 0xb2, 0xb0, + 0xbf, 0xc8, 0x47, 0x5a, 0xd0, 0xaf, 0x96, 0x21, 0xeb, 0xb8, 0xad, 0x56, 0x9f, 0xfb, 0xa7, 0x13, + 0xd8, 0xff, 0xf8, 0xcb, 0x5e, 0xca, 0xc2, 0xe3, 0x21, 0xa3, 0x7d, 0xe7, 0x96, 0xdb, 0xb3, 0xe8, + 0x7e, 0xcb, 0x24, 0x84, 0x2f, 0x71, 0x84, 0x00, 0xcb, 0x6a, 0x15, 0x72, 0xa4, 0x2f, 0x36, 0xee, + 0x61, 0xba, 0x39, 0x36, 0x01, 0xe2, 0x4f, 0xb8, 0x00, 0x42, 0x4c, 0x95, 0x6f, 0xf8, 0xd5, 0xcf, + 0x2c, 0x46, 0x3e, 0xfd, 0x99, 0xc5, 0xc8, 0x6f, 0x7d, 0x66, 0x31, 0xf2, 0xe1, 0xcf, 0x2e, 0xce, + 0x7c, 0xfa, 0xb3, 0x8b, 0x33, 0xbf, 0xf9, 0xd9, 0xc5, 0x99, 0xd1, 0x59, 0x62, 0x58, 0xb7, 0xd6, + 0x2d, 0x96, 0x1f, 0x7e, 0xfd, 0x91, 0xb6, 0xe1, 0x1e, 0xf4, 0xf7, 0x56, 0x74, 0xab, 0x7b, 0x51, + 0xb7, 0x9c, 0xae, 0xe5, 0x5c, 0x0c, 0xe7, 0x75, 0xe9, 0x2f, 0xf8, 0x5f, 0x11, 0x12, 0x33, 0x87, + 0xd3, 0xb9, 0x9a, 0x79, 0x34, 0xee, 0x63, 0xba, 0x2b, 0x10, 0x2b, 0x9b, 0x47, 0xe8, 0x2c, 0x33, + 0x70, 0x6a, 0xdf, 0xee, 0xf0, 0xa3, 0x96, 0x29, 0xf2, 0xbc, 0x6b, 0x77, 0xd0, 0xbc, 0x7f, 0x1e, + 0x3a, 0x72, 0x3e, 0xc7, 0x0f, 0x39, 0x57, 0xbe, 0x3d, 0x72, 0xb2, 0x9e, 0xa4, 0xcb, 0xe6, 0x11, + 0xed, 0xc8, 0x4e, 0xe4, 0xf5, 0x27, 0x27, 0xe6, 0xb9, 0x6f, 0x99, 0xd6, 0x1d, 0x93, 0x34, 0xbb, + 0xb7, 0x27, 0x72, 0xdc, 0x8b, 0x83, 0x39, 0xee, 0x57, 0x70, 0xa7, 0xf3, 0x32, 0xa1, 0x6b, 0x12, + 0x96, 0xbd, 0x24, 0x3b, 0xd5, 0x0f, 0xdf, 0x1d, 0x85, 0xc5, 0xa1, 0x74, 0x36, 0x57, 0x82, 0x71, + 0x42, 0x58, 0x85, 0xf4, 0x9a, 0xd0, 0xad, 0x05, 0x48, 0x39, 0x58, 0xb7, 0xcc, 0x96, 0x43, 0x05, + 0x11, 0x53, 0xc4, 0x23, 0x11, 0x84, 0xa9, 0x99, 0x96, 0xc3, 0x0f, 0x2b, 0xb3, 0x87, 0xca, 0x0f, + 0x9c, 0x50, 0x10, 0x79, 0xf1, 0x26, 0x21, 0x8d, 0x67, 0xa6, 0x94, 0x86, 0xe8, 0x44, 0x28, 0xf3, + 0x3f, 0xad, 0x54, 0xbe, 0x37, 0x0a, 0x4b, 0x83, 0x52, 0x21, 0x33, 0xcb, 0x71, 0xb5, 0x6e, 0x6f, + 0x9c, 0x58, 0xae, 0x42, 0xa6, 0x29, 0x68, 0x4e, 0x2c, 0x97, 0x7b, 0x27, 0x94, 0x4b, 0xc1, 0x7b, + 0x95, 0x10, 0xcc, 0xa5, 0x29, 0x05, 0xe3, 0xf5, 0xe3, 0xbe, 0x24, 0xf3, 0x67, 0x49, 0x38, 0xcb, + 0xa6, 0x93, 0xca, 0xa6, 0x12, 0x7b, 0xe0, 0x32, 0xc9, 0x05, 0xab, 0x26, 0xef, 0x93, 0xc8, 0x2f, + 0xc3, 0x5c, 0x9d, 0x58, 0x0b, 0x12, 0x05, 0xf9, 0x3b, 0x3c, 0x23, 0xcf, 0x73, 0x2f, 0x87, 0x1c, + 0x7e, 0xbe, 0xbf, 0x15, 0x2c, 0x92, 0xbf, 0x31, 0x02, 0x52, 0x43, 0xd7, 0x3a, 0x9a, 0xfd, 0x95, + 0x42, 0xa1, 0xe7, 0x01, 0xd8, 0x71, 0x0f, 0xef, 0xc3, 0xbd, 0xc2, 0xa5, 0x85, 0x95, 0x60, 0xe7, + 0x56, 0xd8, 0x9b, 0xe8, 0x09, 0xaa, 0x0c, 0xa5, 0x25, 0x3f, 0x2f, 0xbc, 0x0a, 0xe0, 0x57, 0xa0, + 0x73, 0x70, 0xa6, 0x51, 0x2d, 0x6f, 0x94, 0x15, 0x71, 0x48, 0xa8, 0xb1, 0x53, 0xab, 0xd6, 0xaf, + 0xd5, 0x6b, 0x6b, 0xd2, 0x0c, 0x3a, 0x0d, 0x28, 0x58, 0xe9, 0x1d, 0x6a, 0x3a, 0x05, 0xb3, 0xc1, + 0x72, 0xf6, 0x95, 0x4a, 0x94, 0x78, 0x8a, 0x46, 0xb7, 0xd7, 0xc1, 0x74, 0xe7, 0x51, 0x35, 0x84, + 0xd4, 0x26, 0x3b, 0x21, 0xbf, 0xf6, 0xef, 0xd9, 0x97, 0x0b, 0x73, 0x3e, 0xbb, 0x27, 0xf3, 0xd5, + 0x0d, 0x98, 0xd5, 0x74, 0x1d, 0xf7, 0x42, 0x90, 0x13, 0x4c, 0x35, 0x01, 0xa4, 0x7b, 0xa9, 0x9c, + 0xd3, 0x47, 0x7b, 0x1e, 0x92, 0x0e, 0xed, 0xfd, 0x24, 0x88, 0x5f, 0xe7, 0x10, 0x9c, 0x7c, 0xd5, + 0x84, 0x59, 0xe2, 0xf9, 0x69, 0x36, 0x0e, 0x34, 0xe3, 0xf8, 0x3c, 0xc3, 0x2f, 0xfe, 0xcc, 0xd3, + 0x74, 0x67, 0xf5, 0xa1, 0xf0, 0xb0, 0x8c, 0x50, 0x27, 0x45, 0xe2, 0xd8, 0x7e, 0x43, 0x31, 0x14, + 0xc4, 0xfb, 0x78, 0x83, 0x8f, 0x7f, 0xd9, 0x2f, 0xf1, 0x97, 0x2d, 0x8e, 0xd2, 0x81, 0xc0, 0x9b, + 0xf2, 0x1c, 0x95, 0x55, 0x54, 0x6a, 0xe3, 0xe6, 0xf4, 0xeb, 0x4f, 0x0c, 0xaf, 0x4e, 0xec, 0xbf, + 0xa7, 0x28, 0xf2, 0xd5, 0xe0, 0x6b, 0xbc, 0xb9, 0xf7, 0x03, 0x71, 0x98, 0xd5, 0xba, 0x86, 0x69, + 0x5d, 0xa4, 0xff, 0xf2, 0x39, 0x97, 0xa0, 0x0f, 0x53, 0x6c, 0x4a, 0x5e, 0x61, 0x53, 0x61, 0xb2, + 0xc6, 0xfc, 0xd1, 0xb7, 0xfd, 0x68, 0xc2, 0x9f, 0x2e, 0xab, 0x9b, 0x20, 0x89, 0x43, 0xbc, 0xd8, + 0xd4, 0xad, 0xd6, 0x54, 0x59, 0x8a, 0x2f, 0x0a, 0x0c, 0x91, 0xdf, 0xaa, 0x71, 0xd6, 0xd5, 0x77, + 0x43, 0xda, 0x83, 0x99, 0xe4, 0x99, 0x08, 0x10, 0x8f, 0x83, 0xf8, 0x25, 0x6c, 0x66, 0x4e, 0xe3, + 0x85, 0x7e, 0x49, 0xf0, 0xb3, 0x19, 0xba, 0x45, 0x7a, 0xb3, 0x0e, 0x85, 0x96, 0x65, 0xba, 0xaa, + 0xd5, 0x35, 0x5c, 0xdc, 0xed, 0xb9, 0x13, 0xfd, 0xba, 0x3f, 0x61, 0x20, 0x69, 0x25, 0x4f, 0xf8, + 0xb6, 0x05, 0x1b, 0x69, 0x09, 0xfb, 0x4e, 0x6f, 0x9a, 0x96, 0xfc, 0x77, 0xaf, 0x25, 0x94, 0x87, + 0xb4, 0xe4, 0xbe, 0xb4, 0xc3, 0x69, 0xdd, 0xe2, 0xc6, 0xdc, 0x3d, 0x64, 0x5a, 0xe0, 0x69, 0xc7, + 0x1f, 0xc4, 0x60, 0x91, 0x13, 0xef, 0x69, 0x0e, 0xbe, 0x78, 0xfb, 0x99, 0x3d, 0xec, 0x6a, 0xcf, + 0x5c, 0xd4, 0x2d, 0x43, 0xac, 0xe4, 0x73, 0xdc, 0x58, 0x93, 0xfa, 0x15, 0x5e, 0x5f, 0x1a, 0xb9, + 0xdd, 0x5d, 0x1a, 0x6f, 0xe4, 0x4b, 0xc3, 0x3a, 0x28, 0xbf, 0x0e, 0xf1, 0xaa, 0x65, 0x98, 0x64, + 0x6d, 0x6b, 0x61, 0xd3, 0xea, 0x72, 0x73, 0xcb, 0x1e, 0xd0, 0x15, 0x48, 0x6a, 0x5d, 0xab, 0x6f, + 0xba, 0xcc, 0xd4, 0x56, 0x16, 0x7f, 0xf5, 0xad, 0xa5, 0x99, 0xff, 0xf8, 0xd6, 0x52, 0xac, 0x6e, + 0xba, 0xbf, 0xf1, 0xc9, 0xa7, 0x80, 0xa3, 0xd7, 0x4d, 0xf7, 0x13, 0xbf, 0xfb, 0x93, 0x17, 0x22, + 0x0a, 0xa7, 0x5e, 0x8d, 0x7f, 0xee, 0x63, 0x4b, 0x11, 0xf9, 0x55, 0x48, 0xad, 0x61, 0xfd, 0x18, + 0xf8, 0x67, 0x06, 0xe0, 0xcf, 0x0a, 0xf8, 0x35, 0xac, 0x07, 0xe0, 0xd7, 0xb0, 0x3e, 0x80, 0xfc, + 0x3c, 0xa4, 0xeb, 0xa6, 0xcb, 0x3e, 0x21, 0x7a, 0x02, 0x62, 0x86, 0xc9, 0x4e, 0xa5, 0x07, 0x10, + 0x86, 0x1a, 0xa8, 0x10, 0x2a, 0xc2, 0xb8, 0x86, 0x75, 0x8f, 0xb1, 0x85, 0xf5, 0x41, 0xc6, 0xe1, + 0x57, 0x13, 0xaa, 0xca, 0xda, 0x6f, 0xfe, 0xf6, 0xe2, 0xcc, 0x07, 0x3e, 0xb3, 0x38, 0x33, 0x76, + 0xe8, 0xe5, 0xc9, 0x43, 0xef, 0x8d, 0xf8, 0x8f, 0xc6, 0xe1, 0x41, 0xfa, 0x65, 0xa9, 0xdd, 0x35, + 0x4c, 0xf7, 0xa2, 0x6e, 0x1f, 0xf5, 0x5c, 0x8b, 0x18, 0x00, 0x6b, 0x9f, 0x0f, 0xf8, 0xac, 0x5f, + 0xbd, 0xc2, 0xaa, 0x47, 0x0f, 0xb7, 0xbc, 0x0f, 0x89, 0x1d, 0xc2, 0x47, 0x44, 0xec, 0x5a, 0xae, + 0xd6, 0xe1, 0x5e, 0x0b, 0x7b, 0x20, 0xa5, 0xec, 0x6b, 0xd4, 0x28, 0x2b, 0x35, 0xc4, 0x87, 0xa8, + 0x1d, 0xac, 0xed, 0xb3, 0x8f, 0x7a, 0x62, 0xd4, 0xdd, 0x4d, 0x93, 0x02, 0xfa, 0xfd, 0xce, 0x3c, + 0x24, 0xb4, 0x3e, 0x3b, 0x78, 0x13, 0x23, 0x7e, 0x30, 0x7d, 0x90, 0x5f, 0x86, 0x14, 0xdf, 0x7f, + 0x47, 0x12, 0xc4, 0x6e, 0xe1, 0x23, 0xfa, 0x9e, 0x9c, 0x42, 0x7e, 0xa2, 0x15, 0x48, 0xd0, 0xc6, + 0xf3, 0xaf, 0x15, 0x17, 0x56, 0x86, 0x5a, 0xbf, 0x42, 0x1b, 0xa9, 0x30, 0x32, 0xf9, 0x06, 0xa4, + 0xd7, 0x2c, 0xa2, 0x85, 0x61, 0xb4, 0x0c, 0x43, 0xa3, 0x6d, 0xee, 0xf5, 0xb9, 0x56, 0x28, 0xec, + 0x01, 0x9d, 0x86, 0x24, 0xfb, 0xc8, 0x8b, 0x1f, 0x1e, 0xe2, 0x4f, 0x72, 0x15, 0x52, 0x14, 0x7b, + 0xbb, 0x47, 0x5c, 0x06, 0xef, 0xdc, 0x7b, 0x86, 0x7f, 0xf2, 0xcb, 0xe1, 0xa3, 0x7e, 0x63, 0x11, + 0xc4, 0x5b, 0x9a, 0xab, 0xf1, 0x7e, 0xd3, 0xdf, 0xf2, 0x7b, 0x21, 0xcd, 0x41, 0x1c, 0x74, 0x09, + 0x62, 0x56, 0xcf, 0xe1, 0xc7, 0x7f, 0x4a, 0xe3, 0xba, 0xb2, 0xdd, 0xab, 0xc4, 0x89, 0xce, 0x28, + 0x84, 0xb8, 0xb2, 0x35, 0x56, 0x2d, 0x9e, 0x0b, 0xa9, 0x45, 0x17, 0xbb, 0x7b, 0xfb, 0xae, 0xff, + 0x83, 0x0d, 0xe7, 0x90, 0x2a, 0x78, 0x8a, 0x72, 0x2f, 0x0a, 0x8b, 0x81, 0xda, 0xdb, 0xd8, 0x76, + 0x0c, 0xcb, 0x64, 0xda, 0xc4, 0x35, 0x05, 0x05, 0x1a, 0xc8, 0xeb, 0xc7, 0xa8, 0xca, 0x7b, 0x20, + 0x56, 0xee, 0xf5, 0x50, 0x09, 0xd2, 0xf4, 0x59, 0xb7, 0x98, 0xae, 0xc4, 0x15, 0xef, 0x99, 0xd4, + 0x39, 0xd6, 0xbe, 0x7b, 0x47, 0xb3, 0xbd, 0x6f, 0xa0, 0xc5, 0xb3, 0xfc, 0x22, 0x64, 0xaa, 0x96, + 0xe9, 0x60, 0xd3, 0xe9, 0x53, 0x5f, 0x78, 0xaf, 0x63, 0xe9, 0xb7, 0x38, 0x02, 0x7b, 0x20, 0xc2, + 0xd6, 0x7a, 0x3d, 0xca, 0x19, 0x57, 0xc8, 0x4f, 0x36, 0x5f, 0x2b, 0xdb, 0x63, 0xc5, 0x73, 0xf9, + 0x64, 0xe2, 0xe1, 0x1d, 0xf4, 0x9d, 0xda, 0x08, 0x3c, 0x30, 0x3c, 0x91, 0x6e, 0xe1, 0x23, 0xe7, + 0xa4, 0xf3, 0xe8, 0x55, 0xc8, 0xec, 0xd0, 0xeb, 0x49, 0x5e, 0xc6, 0x47, 0xa8, 0x04, 0x29, 0xdc, + 0xba, 0x74, 0xf9, 0xf2, 0x33, 0x2f, 0x32, 0x2d, 0xbf, 0x3e, 0xa3, 0x88, 0x02, 0xb4, 0x08, 0x19, + 0x07, 0xeb, 0xbd, 0x4b, 0x97, 0xaf, 0xdc, 0x7a, 0x86, 0xa9, 0xd5, 0xf5, 0x19, 0xc5, 0x2f, 0x5a, + 0x4d, 0x93, 0x1e, 0x7f, 0xee, 0xe3, 0x4b, 0x91, 0x4a, 0x02, 0x62, 0x4e, 0xbf, 0xfb, 0x8e, 0xe9, + 0xc6, 0x1f, 0x26, 0x61, 0x39, 0x50, 0xcb, 0x16, 0x97, 0xdb, 0x5a, 0xc7, 0x68, 0x69, 0xfe, 0xa5, + 0x32, 0x52, 0xa0, 0xff, 0x94, 0x62, 0xcc, 0xaa, 0x71, 0xac, 0x14, 0xe5, 0x9f, 0x8e, 0x40, 0xee, + 0xa6, 0x40, 0x6e, 0x60, 0x17, 0x5d, 0x05, 0xf0, 0xde, 0x24, 0xa6, 0xca, 0xb9, 0x95, 0xc1, 0x77, + 0xad, 0x78, 0x3c, 0x4a, 0x80, 0x1c, 0x3d, 0x4f, 0x15, 0xb0, 0x67, 0x39, 0xfc, 0x7b, 0xd8, 0x09, + 0xac, 0x1e, 0x31, 0x7a, 0x12, 0x10, 0xb5, 0x6a, 0xea, 0x6d, 0xcb, 0x35, 0xcc, 0xb6, 0xda, 0xb3, + 0xee, 0xf0, 0x5b, 0x06, 0x62, 0x8a, 0x44, 0x6b, 0x6e, 0xd2, 0x8a, 0x1d, 0x52, 0x4e, 0x1a, 0x9d, + 0xf1, 0x50, 0x48, 0x58, 0xa7, 0xb5, 0x5a, 0x36, 0x76, 0x1c, 0x6e, 0xb8, 0xc4, 0x23, 0xba, 0x0a, + 0xa9, 0x5e, 0x7f, 0x4f, 0x15, 0x56, 0x22, 0x7b, 0xe9, 0x81, 0x51, 0x73, 0x5e, 0xe8, 0x06, 0x9f, + 0xf5, 0xc9, 0x5e, 0x7f, 0x8f, 0x68, 0xca, 0x43, 0x90, 0x1b, 0xd1, 0x98, 0xec, 0x6d, 0xbf, 0x1d, + 0xf4, 0x46, 0x1c, 0xde, 0x03, 0xb5, 0x67, 0x1b, 0x96, 0x6d, 0xb8, 0x47, 0xf4, 0xd8, 0x5e, 0x4c, + 0x91, 0x44, 0xc5, 0x0e, 0x2f, 0x97, 0x6f, 0x41, 0xb1, 0x41, 0xdd, 0x7d, 0xbf, 0xe5, 0x97, 0xfd, + 0xf6, 0x45, 0x26, 0xb7, 0x6f, 0x6c, 0xcb, 0xa2, 0x43, 0x2d, 0xbb, 0xf0, 0x1f, 0x22, 0x90, 0xad, + 0x90, 0x89, 0x5b, 0x5f, 0xbb, 0xd6, 0xd1, 0xda, 0xe8, 0x19, 0x38, 0x55, 0xd9, 0xd8, 0xae, 0xbe, + 0xac, 0xd6, 0xd7, 0xd4, 0x6b, 0x1b, 0xe5, 0x75, 0xff, 0x9c, 0x70, 0xe9, 0xf4, 0xdd, 0x7b, 0xcb, + 0x28, 0x40, 0xbb, 0x6b, 0xd2, 0x98, 0x14, 0x5d, 0x84, 0xf9, 0x30, 0x4b, 0xb9, 0xd2, 0xa8, 0x6d, + 0x35, 0xa5, 0x48, 0xe9, 0xd4, 0xdd, 0x7b, 0xcb, 0xb3, 0x01, 0x8e, 0xf2, 0x9e, 0x83, 0x4d, 0x77, + 0x98, 0xa1, 0xba, 0xbd, 0xb9, 0x59, 0x6f, 0x4a, 0xd1, 0x21, 0x86, 0xaa, 0xd5, 0xed, 0x1a, 0x2e, + 0x7a, 0x1c, 0x66, 0xc3, 0x0c, 0x5b, 0xf5, 0x0d, 0x29, 0x56, 0x42, 0x77, 0xef, 0x2d, 0x17, 0x02, + 0xd4, 0x5b, 0x46, 0xa7, 0x94, 0xfe, 0xd0, 0x0f, 0x2f, 0xce, 0x7c, 0xe2, 0xef, 0x2e, 0x46, 0x2a, + 0x9b, 0x63, 0xe7, 0xdc, 0xb3, 0x27, 0x9b, 0x73, 0xe1, 0x75, 0xfb, 0xcb, 0x0f, 0x84, 0xcc, 0x0d, + 0xf7, 0xe7, 0x02, 0xc6, 0x78, 0xda, 0xe9, 0x36, 0x29, 0x47, 0x51, 0x3a, 0xde, 0x3d, 0x28, 0x4d, + 0x58, 0x14, 0x4a, 0x13, 0x0d, 0x83, 0xfc, 0x22, 0xe4, 0x77, 0x34, 0xdb, 0x6d, 0x60, 0xf7, 0x3a, + 0xd6, 0x5a, 0xd8, 0x0e, 0xfb, 0x0f, 0x79, 0xe1, 0x3f, 0x20, 0x88, 0x53, 0x27, 0x81, 0xad, 0x9f, + 0xf4, 0xb7, 0x7c, 0x00, 0x71, 0x7a, 0x22, 0xd9, 0xf3, 0x2d, 0x38, 0x07, 0xf3, 0x2d, 0xc8, 0xca, + 0x70, 0xe4, 0x62, 0x47, 0xa4, 0xd1, 0xe8, 0x03, 0x7a, 0x4e, 0x78, 0x08, 0xb1, 0xe3, 0x3d, 0x04, + 0x3e, 0xbd, 0xb8, 0x9f, 0xd0, 0x81, 0x14, 0x1f, 0x62, 0xaf, 0x21, 0x11, 0xbf, 0x21, 0x68, 0x13, + 0x8a, 0x3d, 0xcd, 0x76, 0xe9, 0x17, 0x8a, 0x07, 0xb4, 0x17, 0x7c, 0x06, 0x2f, 0x0d, 0xdb, 0x93, + 0x50, 0x67, 0xf9, 0x5b, 0xf2, 0xbd, 0x60, 0xa1, 0xfc, 0x5f, 0xe2, 0x90, 0xe4, 0xc2, 0x78, 0x0f, + 0xa4, 0xb8, 0x58, 0xf9, 0x9c, 0x7b, 0x70, 0x65, 0x78, 0x99, 0x5d, 0xf1, 0x96, 0x43, 0x8e, 0x27, + 0x78, 0xd0, 0xa3, 0x90, 0xd6, 0x0f, 0x34, 0xc3, 0x54, 0x8d, 0x16, 0x77, 0x6d, 0xb3, 0x9f, 0x79, + 0x6b, 0x29, 0x55, 0x25, 0x65, 0xf5, 0x35, 0x25, 0x45, 0x2b, 0xeb, 0x2d, 0xe2, 0xd3, 0x1c, 0x60, + 0xa3, 0x7d, 0xe0, 0x72, 0xbb, 0xc1, 0x9f, 0xd0, 0x0b, 0x10, 0x27, 0x0a, 0xc1, 0xbf, 0x5f, 0x2f, + 0x0d, 0x45, 0x28, 0x5e, 0x0a, 0xa9, 0x92, 0x26, 0x2f, 0xfe, 0xf0, 0x7f, 0x5e, 0x8a, 0x28, 0x94, + 0x03, 0x55, 0x21, 0xdf, 0xd1, 0x1c, 0x57, 0xa5, 0xeb, 0x31, 0x79, 0x7d, 0x82, 0x42, 0x9c, 0x1d, + 0x16, 0x08, 0x17, 0x2c, 0x6f, 0x7a, 0x96, 0x70, 0xb1, 0xa2, 0x16, 0x3a, 0x0f, 0x12, 0x05, 0xd1, + 0xe9, 0x0c, 0x64, 0x5e, 0x62, 0x92, 0xca, 0xbd, 0x40, 0xca, 0xd9, 0xc4, 0xa4, 0xbe, 0xe2, 0x39, + 0xc8, 0xd0, 0x2f, 0x66, 0x29, 0x09, 0x3b, 0x06, 0x9f, 0x26, 0x05, 0xb4, 0xf2, 0x31, 0x28, 0xfa, + 0x56, 0x9f, 0x91, 0xa4, 0x19, 0x8a, 0x5f, 0x4c, 0x09, 0x9f, 0x86, 0x79, 0x13, 0x1f, 0xd2, 0x83, + 0xf9, 0x21, 0xea, 0x0c, 0xa5, 0x46, 0xa4, 0xee, 0x66, 0x98, 0xe3, 0x11, 0x28, 0xe8, 0x42, 0xf8, + 0x8c, 0x16, 0x28, 0x6d, 0xde, 0x2b, 0xa5, 0x64, 0x67, 0x21, 0xad, 0xf5, 0x7a, 0x8c, 0x20, 0xcb, + 0xad, 0x7e, 0xaf, 0x47, 0xab, 0x2e, 0xc0, 0x2c, 0xed, 0xa3, 0x8d, 0x9d, 0x7e, 0xc7, 0xe5, 0x20, + 0x39, 0x4a, 0x53, 0x24, 0x15, 0x0a, 0x2b, 0xa7, 0xb4, 0x0f, 0x43, 0x1e, 0xdf, 0x36, 0x5a, 0xd8, + 0xd4, 0x31, 0xa3, 0xcb, 0x53, 0xba, 0x9c, 0x28, 0xa4, 0x44, 0x8f, 0x83, 0x67, 0xcd, 0x55, 0xb1, + 0xd2, 0x14, 0x18, 0x9e, 0x28, 0x2f, 0xb3, 0x62, 0x79, 0x01, 0xe2, 0x6b, 0x9a, 0xab, 0x11, 0x77, + 0xc9, 0x3d, 0x64, 0xcb, 0x67, 0x4e, 0x21, 0x3f, 0xe5, 0x4f, 0xc5, 0x20, 0x7e, 0xd3, 0x72, 0x31, + 0x7a, 0x36, 0xe0, 0xca, 0x16, 0x46, 0xe9, 0x73, 0xc3, 0x68, 0x9b, 0xb8, 0xb5, 0xe9, 0xb4, 0x03, + 0xd7, 0xdb, 0xf8, 0xea, 0x14, 0x0d, 0xa9, 0xd3, 0x3c, 0x24, 0x6c, 0xab, 0x6f, 0xb6, 0xc4, 0x01, + 0x72, 0xfa, 0x80, 0x6a, 0x90, 0xf6, 0xb4, 0x24, 0x3e, 0x49, 0x4b, 0x8a, 0x44, 0x4b, 0x88, 0x0e, + 0xf3, 0x02, 0x25, 0xb5, 0xc7, 0x95, 0xa5, 0x02, 0x19, 0xcf, 0x78, 0x71, 0x6d, 0x9b, 0x4e, 0x61, + 0x7d, 0x36, 0xb2, 0x44, 0x7a, 0x63, 0xef, 0x09, 0x8f, 0x69, 0x9c, 0xe4, 0x55, 0x70, 0xe9, 0x85, + 0xd4, 0x8a, 0x5f, 0xb5, 0x93, 0xa2, 0xfd, 0xf2, 0xd5, 0x8a, 0x5d, 0xb7, 0xf3, 0x00, 0x64, 0x1c, + 0xa3, 0x6d, 0x6a, 0x6e, 0xdf, 0xc6, 0x5c, 0xf3, 0xfc, 0x02, 0x52, 0xeb, 0x7f, 0x4c, 0xc1, 0x34, + 0x2d, 0x70, 0x03, 0xd8, 0x45, 0x98, 0xf3, 0xef, 0xde, 0xf2, 0x51, 0x98, 0x96, 0x21, 0xaf, 0xaa, + 0x21, 0x6a, 0xe4, 0x5f, 0x8e, 0x40, 0x92, 0xaf, 0x58, 0xfe, 0x30, 0x44, 0x46, 0x0f, 0x43, 0x74, + 0xdc, 0x30, 0xc4, 0xee, 0x7f, 0x18, 0xca, 0x00, 0x5e, 0x33, 0x1d, 0x7e, 0xa1, 0xca, 0x08, 0xb7, + 0x8a, 0x35, 0xb1, 0x61, 0xb4, 0xf9, 0xbc, 0x0f, 0x30, 0xc9, 0xff, 0x29, 0x42, 0x3c, 0x7c, 0x5e, + 0x8f, 0xca, 0x90, 0x17, 0xed, 0x52, 0xf7, 0x3b, 0x5a, 0x9b, 0xab, 0xe2, 0x83, 0x63, 0x1b, 0x47, + 0x56, 0x61, 0x25, 0xcb, 0xdb, 0x43, 0xfd, 0x89, 0x91, 0xc3, 0x1a, 0x1d, 0x33, 0xac, 0x21, 0x3d, + 0x8a, 0xdd, 0x9f, 0x1e, 0x85, 0x46, 0x3c, 0x3e, 0x30, 0xe2, 0xf2, 0x6f, 0x47, 0xf8, 0xcd, 0x5f, + 0x2d, 0xf6, 0x25, 0xc8, 0x5f, 0xd4, 0x50, 0xbd, 0xce, 0x75, 0xab, 0x85, 0x5b, 0xea, 0xd0, 0x98, + 0x3d, 0x3c, 0x8c, 0x18, 0x6e, 0xb3, 0x3f, 0x76, 0x48, 0xa0, 0x34, 0xfc, 0x31, 0xfc, 0x64, 0x14, + 0x66, 0x87, 0xe8, 0xff, 0xef, 0x1b, 0xcb, 0xf0, 0xec, 0x4d, 0x4c, 0x39, 0x7b, 0x93, 0x63, 0x67, + 0xef, 0xcf, 0x44, 0x69, 0x02, 0xa0, 0x67, 0x39, 0x5a, 0xe7, 0xab, 0x61, 0x7b, 0xcf, 0x41, 0xa6, + 0x67, 0x75, 0x54, 0x56, 0xc3, 0x3e, 0xe1, 0x49, 0xf7, 0xac, 0x8e, 0x32, 0xa4, 0x66, 0x89, 0xb7, + 0xc9, 0x30, 0x27, 0xdf, 0x86, 0x41, 0x48, 0x0d, 0x4e, 0x28, 0x1b, 0x72, 0x4c, 0x14, 0xdc, 0x6b, + 0x7a, 0x9a, 0xc8, 0x80, 0xba, 0x61, 0x91, 0x61, 0x2f, 0x8f, 0x35, 0x9b, 0x51, 0x2a, 0x9c, 0x8e, + 0x70, 0x30, 0x27, 0x63, 0x54, 0xe6, 0x28, 0x68, 0xb1, 0x14, 0x4e, 0x27, 0xff, 0xed, 0x08, 0xc0, + 0x06, 0x91, 0x2c, 0xed, 0x2f, 0xf1, 0x77, 0x1c, 0xda, 0x04, 0x35, 0xf4, 0xe6, 0xc5, 0x71, 0x83, + 0xc6, 0xdf, 0x9f, 0x73, 0x82, 0xed, 0xae, 0x42, 0xde, 0xd7, 0x6d, 0x07, 0x8b, 0xc6, 0x2c, 0x1e, + 0x13, 0x95, 0x36, 0xb0, 0xab, 0xe4, 0x6e, 0x07, 0x9e, 0xe4, 0x7f, 0x16, 0x81, 0x0c, 0x6d, 0xd3, + 0x26, 0x76, 0xb5, 0xd0, 0x18, 0x46, 0xee, 0x7f, 0x0c, 0x1f, 0x04, 0x60, 0x30, 0x8e, 0xf1, 0x26, + 0xe6, 0x9a, 0x95, 0xa1, 0x25, 0x0d, 0xe3, 0x4d, 0x8c, 0xae, 0x78, 0x02, 0x8f, 0x1d, 0x2f, 0x70, + 0x11, 0xb5, 0x72, 0xb1, 0x9f, 0x81, 0x14, 0xbd, 0x9b, 0xf2, 0xd0, 0xe1, 0x81, 0x68, 0xd2, 0xec, + 0x77, 0x9b, 0x87, 0x8e, 0xfc, 0x06, 0xa4, 0x9a, 0x87, 0x2c, 0x9f, 0x78, 0x0e, 0x32, 0xb6, 0x65, + 0x71, 0xef, 0x8f, 0x79, 0xdd, 0x69, 0x52, 0x40, 0x9d, 0x1d, 0x91, 0x43, 0x8b, 0xfa, 0x39, 0x34, + 0x3f, 0x09, 0x18, 0x9b, 0x2a, 0x09, 0x48, 0xa2, 0xcf, 0x7c, 0x68, 0x26, 0xa1, 0x27, 0xe1, 0x4c, + 0xa3, 0xbe, 0xbe, 0x55, 0x5b, 0x53, 0x37, 0x1b, 0xeb, 0x03, 0x9f, 0xe7, 0x97, 0x8a, 0x77, 0xef, + 0x2d, 0x67, 0x79, 0xd8, 0x39, 0x8e, 0x7a, 0x47, 0xa9, 0xdd, 0xdc, 0x6e, 0xd6, 0xa4, 0x08, 0xa3, + 0xde, 0xb1, 0xf1, 0x6d, 0xcb, 0x65, 0x97, 0xbf, 0x3e, 0x0d, 0x67, 0x47, 0x50, 0x7b, 0xc1, 0xe7, + 0xec, 0xdd, 0x7b, 0xcb, 0xf9, 0x1d, 0x1b, 0x33, 0x2d, 0xa3, 0x1c, 0x2b, 0xb0, 0x30, 0xcc, 0xb1, + 0xbd, 0xb3, 0xdd, 0x28, 0x6f, 0x48, 0xcb, 0x25, 0xe9, 0xee, 0xbd, 0xe5, 0x9c, 0x30, 0x19, 0x84, + 0xfe, 0x9d, 0x8f, 0x3e, 0xbf, 0x35, 0x1d, 0xca, 0x1a, 0xb3, 0xb8, 0xae, 0xa7, 0xd9, 0x5a, 0xf7, + 0xa4, 0xe1, 0xe7, 0x84, 0x83, 0x03, 0xf2, 0x4f, 0x47, 0xa1, 0xe8, 0x05, 0x37, 0x3b, 0xf4, 0x0d, + 0xe8, 0xd9, 0x60, 0xc6, 0x2f, 0x3b, 0x76, 0xed, 0x60, 0xd4, 0x22, 0x21, 0xf8, 0x6e, 0x48, 0x0b, + 0x27, 0x99, 0x4f, 0xaa, 0xe5, 0x11, 0xeb, 0x1b, 0xa7, 0xe0, 0xac, 0x1e, 0x07, 0x7a, 0x09, 0x32, + 0xde, 0x14, 0xf3, 0x2e, 0x48, 0x1b, 0x3f, 0x27, 0x39, 0xbf, 0xcf, 0x83, 0x5e, 0xf4, 0xc3, 0xb8, + 0xf8, 0xb8, 0xc0, 0xf0, 0x26, 0x23, 0xe0, 0xcc, 0x5e, 0x08, 0xf7, 0x34, 0xc4, 0xb5, 0x3d, 0xdd, + 0xe0, 0x06, 0xf8, 0x81, 0x61, 0xbe, 0x72, 0xa5, 0x5a, 0xe7, 0x4c, 0x94, 0x52, 0xae, 0xf3, 0x64, + 0x0a, 0x97, 0x17, 0xbd, 0x8e, 0xe6, 0x50, 0x65, 0xb1, 0x30, 0xf3, 0x2e, 0xd2, 0x5d, 0xed, 0xb0, + 0x42, 0xc3, 0xe1, 0x33, 0x90, 0x22, 0x95, 0x6d, 0x7e, 0xe1, 0x41, 0x4c, 0x49, 0x76, 0xb5, 0xc3, + 0x75, 0xcd, 0xb9, 0x11, 0x4f, 0xc7, 0xa4, 0xb8, 0xfc, 0xe3, 0xc4, 0x53, 0x09, 0x49, 0x05, 0x3d, + 0x01, 0x88, 0x70, 0x68, 0x6d, 0xac, 0x92, 0xa9, 0x4b, 0xc5, 0x2b, 0x70, 0x8b, 0x5d, 0xed, 0xb0, + 0xdc, 0xc6, 0x5b, 0xfd, 0x2e, 0x6d, 0x80, 0x83, 0x36, 0x41, 0x12, 0xc4, 0x62, 0x64, 0xb9, 0xf8, + 0xcf, 0x0e, 0x5f, 0xb0, 0xca, 0x09, 0xd8, 0x02, 0xf0, 0x11, 0xb2, 0x00, 0x14, 0x18, 0x9e, 0x77, + 0x54, 0x24, 0xd4, 0x95, 0x58, 0xb8, 0x2b, 0xf2, 0x4b, 0x50, 0x1c, 0x18, 0x01, 0x24, 0x43, 0x9e, + 0x67, 0xac, 0xe8, 0x36, 0x3c, 0x8b, 0x70, 0x32, 0x4a, 0x96, 0x65, 0xa6, 0xe8, 0xb1, 0x84, 0xd5, + 0xf4, 0xcf, 0x7d, 0x6c, 0x29, 0x42, 0x37, 0x73, 0x9e, 0x80, 0x7c, 0x68, 0x0c, 0x44, 0x16, 0x39, + 0xe2, 0x67, 0x91, 0x7d, 0xe2, 0xd7, 0x21, 0x47, 0x0c, 0x10, 0x6e, 0x71, 0xda, 0x47, 0xa1, 0xc8, + 0x0c, 0xe4, 0xa0, 0xac, 0x99, 0xc3, 0xb3, 0x29, 0x04, 0x2e, 0x0b, 0x0f, 0x28, 0x2c, 0xf6, 0xac, + 0xa0, 0x5a, 0xd7, 0x1c, 0x79, 0x1b, 0xc0, 0x1f, 0x54, 0x54, 0x86, 0x07, 0x89, 0xf1, 0x08, 0x1e, + 0x1b, 0xe5, 0x57, 0x63, 0x85, 0x3c, 0xc6, 0x12, 0x21, 0xf2, 0x8f, 0x86, 0xb2, 0x0b, 0xb2, 0xae, + 0x53, 0x8a, 0xca, 0xfb, 0x3e, 0xf1, 0x99, 0xc5, 0xc8, 0x3b, 0x63, 0x0b, 0xbe, 0xeb, 0x15, 0x38, + 0x17, 0xa8, 0x24, 0x0a, 0x18, 0x4a, 0x44, 0x15, 0x03, 0xfa, 0x4a, 0x2a, 0x27, 0x25, 0x94, 0x8e, + 0xcd, 0xff, 0x96, 0x8e, 0x37, 0x3b, 0x93, 0xb3, 0x4d, 0x93, 0xf3, 0x5d, 0xa3, 0x93, 0xf2, 0xff, + 0x34, 0x03, 0x29, 0x05, 0xbf, 0xbf, 0x8f, 0x1d, 0x17, 0x5d, 0x82, 0x38, 0xd6, 0x0f, 0xac, 0x51, + 0x39, 0x50, 0xd2, 0xc1, 0x15, 0x4e, 0x57, 0xd3, 0x0f, 0xac, 0xeb, 0x33, 0x0a, 0xa5, 0x45, 0x97, + 0x21, 0xb1, 0xdf, 0xe9, 0xf3, 0xf4, 0xd5, 0x80, 0xcd, 0x0a, 0x32, 0x5d, 0x23, 0x44, 0xd7, 0x67, + 0x14, 0x46, 0x4d, 0x5e, 0x45, 0x6f, 0xc6, 0x8e, 0x1d, 0xff, 0xaa, 0xba, 0xb9, 0x4f, 0x5f, 0x45, + 0x68, 0x51, 0x05, 0xc0, 0x30, 0x0d, 0x57, 0xa5, 0xa9, 0x1d, 0x6e, 0x35, 0x1e, 0x1a, 0xcf, 0x69, + 0xb8, 0x34, 0x19, 0x74, 0x7d, 0x46, 0xc9, 0x18, 0xe2, 0x81, 0x34, 0xf7, 0xfd, 0x7d, 0x6c, 0x1f, + 0x71, 0x6f, 0x6d, 0x6c, 0x73, 0xdf, 0x47, 0x88, 0x48, 0x73, 0x29, 0x35, 0x31, 0xb2, 0xec, 0x92, + 0x3d, 0xf7, 0x90, 0x5f, 0x1d, 0xbb, 0x34, 0x8e, 0x93, 0xde, 0xb4, 0xd7, 0x3c, 0xbc, 0x3e, 0xa3, + 0xa4, 0x74, 0xf6, 0x13, 0xbd, 0xe0, 0xb9, 0x60, 0xd9, 0x61, 0xaf, 0x27, 0xc4, 0xcb, 0xd2, 0x3e, + 0x33, 0xc2, 0x15, 0x43, 0x5b, 0x50, 0xe8, 0x18, 0x8e, 0xab, 0x3a, 0xa6, 0xd6, 0x73, 0x0e, 0x2c, + 0xd7, 0xa1, 0xf9, 0x93, 0xec, 0xa5, 0x47, 0xc6, 0x21, 0x6c, 0x18, 0x8e, 0xdb, 0x10, 0xc4, 0xd7, + 0x67, 0x94, 0x7c, 0x27, 0x58, 0x40, 0xf0, 0xac, 0xfd, 0x7d, 0x6c, 0x7b, 0x80, 0x34, 0xcf, 0x72, + 0x0c, 0xde, 0x36, 0xa1, 0x16, 0xfc, 0x04, 0xcf, 0x0a, 0x16, 0xa0, 0xaf, 0x81, 0xb9, 0x8e, 0xa5, + 0xb5, 0x3c, 0x38, 0x55, 0x3f, 0xe8, 0x9b, 0xb7, 0x68, 0x52, 0x26, 0x7b, 0xe9, 0xf1, 0xb1, 0x8d, + 0xb4, 0xb4, 0x96, 0x80, 0xa8, 0x12, 0x86, 0xeb, 0x33, 0xca, 0x6c, 0x67, 0xb0, 0x10, 0x7d, 0x3d, + 0xcc, 0x6b, 0xbd, 0x5e, 0xe7, 0x68, 0x10, 0xbd, 0x48, 0xd1, 0x2f, 0x8c, 0x43, 0x2f, 0x13, 0x9e, + 0x41, 0x78, 0xa4, 0x0d, 0x95, 0xa2, 0x26, 0x48, 0x3d, 0x1b, 0xd3, 0x2f, 0xaf, 0x7a, 0xdc, 0xcb, + 0xa0, 0xf7, 0x52, 0x65, 0x2f, 0x3d, 0x36, 0x0e, 0x7b, 0x87, 0xd1, 0x0b, 0xa7, 0xe4, 0xfa, 0x8c, + 0x52, 0xec, 0x85, 0x8b, 0x18, 0xaa, 0xa5, 0x63, 0x7a, 0x6d, 0x1e, 0x47, 0x9d, 0x9d, 0x84, 0x4a, + 0xe9, 0xc3, 0xa8, 0xa1, 0x22, 0x54, 0x83, 0x2c, 0x0b, 0x45, 0x55, 0x62, 0x0c, 0xe9, 0x6d, 0x56, + 0xd9, 0x4b, 0xf2, 0xd8, 0x19, 0x4a, 0x49, 0x6f, 0x5a, 0x2e, 0xbe, 0x3e, 0xa3, 0x00, 0xf6, 0x9e, + 0x90, 0x06, 0xa7, 0xe8, 0xc5, 0x5e, 0x47, 0x6a, 0xd8, 0xf0, 0x2e, 0xcc, 0x51, 0xc0, 0x27, 0xc6, + 0x01, 0xde, 0xa4, 0x4c, 0x37, 0x83, 0x76, 0xf8, 0xfa, 0x8c, 0x32, 0x77, 0x7b, 0xb8, 0x98, 0xa8, + 0xd8, 0xbe, 0x61, 0x6a, 0x1d, 0xe3, 0x4d, 0xcc, 0x96, 0x50, 0x7a, 0xa5, 0xe5, 0x31, 0x2a, 0x76, + 0x8d, 0x53, 0xd3, 0x85, 0x95, 0xa8, 0xd8, 0x7e, 0xb0, 0xa0, 0x92, 0xe2, 0x67, 0x46, 0xbd, 0x2b, + 0xda, 0x52, 0x52, 0x9a, 0x5d, 0xcb, 0x76, 0x23, 0x9e, 0x06, 0x29, 0x2b, 0x3f, 0x06, 0xd9, 0x80, + 0x61, 0x42, 0x0b, 0x90, 0xe2, 0xa7, 0x6a, 0xc4, 0xe9, 0x53, 0xfe, 0x28, 0x17, 0x20, 0x17, 0x34, + 0x46, 0xf2, 0x87, 0x23, 0x1e, 0x27, 0xbd, 0x9b, 0x62, 0x21, 0x9c, 0x91, 0xce, 0xf8, 0x9e, 0xca, + 0xc3, 0x62, 0x69, 0x13, 0xf5, 0x6c, 0xfb, 0x35, 0x47, 0x0b, 0xf9, 0xca, 0x8a, 0x96, 0x20, 0xdb, + 0xbb, 0xd4, 0xf3, 0x48, 0x62, 0x94, 0x04, 0x7a, 0x97, 0x7a, 0x82, 0xe0, 0x21, 0xc8, 0x91, 0x7e, + 0xab, 0x41, 0x7f, 0x29, 0xa3, 0x64, 0x49, 0x19, 0x27, 0x91, 0xff, 0x4d, 0x14, 0xa4, 0x41, 0x03, + 0xe6, 0xa5, 0xaa, 0x23, 0x27, 0x4e, 0x55, 0x9f, 0x1d, 0x4c, 0x92, 0xfb, 0x79, 0xf1, 0x0d, 0x90, + 0xfc, 0xf4, 0x2e, 0x5b, 0x6a, 0xc6, 0xfb, 0x7f, 0x03, 0x8e, 0xaa, 0x52, 0xd4, 0x07, 0x3c, 0xd7, + 0x6b, 0xa1, 0xcd, 0x4a, 0xf1, 0xa7, 0x23, 0x06, 0x07, 0xdc, 0x73, 0x62, 0x76, 0x7b, 0x2d, 0xcd, + 0xc5, 0x22, 0x3f, 0x16, 0xd8, 0xb7, 0x7c, 0x14, 0x8a, 0x5a, 0xaf, 0xa7, 0x3a, 0xae, 0xe6, 0x62, + 0xee, 0x6b, 0xb0, 0xcc, 0x43, 0x5e, 0xeb, 0xf5, 0x1a, 0xa4, 0x94, 0xf9, 0x1a, 0x8f, 0x40, 0x81, + 0xd8, 0x74, 0x43, 0xeb, 0x08, 0x57, 0x21, 0xc9, 0x5c, 0x12, 0x5e, 0xca, 0xbc, 0x03, 0xb9, 0xe5, + 0x8d, 0x38, 0xb5, 0xe7, 0x5e, 0x4c, 0x15, 0x09, 0xc4, 0x54, 0x88, 0xdf, 0x19, 0xc2, 0xe4, 0x23, + 0xee, 0x59, 0x19, 0xbd, 0x69, 0x30, 0x4f, 0xe3, 0xaf, 0xdb, 0x2c, 0x59, 0x92, 0x56, 0xd8, 0x83, + 0xac, 0x40, 0x21, 0x6c, 0xfb, 0x51, 0x01, 0xa2, 0xee, 0x21, 0x7f, 0x4b, 0xd4, 0x3d, 0x24, 0x9e, + 0xae, 0x77, 0xd3, 0x6e, 0x61, 0xc4, 0x6a, 0xc7, 0xf9, 0xfc, 0x5c, 0x87, 0x5c, 0x84, 0x7c, 0x68, + 0x4d, 0x90, 0x4f, 0xc3, 0xfc, 0x28, 0x13, 0x2f, 0x1f, 0x78, 0xe5, 0x21, 0x53, 0x8d, 0x2e, 0x43, + 0xda, 0xb3, 0xf1, 0x23, 0xa2, 0x63, 0xfa, 0x5a, 0x41, 0xac, 0x78, 0xa4, 0xa1, 0x74, 0x7e, 0x34, + 0x94, 0xce, 0x97, 0xbf, 0x01, 0x16, 0xc6, 0xd9, 0xef, 0x81, 0x24, 0x5f, 0xdc, 0x13, 0xd8, 0x69, + 0x48, 0xf2, 0x2b, 0x2d, 0xa3, 0x74, 0x03, 0x8b, 0x3f, 0x11, 0x41, 0x32, 0x5b, 0x1e, 0x63, 0xfb, + 0x5a, 0xf4, 0x41, 0x56, 0xe1, 0xec, 0x58, 0x1b, 0x3e, 0x7e, 0x2b, 0x8c, 0x01, 0xf1, 0xad, 0x30, + 0x5d, 0x34, 0xc7, 0xa1, 0x7d, 0x15, 0x07, 0x59, 0xd8, 0x93, 0xfc, 0x91, 0x18, 0x9c, 0x1e, 0x6d, + 0xc9, 0xd1, 0x32, 0xe4, 0x88, 0xdf, 0xea, 0x86, 0x5d, 0x5c, 0xe8, 0x6a, 0x87, 0x4d, 0xee, 0xdf, + 0xf2, 0xad, 0x84, 0xa8, 0xb7, 0x95, 0x80, 0x76, 0x61, 0xb6, 0x63, 0xe9, 0x5a, 0x47, 0x0d, 0x6c, + 0xe5, 0xf0, 0x49, 0xf4, 0xf0, 0x90, 0xb0, 0xc3, 0x29, 0x43, 0x62, 0x70, 0xb8, 0xfe, 0x17, 0x29, + 0xc6, 0x86, 0xb7, 0xeb, 0x83, 0xd6, 0x20, 0xdb, 0x35, 0x9c, 0x3d, 0x7c, 0xa0, 0xdd, 0x36, 0x2c, + 0x9b, 0xcf, 0xa6, 0x61, 0xa5, 0xd9, 0xf4, 0x69, 0xc4, 0x0e, 0x53, 0x80, 0x2d, 0x30, 0x24, 0x89, + 0x91, 0x1b, 0x5f, 0xc9, 0x13, 0x5b, 0x93, 0x71, 0x7b, 0x48, 0xa9, 0xb1, 0x7b, 0x48, 0xa3, 0x36, + 0x6c, 0xd2, 0xa3, 0x37, 0x6c, 0x3e, 0x14, 0x1c, 0x9a, 0xf0, 0xda, 0x37, 0xb4, 0x87, 0x83, 0x1a, + 0x30, 0xcf, 0xf9, 0x5b, 0x21, 0xd9, 0x8f, 0x38, 0xea, 0xc0, 0xe6, 0xd7, 0xa0, 0xcc, 0x91, 0x60, + 0x1f, 0x2f, 0xf6, 0xd8, 0xfd, 0x89, 0x5d, 0x6c, 0xa2, 0xc6, 0x03, 0x9b, 0xa8, 0xff, 0x87, 0x0d, + 0xc5, 0x4b, 0x30, 0x3b, 0xe4, 0x47, 0x8c, 0xdc, 0x1c, 0x1e, 0x93, 0x90, 0x95, 0x3f, 0x1a, 0x81, + 0xd2, 0x78, 0xc7, 0x61, 0x24, 0xd4, 0x89, 0x72, 0xdf, 0xe3, 0xcc, 0xf3, 0x23, 0x50, 0x18, 0x70, + 0x6b, 0xd8, 0x28, 0xe4, 0x43, 0x01, 0xa4, 0xfc, 0xcd, 0x31, 0xcf, 0x66, 0x86, 0x7c, 0x8f, 0x11, + 0x8a, 0xf6, 0x3e, 0x98, 0x6b, 0x61, 0xdd, 0x68, 0xdd, 0xaf, 0x9e, 0xcd, 0x72, 0xee, 0xff, 0xa7, + 0x66, 0xc3, 0x6a, 0xf6, 0x3d, 0x00, 0x69, 0x05, 0x3b, 0x3d, 0xe2, 0x4a, 0xa0, 0x0a, 0x64, 0xf0, + 0xa1, 0x8e, 0x7b, 0xae, 0x7f, 0x1e, 0x60, 0x94, 0x77, 0xcb, 0xa8, 0x6b, 0x82, 0x92, 0xc4, 0x76, + 0x1e, 0x1b, 0x7a, 0x96, 0x87, 0xaf, 0xe3, 0x23, 0x51, 0xce, 0x1e, 0x8c, 0x5f, 0xaf, 0x88, 0xf8, + 0x35, 0x36, 0x36, 0x34, 0x63, 0x5c, 0x03, 0x01, 0xec, 0xb3, 0x3c, 0x80, 0x8d, 0x4f, 0x78, 0x59, + 0x28, 0x82, 0xad, 0x86, 0x22, 0xd8, 0xe4, 0x84, 0x6e, 0x8e, 0x09, 0x61, 0xaf, 0x88, 0x10, 0x36, + 0x35, 0xa1, 0xc5, 0x03, 0x31, 0xec, 0x7b, 0x02, 0x31, 0x6c, 0x66, 0x38, 0x51, 0x18, 0x62, 0x1d, + 0x11, 0xc4, 0xbe, 0xe8, 0x05, 0xb1, 0xb9, 0xb1, 0x01, 0x30, 0x67, 0x1e, 0x8c, 0x62, 0xb7, 0x87, + 0xa2, 0xd8, 0x3c, 0xff, 0xdb, 0x3e, 0xe3, 0x20, 0x26, 0x84, 0xb1, 0xdb, 0x43, 0x61, 0x6c, 0x61, + 0x02, 0xe0, 0x84, 0x38, 0xf6, 0x6b, 0x47, 0xc7, 0xb1, 0xe3, 0x23, 0x4d, 0xde, 0xcc, 0xe9, 0x02, + 0x59, 0x75, 0x4c, 0x20, 0x2b, 0x8d, 0x0d, 0xba, 0x18, 0xfc, 0xd4, 0x91, 0xec, 0xee, 0x88, 0x48, + 0x96, 0xc5, 0x9c, 0xe7, 0xc7, 0x82, 0x4f, 0x11, 0xca, 0xee, 0x8e, 0x08, 0x65, 0xd1, 0x44, 0xd8, + 0x89, 0xb1, 0xec, 0xb5, 0x70, 0x2c, 0x3b, 0x37, 0xc6, 0x61, 0xf2, 0x67, 0xfb, 0x98, 0x60, 0x76, + 0x6f, 0x5c, 0x30, 0xcb, 0x02, 0xce, 0x27, 0xc7, 0x22, 0x9e, 0x20, 0x9a, 0xdd, 0x1e, 0x8a, 0x66, + 0x4f, 0x4d, 0xd0, 0xb4, 0xe9, 0xc3, 0x59, 0x76, 0xd7, 0x38, 0xbb, 0x65, 0x1c, 0xa4, 0xec, 0x8d, + 0x78, 0x3a, 0x2b, 0xe5, 0xe4, 0xc7, 0xc9, 0xea, 0x3b, 0x60, 0xe7, 0x88, 0x9b, 0x8b, 0x6d, 0xdb, + 0xb2, 0xc5, 0xe1, 0x7e, 0xfa, 0x20, 0x9f, 0x27, 0xe1, 0x8d, 0x6f, 0xd3, 0x8e, 0x09, 0x7d, 0x69, + 0x38, 0x11, 0xb0, 0x63, 0xf2, 0xcf, 0x45, 0x7c, 0x5e, 0x1a, 0xfc, 0x06, 0x43, 0xa3, 0x0c, 0x0f, + 0x8d, 0x02, 0x01, 0x71, 0x34, 0x1c, 0x10, 0x2f, 0x41, 0x96, 0x84, 0x09, 0x03, 0xb1, 0xae, 0xd6, + 0xf3, 0x62, 0x5d, 0x71, 0xf6, 0x87, 0x85, 0xcd, 0x7c, 0x59, 0x62, 0x1b, 0x61, 0x45, 0xef, 0x1c, + 0x14, 0x8b, 0xd2, 0xd0, 0x53, 0x30, 0x17, 0xa0, 0xf5, 0xc2, 0x0f, 0x16, 0xf8, 0x49, 0x1e, 0x75, + 0x99, 0xc7, 0x21, 0xff, 0x3c, 0xe2, 0x4b, 0xc8, 0x0f, 0x92, 0x47, 0xc5, 0xb3, 0x91, 0xb7, 0x29, + 0x9e, 0x8d, 0xde, 0x77, 0x3c, 0x1b, 0x0c, 0xa7, 0x62, 0xe1, 0x70, 0xea, 0x4f, 0x23, 0xfe, 0x98, + 0x78, 0xd1, 0xa9, 0x6e, 0xb5, 0x30, 0x0f, 0x70, 0xe8, 0x6f, 0xe2, 0x92, 0x74, 0xac, 0x36, 0x0f, + 0x63, 0xc8, 0x4f, 0x42, 0xe5, 0x2d, 0x3c, 0x19, 0xbe, 0xae, 0x78, 0xb1, 0x51, 0x22, 0xf8, 0x09, + 0x02, 0x3f, 0x97, 0x9f, 0xf4, 0xcf, 0xe5, 0x7b, 0xdf, 0xdf, 0xa6, 0x02, 0xdf, 0xdf, 0xa2, 0x17, + 0x20, 0x43, 0xf3, 0xd4, 0xaa, 0xd5, 0x13, 0x7f, 0x18, 0xeb, 0xdc, 0xf8, 0x33, 0xf9, 0x0e, 0x3d, + 0x2d, 0xcc, 0xce, 0xf1, 0xfb, 0x1e, 0x47, 0x26, 0xe4, 0x71, 0x3c, 0x00, 0x19, 0xd2, 0x7a, 0xf6, + 0x07, 0x1e, 0x80, 0x7f, 0xbc, 0x2d, 0x0a, 0xe4, 0x9f, 0x88, 0x42, 0x71, 0x60, 0xa1, 0x19, 0xd9, + 0xf7, 0x51, 0x3b, 0xa0, 0xd3, 0xc9, 0x63, 0x11, 0xa0, 0xad, 0x39, 0xea, 0x1d, 0xcd, 0x74, 0x71, + 0x8b, 0x0b, 0x25, 0x50, 0x82, 0x4a, 0x90, 0x26, 0x4f, 0x7d, 0x07, 0xb7, 0x78, 0xe2, 0xc0, 0x7b, + 0x46, 0xd7, 0x21, 0x89, 0x6f, 0xd3, 0x0b, 0x4e, 0xd9, 0x35, 0xc1, 0xa7, 0x87, 0x23, 0x39, 0x52, + 0x5d, 0x59, 0x20, 0x83, 0xfd, 0xf9, 0xb7, 0x96, 0x24, 0x46, 0xfd, 0xa4, 0xf7, 0xcd, 0x94, 0xc2, + 0xf9, 0xc3, 0x52, 0x48, 0x0f, 0x48, 0x81, 0xa6, 0xb0, 0x72, 0x22, 0x32, 0x25, 0x32, 0x65, 0xc7, + 0x93, 0x95, 0x7c, 0x17, 0x77, 0x7b, 0x96, 0xd5, 0x51, 0xd9, 0x1c, 0x2f, 0x43, 0x21, 0xbc, 0xae, + 0xb2, 0x3f, 0xbe, 0xe4, 0x6a, 0x86, 0xa9, 0x86, 0x9c, 0xe0, 0x1c, 0x2b, 0x64, 0x73, 0xea, 0x46, + 0x3c, 0x1d, 0x91, 0xa2, 0x37, 0xe2, 0xe9, 0xa8, 0x14, 0x93, 0x77, 0xe0, 0xd4, 0xc8, 0x75, 0x15, + 0x3d, 0x0f, 0x19, 0x7f, 0x49, 0x66, 0x27, 0xcc, 0x8f, 0x49, 0x12, 0xf8, 0xb4, 0xf2, 0x2f, 0x45, + 0x7c, 0xc8, 0x70, 0xda, 0xa1, 0x06, 0x49, 0x76, 0xdc, 0x8f, 0x1f, 0xed, 0x78, 0x6a, 0xba, 0x15, + 0x79, 0x85, 0x9d, 0x05, 0x54, 0x38, 0xb3, 0xfc, 0xf5, 0x90, 0x64, 0x25, 0x28, 0x0b, 0x29, 0xff, + 0x2a, 0x65, 0x80, 0x64, 0xb9, 0x5a, 0xad, 0xed, 0x88, 0x7b, 0x51, 0x2b, 0xdb, 0x4a, 0x53, 0x8a, + 0x92, 0x62, 0xa5, 0x76, 0xa3, 0x56, 0x6d, 0x4a, 0x31, 0x34, 0x0b, 0x79, 0xf6, 0x5b, 0xbd, 0xb6, + 0xad, 0x6c, 0x96, 0x9b, 0x52, 0x3c, 0x50, 0xd4, 0xa8, 0x6d, 0xad, 0xd5, 0x14, 0x29, 0x21, 0x3f, + 0x03, 0x67, 0xc7, 0xae, 0xe1, 0x7e, 0x4e, 0x21, 0x12, 0xc8, 0x29, 0xc8, 0x1f, 0x89, 0x92, 0xa0, + 0x66, 0xdc, 0xc2, 0x8c, 0x6e, 0x0c, 0x74, 0xfc, 0xd2, 0x09, 0x56, 0xf5, 0x81, 0xde, 0x93, 0x38, + 0xc6, 0xc6, 0xfb, 0xd8, 0xd5, 0x0f, 0x98, 0xa3, 0xc0, 0x2c, 0x50, 0x5e, 0xc9, 0xf3, 0x52, 0xca, + 0xe4, 0x30, 0xb2, 0x37, 0xb0, 0xee, 0xaa, 0x4c, 0x89, 0x1c, 0xfe, 0xb7, 0x62, 0xf3, 0xac, 0xb4, + 0xc1, 0x0a, 0xe5, 0x6f, 0x38, 0x91, 0x2c, 0x33, 0x90, 0x50, 0x6a, 0x4d, 0xe5, 0x35, 0x29, 0x86, + 0x10, 0x14, 0xe8, 0x4f, 0xb5, 0xb1, 0x55, 0xde, 0x69, 0x5c, 0xdf, 0x26, 0xb2, 0x9c, 0x83, 0xa2, + 0x90, 0xa5, 0x28, 0x4c, 0xc8, 0x4f, 0xc0, 0x99, 0x31, 0x5e, 0xc5, 0x88, 0xf3, 0x97, 0x1f, 0x8f, + 0x04, 0xa9, 0xc3, 0x9e, 0xc1, 0x36, 0x24, 0x1d, 0x57, 0x73, 0xfb, 0x0e, 0x17, 0xe2, 0xf3, 0xd3, + 0xba, 0x19, 0x2b, 0xe2, 0x47, 0x83, 0xb2, 0x2b, 0x1c, 0x46, 0xbe, 0x0c, 0x85, 0x70, 0xcd, 0x78, + 0x19, 0xf8, 0x4a, 0x14, 0x95, 0xaf, 0x02, 0x1a, 0xf6, 0x3e, 0x46, 0x84, 0x97, 0x91, 0x51, 0xe1, + 0xe5, 0x8f, 0x44, 0xe0, 0xdc, 0x31, 0x9e, 0x06, 0x7a, 0xdf, 0x40, 0x27, 0x5f, 0x3c, 0x89, 0x9f, + 0xb2, 0xc2, 0xca, 0x06, 0xba, 0xf9, 0x2c, 0xe4, 0x82, 0xe5, 0xd3, 0x75, 0xf2, 0xf3, 0x51, 0x7f, + 0x12, 0x87, 0xe3, 0x60, 0xdf, 0x04, 0x46, 0xbe, 0x42, 0x13, 0xf8, 0x6e, 0x00, 0xf7, 0x50, 0x1c, + 0x00, 0xe6, 0xeb, 0xe8, 0x83, 0x23, 0x52, 0x63, 0x58, 0x6f, 0x1e, 0xf2, 0x49, 0x90, 0x71, 0xf9, + 0x2f, 0x07, 0x35, 0x82, 0x49, 0x81, 0x3e, 0x5d, 0x63, 0x1d, 0xef, 0x2f, 0xc5, 0x4e, 0xb7, 0x18, + 0xfb, 0xc9, 0x03, 0x56, 0xec, 0xa0, 0xd7, 0xe0, 0xcc, 0x80, 0xa3, 0xe0, 0x41, 0xc7, 0xa7, 0xf5, + 0x17, 0x4e, 0x85, 0xfd, 0x05, 0x01, 0x1d, 0x5c, 0xed, 0x13, 0xe1, 0xd5, 0xfe, 0x35, 0x00, 0x3f, + 0x39, 0xe0, 0x9f, 0x58, 0x8b, 0x04, 0x4f, 0xac, 0x5d, 0x86, 0x04, 0xd1, 0x24, 0x21, 0xa7, 0x61, + 0x53, 0x4c, 0x34, 0x21, 0x90, 0x5c, 0x60, 0xd4, 0xb2, 0x01, 0x68, 0x38, 0xb7, 0x38, 0xe6, 0x15, + 0xef, 0x09, 0xbf, 0xe2, 0xa1, 0xb1, 0x59, 0xca, 0xd1, 0xaf, 0x7a, 0x13, 0x12, 0x74, 0xe4, 0x47, + 0x7e, 0x06, 0xf8, 0x75, 0x00, 0x9a, 0xeb, 0xda, 0xc6, 0x5e, 0xdf, 0x7f, 0xc1, 0xd2, 0x68, 0xcd, + 0x29, 0x0b, 0xba, 0xca, 0x03, 0x5c, 0x85, 0xe6, 0x7d, 0xd6, 0x80, 0x1a, 0x05, 0x00, 0xe5, 0x2d, + 0x28, 0x84, 0x79, 0x47, 0x7f, 0xd6, 0xe8, 0xdf, 0x2f, 0x92, 0x11, 0xfe, 0x8d, 0xe7, 0x1d, 0xf1, + 0x3b, 0x7f, 0xe8, 0x83, 0xfc, 0xe7, 0x11, 0xc8, 0x05, 0x15, 0xef, 0x6d, 0x76, 0x41, 0x1e, 0x1c, + 0xe1, 0x82, 0x64, 0xda, 0x9a, 0xf3, 0x0a, 0xf3, 0x40, 0xce, 0x0e, 0x79, 0x20, 0xa9, 0xb6, 0xe6, + 0xec, 0x7e, 0x15, 0x1d, 0x10, 0xf9, 0x5b, 0x22, 0x90, 0xf6, 0x3a, 0x7f, 0xcc, 0x29, 0x5d, 0xff, + 0xe3, 0x56, 0x2f, 0xeb, 0xce, 0xf6, 0x37, 0x62, 0xde, 0xfe, 0xc6, 0x55, 0x6f, 0xf1, 0x1b, 0x97, + 0x0e, 0x09, 0x4a, 0x5a, 0x9c, 0x94, 0xe3, 0x6b, 0xfd, 0xd5, 0xe9, 0xbe, 0x21, 0x9b, 0x87, 0x44, + 0xf0, 0xfb, 0x2f, 0xf6, 0x20, 0xb7, 0x02, 0x47, 0x63, 0xd8, 0x34, 0x0c, 0x7e, 0x6c, 0x16, 0x39, + 0xf1, 0xc7, 0x66, 0xde, 0x5b, 0xa2, 0xc1, 0xb7, 0x7c, 0x77, 0x04, 0xd2, 0x62, 0x46, 0xa0, 0xf7, + 0x06, 0x8f, 0x4c, 0x89, 0x3d, 0xb9, 0xb1, 0xd6, 0x88, 0xe3, 0x07, 0x4e, 0x4c, 0x0d, 0x9d, 0x14, + 0x8e, 0x9d, 0xf4, 0xa4, 0x30, 0xf7, 0xeb, 0xfe, 0x38, 0x02, 0xd2, 0xe0, 0x7c, 0xfd, 0x8a, 0x5b, + 0x37, 0xbc, 0xc8, 0xc5, 0x46, 0x2c, 0x72, 0xe3, 0x8e, 0xff, 0xc6, 0xc7, 0x1d, 0xff, 0x1d, 0xee, + 0x75, 0xe2, 0x3e, 0x7b, 0xfd, 0xc1, 0x28, 0x64, 0x03, 0xc9, 0x51, 0xf4, 0x5c, 0xe8, 0x28, 0xf1, + 0xf2, 0x71, 0x89, 0xd4, 0xc0, 0x59, 0xe2, 0x90, 0x98, 0xa2, 0x27, 0x17, 0xd3, 0xdb, 0xff, 0x59, + 0xd1, 0xe8, 0x2f, 0x2f, 0x13, 0x63, 0xbe, 0xbc, 0xfc, 0xa6, 0x08, 0xa4, 0x3d, 0xa7, 0xfb, 0xa4, + 0xbb, 0x6f, 0xa7, 0x21, 0xc9, 0xfd, 0x4a, 0xb6, 0xfd, 0xc6, 0x9f, 0x46, 0x26, 0x95, 0x4b, 0x90, + 0x16, 0x7f, 0xb4, 0x8f, 0xaf, 0x69, 0xde, 0xf3, 0x85, 0x17, 0x21, 0x1b, 0xd8, 0xb9, 0x24, 0x86, + 0x71, 0xab, 0xf6, 0x8a, 0x34, 0x53, 0x4a, 0xdd, 0xbd, 0xb7, 0x1c, 0xdb, 0xc2, 0x77, 0xc8, 0x6c, + 0x56, 0x6a, 0xd5, 0xeb, 0xb5, 0xea, 0xcb, 0x52, 0xa4, 0x94, 0xbd, 0x7b, 0x6f, 0x39, 0xa5, 0x60, + 0x9a, 0x4f, 0xbc, 0xf0, 0x32, 0x14, 0x07, 0x06, 0x26, 0xec, 0xb4, 0x20, 0x28, 0xac, 0xed, 0xee, + 0x6c, 0xd4, 0xab, 0xe5, 0x66, 0x4d, 0x65, 0x07, 0x4e, 0xd1, 0x19, 0x98, 0xdb, 0xa8, 0xaf, 0x5f, + 0x6f, 0xaa, 0xd5, 0x8d, 0x7a, 0x6d, 0xab, 0xa9, 0x96, 0x9b, 0xcd, 0x72, 0xf5, 0x65, 0x29, 0x7a, + 0xe9, 0x5e, 0x16, 0xe2, 0xe5, 0x4a, 0xb5, 0x8e, 0xaa, 0x10, 0xa7, 0x89, 0x90, 0x63, 0x8f, 0x2e, + 0x95, 0x8e, 0xcf, 0x0c, 0xa3, 0x6b, 0x90, 0xa0, 0x39, 0x12, 0x74, 0xfc, 0x59, 0xa6, 0xd2, 0x84, + 0x54, 0x31, 0x69, 0x0c, 0x9d, 0x91, 0xc7, 0x1e, 0x6e, 0x2a, 0x1d, 0x9f, 0x39, 0x46, 0x1b, 0x90, + 0x12, 0x21, 0xf2, 0xa4, 0x13, 0x47, 0xa5, 0x89, 0xe9, 0x5c, 0xd2, 0x35, 0x96, 0x6a, 0x38, 0xfe, + 0xdc, 0x53, 0x69, 0x42, 0x4e, 0x19, 0xd5, 0xbd, 0x0f, 0x71, 0x26, 0x1c, 0x65, 0x2a, 0x4d, 0xca, + 0x12, 0x23, 0x05, 0x32, 0x7e, 0x12, 0x67, 0xf2, 0x69, 0xae, 0xd2, 0x14, 0xe9, 0x72, 0xf4, 0xf5, + 0x90, 0x0f, 0x07, 0xba, 0xd3, 0x1d, 0x97, 0x2a, 0x4d, 0x99, 0x8f, 0x26, 0xf8, 0xe1, 0xa8, 0x77, + 0xba, 0xe3, 0x53, 0xa5, 0x29, 0xd3, 0xd3, 0xe8, 0x0d, 0x98, 0x1d, 0x8e, 0x4a, 0xa7, 0x3f, 0x4d, + 0x55, 0x3a, 0x41, 0xc2, 0x1a, 0x75, 0x01, 0x8d, 0x88, 0x66, 0x4f, 0x70, 0xb8, 0xaa, 0x74, 0x92, + 0xfc, 0x35, 0x6a, 0x41, 0x71, 0x30, 0x44, 0x9c, 0xf6, 0xb0, 0x55, 0x69, 0xea, 0x5c, 0x36, 0x7b, + 0x4b, 0x38, 0xb4, 0x9c, 0xf6, 0xf0, 0x55, 0x69, 0xea, 0xd4, 0x36, 0xda, 0x05, 0x08, 0x44, 0x87, + 0x53, 0x1c, 0xc6, 0x2a, 0x4d, 0x93, 0xe4, 0x46, 0x3d, 0x98, 0x1b, 0x15, 0x36, 0x9e, 0xe4, 0x6c, + 0x56, 0xe9, 0x44, 0xb9, 0x6f, 0xa2, 0xcf, 0xe1, 0x00, 0x70, 0xba, 0xb3, 0x5a, 0xa5, 0x29, 0x93, + 0xe0, 0x95, 0xf2, 0xd8, 0x03, 0xba, 0x8f, 0x1d, 0x7b, 0x40, 0xd7, 0x3f, 0x72, 0xeb, 0x7f, 0x1e, + 0xfe, 0x1c, 0xbc, 0x8b, 0x5f, 0xfd, 0xe2, 0xb8, 0xda, 0x2d, 0xc3, 0x6c, 0x7b, 0x77, 0xf9, 0xf0, + 0x67, 0x7e, 0x3a, 0xf7, 0x34, 0xbf, 0x5e, 0x46, 0x94, 0x4e, 0xb8, 0xd1, 0x67, 0xec, 0x35, 0x87, + 0x93, 0x0e, 0xf2, 0x4f, 0x3e, 0x77, 0x7b, 0xcc, 0x6d, 0x41, 0x13, 0xee, 0x24, 0x1a, 0x71, 0x9b, + 0x50, 0xe9, 0xd8, 0x8f, 0xe3, 0x4b, 0xc7, 0x1d, 0x58, 0x26, 0x5e, 0x6c, 0xe1, 0xba, 0xe1, 0xb8, + 0x96, 0x6d, 0xe8, 0x5a, 0x87, 0x2e, 0x2f, 0x57, 0xa7, 0xfd, 0x9c, 0xa8, 0x92, 0x21, 0xee, 0x0a, + 0xbf, 0x82, 0x88, 0x7f, 0xe2, 0xb2, 0x06, 0xc9, 0xdb, 0x5a, 0x87, 0x7d, 0xcc, 0x13, 0xbc, 0x6d, + 0x6c, 0x50, 0xe6, 0x01, 0x3f, 0x2a, 0x88, 0xc2, 0x78, 0xe5, 0x4f, 0xd1, 0x0f, 0x21, 0xba, 0x5d, + 0xc3, 0x21, 0xba, 0xa8, 0xd0, 0x40, 0x7a, 0x17, 0xe2, 0xb6, 0xe6, 0xf2, 0xf0, 0xb2, 0x52, 0xe6, + 0x17, 0x07, 0x3d, 0x3a, 0xf9, 0xfa, 0x9f, 0x95, 0xa1, 0xbb, 0x85, 0xd8, 0xcb, 0x28, 0x1c, 0xfa, + 0x5a, 0x48, 0x77, 0xb5, 0x43, 0x95, 0x42, 0x47, 0xdf, 0x2e, 0xe8, 0x54, 0x57, 0x3b, 0x24, 0xad, + 0x46, 0x06, 0x14, 0x09, 0xba, 0x7e, 0xa0, 0x99, 0x6d, 0xcc, 0x5e, 0x12, 0x7b, 0xbb, 0x5e, 0x92, + 0xef, 0x6a, 0x87, 0x55, 0x0a, 0x4c, 0x5e, 0xc5, 0xaf, 0x68, 0xfa, 0x95, 0x08, 0x4f, 0x2a, 0x50, + 0xc9, 0x21, 0x0d, 0x24, 0xdd, 0x7b, 0xa2, 0xef, 0x17, 0x3b, 0x20, 0x8f, 0x8d, 0x1b, 0x98, 0x01, + 0xb9, 0x57, 0xf2, 0xa4, 0xa5, 0x9f, 0x7e, 0x6b, 0x29, 0xc2, 0xde, 0x5a, 0xd4, 0x07, 0xc6, 0xe5, + 0x06, 0x64, 0x59, 0xae, 0x44, 0xa5, 0x4e, 0x6e, 0x74, 0xa2, 0x93, 0x9b, 0x17, 0x4e, 0x2e, 0x03, + 0x04, 0xc6, 0x4d, 0xea, 0x79, 0x1f, 0x3e, 0x11, 0x81, 0xec, 0x5a, 0xe0, 0x72, 0xc1, 0x05, 0x48, + 0x75, 0x2d, 0xd3, 0xb8, 0x85, 0x6d, 0x6f, 0x0b, 0x8b, 0x3d, 0x12, 0x47, 0x94, 0xfd, 0x8d, 0x3a, + 0xf7, 0x48, 0xdc, 0x9b, 0x23, 0x9e, 0x09, 0xd7, 0x1d, 0xbc, 0xe7, 0x18, 0x42, 0xe4, 0x8a, 0x78, + 0x44, 0x8f, 0x83, 0xe4, 0x60, 0xbd, 0x6f, 0x1b, 0xee, 0x91, 0xaa, 0x5b, 0xa6, 0xab, 0xe9, 0x2e, + 0x0f, 0xd3, 0x8b, 0xa2, 0xbc, 0xca, 0x8a, 0x09, 0x48, 0x0b, 0xbb, 0x9a, 0xd1, 0x61, 0x67, 0x0e, + 0x33, 0x8a, 0x78, 0xe4, 0x4d, 0xfd, 0x54, 0x2a, 0x18, 0xa8, 0x56, 0x41, 0xb2, 0x7a, 0xd8, 0x0e, + 0x9d, 0x57, 0x61, 0xea, 0xba, 0xf0, 0x1b, 0x9f, 0x7c, 0x6a, 0x9e, 0x0b, 0x9c, 0x9f, 0x75, 0x60, + 0x77, 0xe9, 0x2b, 0x45, 0xc1, 0x21, 0x0e, 0xb2, 0xbc, 0x16, 0xda, 0xb4, 0xea, 0xef, 0xf9, 0x17, + 0xa4, 0xcc, 0x0f, 0x09, 0xb5, 0x6c, 0x1e, 0x55, 0x16, 0x7e, 0xdd, 0x87, 0xf6, 0x03, 0xd9, 0x97, + 0xf1, 0x51, 0x70, 0x07, 0x8b, 0xc2, 0x10, 0x1f, 0xff, 0x0d, 0xcd, 0xe8, 0x88, 0x3f, 0xe7, 0xa9, + 0xf0, 0x27, 0xb4, 0xea, 0x65, 0x1f, 0xe3, 0x34, 0x60, 0x92, 0xc7, 0xe9, 0x46, 0xc5, 0x32, 0x5b, + 0xe1, 0x34, 0x23, 0x6a, 0x42, 0xd2, 0xb5, 0x6e, 0x61, 0x93, 0x0b, 0xa8, 0xf2, 0xee, 0x13, 0x28, + 0xf6, 0xf0, 0x6d, 0x61, 0x1c, 0x0b, 0xb5, 0x41, 0x6a, 0xe1, 0x0e, 0x6e, 0xb3, 0x4f, 0x03, 0x0f, + 0x34, 0x1b, 0xb3, 0x0f, 0xd3, 0x4f, 0x86, 0x3f, 0x7c, 0xa9, 0x58, 0xd1, 0x43, 0x6d, 0x50, 0x50, + 0xb4, 0x13, 0xbe, 0xda, 0x32, 0xc5, 0xf7, 0x9d, 0xc7, 0xf4, 0x3f, 0xa0, 0x95, 0x41, 0xb3, 0x15, + 0xba, 0x0a, 0xf3, 0x71, 0x90, 0xfa, 0xe6, 0x9e, 0x65, 0xd2, 0xbf, 0x90, 0xc7, 0x43, 0xb0, 0x34, + 0xdb, 0xe4, 0xf4, 0xca, 0xf9, 0x26, 0xe7, 0x0e, 0x14, 0x7c, 0x52, 0x3a, 0x7b, 0x32, 0x27, 0x9d, + 0x3d, 0x79, 0x0f, 0x80, 0x90, 0xa0, 0x4d, 0x00, 0x7f, 0x7e, 0xd2, 0x5d, 0xb6, 0xec, 0xf8, 0xd1, + 0xf4, 0x67, 0x7a, 0xb0, 0x33, 0x01, 0x00, 0xd4, 0x81, 0xb9, 0xae, 0x61, 0xaa, 0x0e, 0xee, 0xec, + 0xab, 0x5c, 0x72, 0x04, 0x37, 0xfb, 0x36, 0x8c, 0xf4, 0x6c, 0xd7, 0x30, 0x1b, 0xb8, 0xb3, 0xbf, + 0xe6, 0xc1, 0xa2, 0x77, 0xc3, 0x39, 0x5f, 0x1c, 0x96, 0xa9, 0x1e, 0x58, 0x9d, 0x96, 0x6a, 0xe3, + 0x7d, 0x55, 0xa7, 0x97, 0xd5, 0xe5, 0xa8, 0x10, 0xcf, 0x78, 0x24, 0xdb, 0xe6, 0x75, 0xab, 0xd3, + 0x52, 0xf0, 0x7e, 0x95, 0x54, 0xa3, 0x87, 0xc1, 0x97, 0x85, 0x6a, 0xb4, 0x9c, 0x85, 0xfc, 0x72, + 0xec, 0x7c, 0x5c, 0xc9, 0x79, 0x85, 0xf5, 0x96, 0xb3, 0x9a, 0xfe, 0xd0, 0xc7, 0x96, 0x66, 0x3e, + 0xf7, 0xb1, 0xa5, 0x19, 0xf9, 0x1a, 0xbd, 0x5a, 0x89, 0x4f, 0x3a, 0xec, 0xa0, 0x2b, 0x90, 0xd1, + 0xc4, 0x03, 0xfb, 0x70, 0xea, 0x98, 0x49, 0xeb, 0x93, 0xca, 0x1f, 0x8b, 0x40, 0x72, 0xed, 0xe6, + 0x8e, 0x66, 0xd8, 0xa8, 0x06, 0xb3, 0xbe, 0xd2, 0x4e, 0x3b, 0xff, 0x7d, 0x3d, 0x17, 0x06, 0xa0, + 0x36, 0xee, 0xd8, 0xdb, 0xb1, 0x30, 0x83, 0x07, 0xe2, 0x02, 0x5d, 0xbd, 0x01, 0x29, 0xd6, 0x42, + 0x07, 0xbd, 0x04, 0x89, 0x1e, 0xf9, 0xc1, 0x93, 0xf8, 0x8b, 0x63, 0x15, 0x9d, 0xd2, 0x07, 0xd5, + 0x82, 0xf1, 0xc9, 0x7f, 0x16, 0x01, 0x58, 0xbb, 0x79, 0xb3, 0x69, 0x1b, 0xbd, 0x0e, 0x76, 0xdf, + 0xae, 0x2e, 0x6f, 0xc0, 0xa9, 0xc0, 0x97, 0xc0, 0xb6, 0x3e, 0x75, 0xb7, 0xe7, 0xfc, 0x6f, 0x81, + 0x6d, 0x7d, 0x24, 0x5a, 0xcb, 0x71, 0x3d, 0xb4, 0xd8, 0xd4, 0x68, 0x6b, 0x8e, 0x3b, 0x2c, 0xc7, + 0x57, 0x21, 0xeb, 0x77, 0xdd, 0x41, 0x75, 0x48, 0xbb, 0xfc, 0x37, 0x17, 0xa7, 0x3c, 0x5e, 0x9c, + 0x82, 0x2d, 0x28, 0x52, 0x8f, 0x5d, 0xfe, 0x9f, 0x44, 0xaa, 0xfe, 0x44, 0xf8, 0x4b, 0xa5, 0x48, + 0xc4, 0xc2, 0x73, 0x0b, 0x1c, 0x7b, 0x1b, 0x2c, 0x30, 0xc7, 0x0a, 0x88, 0xf5, 0x9b, 0xa3, 0x30, + 0xb7, 0x2b, 0x26, 0xe9, 0x5f, 0x5a, 0x29, 0xec, 0x42, 0x0a, 0x9b, 0xae, 0x6d, 0x78, 0xbb, 0x4d, + 0x4f, 0x8f, 0x1b, 0xec, 0x11, 0x7d, 0xa9, 0x99, 0xae, 0x7d, 0x14, 0x1c, 0x7a, 0x81, 0x15, 0x10, + 0xc3, 0x2f, 0xc6, 0x60, 0x61, 0x1c, 0x2b, 0x7a, 0x0c, 0x8a, 0xba, 0x8d, 0x69, 0x41, 0xf8, 0x3b, + 0xc8, 0x82, 0x28, 0xe6, 0x4b, 0x8a, 0x02, 0xc4, 0x41, 0x23, 0x5a, 0x45, 0x48, 0xef, 0xcf, 0x23, + 0x2b, 0xf8, 0x08, 0x74, 0x51, 0xc1, 0x50, 0x14, 0x1f, 0x56, 0xec, 0x69, 0x1d, 0xcd, 0xd4, 0xf1, + 0x7d, 0x68, 0xc2, 0xf0, 0x0a, 0x20, 0xbe, 0xd6, 0xa8, 0x30, 0x4c, 0x74, 0x13, 0x52, 0x02, 0x3e, + 0xfe, 0x36, 0xc0, 0x0b, 0x30, 0xf4, 0x10, 0xe4, 0x82, 0x0b, 0x03, 0xf5, 0x53, 0xe2, 0x4a, 0x36, + 0xb0, 0x2e, 0x4c, 0x5a, 0x79, 0x92, 0xc7, 0xae, 0x3c, 0xdc, 0x15, 0xfc, 0x85, 0x18, 0xcc, 0x2a, + 0xb8, 0xf5, 0x57, 0x70, 0xe0, 0xbe, 0x06, 0x80, 0x4d, 0x6a, 0x62, 0x6c, 0xef, 0x63, 0xec, 0x86, + 0x8d, 0x44, 0x86, 0xe1, 0xad, 0x39, 0xee, 0x57, 0x6b, 0xf4, 0xfe, 0x75, 0x14, 0x72, 0xc1, 0xd1, + 0xfb, 0x2b, 0xb0, 0xb2, 0xa1, 0x2d, 0xdf, 0xa4, 0xb1, 0xef, 0x49, 0x1e, 0x1f, 0x67, 0xd2, 0x86, + 0xf4, 0x7a, 0x82, 0x2d, 0xfb, 0xd3, 0x18, 0x24, 0xf9, 0xa9, 0xb9, 0xed, 0x21, 0x1f, 0x37, 0x32, + 0xe9, 0x8b, 0xf8, 0xbc, 0xf8, 0x22, 0x7e, 0xa4, 0x8b, 0xfb, 0x08, 0x14, 0x48, 0x48, 0x1d, 0x3a, + 0x8a, 0x17, 0x39, 0x9f, 0xa7, 0xe1, 0xb0, 0x7f, 0xf0, 0x1c, 0x2d, 0x41, 0x96, 0x90, 0xf9, 0x36, + 0x9b, 0xd0, 0x40, 0x57, 0x3b, 0xac, 0xb1, 0x12, 0xf4, 0x14, 0xa0, 0x03, 0x2f, 0xf1, 0xa1, 0xfa, + 0x82, 0x20, 0x74, 0xb3, 0x7e, 0x8d, 0x20, 0x7f, 0x10, 0x80, 0xb4, 0x42, 0x65, 0xf7, 0x29, 0xf3, + 0xbb, 0xa9, 0x49, 0xc9, 0x1a, 0xbd, 0x53, 0xf9, 0x3b, 0x22, 0xcc, 0x55, 0x1e, 0x88, 0xb6, 0x79, + 0xd0, 0xa2, 0x9e, 0x6c, 0x36, 0x7c, 0xf1, 0xad, 0xa5, 0xd2, 0x91, 0xd6, 0xed, 0xac, 0xca, 0x23, + 0x20, 0xe5, 0x51, 0xb9, 0x00, 0xe2, 0x4d, 0x87, 0x03, 0x77, 0xb4, 0x05, 0xd2, 0x2d, 0x7c, 0xa4, + 0xda, 0xfc, 0xaf, 0x4c, 0xab, 0xfb, 0x18, 0xf3, 0xf0, 0xe6, 0xec, 0xca, 0x88, 0x6b, 0xad, 0x57, + 0xaa, 0x96, 0x11, 0x8a, 0x03, 0x0a, 0xb7, 0xf0, 0x91, 0xc2, 0x99, 0xaf, 0x61, 0xbc, 0xfa, 0x2e, + 0x32, 0x4f, 0xee, 0xfe, 0xee, 0x4f, 0x5e, 0x38, 0x17, 0x68, 0xf2, 0xa1, 0x97, 0x71, 0x63, 0xc3, + 0x2d, 0xff, 0x78, 0x04, 0x90, 0xbf, 0x78, 0x79, 0x47, 0xf9, 0x37, 0x01, 0x02, 0xf1, 0x43, 0xe4, + 0xf8, 0xb8, 0xc4, 0xe7, 0x0f, 0xc5, 0x25, 0x81, 0xc9, 0xf9, 0x5e, 0x7f, 0xa9, 0x88, 0x9e, 0xa0, + 0x4b, 0x82, 0x89, 0xce, 0xf9, 0x19, 0xf9, 0xad, 0x08, 0x9c, 0x1d, 0xd2, 0x6c, 0xaf, 0xc9, 0x3a, + 0x20, 0x3b, 0x50, 0x49, 0x35, 0x44, 0xec, 0x1e, 0xdf, 0xdf, 0x44, 0x99, 0xb5, 0x87, 0x96, 0x87, + 0x77, 0x68, 0xcd, 0xe3, 0x46, 0xed, 0xd7, 0x22, 0x30, 0x1f, 0x6c, 0x91, 0xd7, 0xb7, 0x06, 0xe4, + 0x82, 0x6d, 0xe1, 0xbd, 0x7a, 0xd7, 0x34, 0xbd, 0x0a, 0x76, 0x28, 0x04, 0x42, 0xfa, 0x22, 0x66, + 0x11, 0xcb, 0xfd, 0x3d, 0x33, 0xb5, 0x94, 0x44, 0xc3, 0x46, 0x9a, 0x15, 0x36, 0x58, 0xdf, 0x1e, + 0x85, 0xf8, 0x8e, 0x65, 0x75, 0xd0, 0x37, 0x45, 0x60, 0xd6, 0xb4, 0x5c, 0x95, 0xcc, 0x3d, 0xdc, + 0x52, 0x79, 0xf2, 0x81, 0x59, 0xe6, 0x9b, 0x27, 0x93, 0xde, 0xe7, 0xdf, 0x5a, 0x1a, 0x86, 0x1a, + 0x75, 0xc1, 0x7a, 0xd1, 0xb4, 0xdc, 0x0a, 0x25, 0x6a, 0xb2, 0xfc, 0xc4, 0x1d, 0xc8, 0x87, 0xdf, + 0xcf, 0xcc, 0xb9, 0x72, 0xe2, 0xf7, 0xe7, 0x27, 0xbe, 0x3b, 0xb7, 0x17, 0x78, 0x31, 0xbb, 0xe6, + 0xf8, 0x0f, 0xc9, 0xe0, 0xbe, 0x06, 0xd2, 0xcd, 0xc1, 0x73, 0x4c, 0x35, 0x48, 0x89, 0x73, 0x4b, + 0x91, 0x29, 0x8f, 0x44, 0x05, 0x25, 0xce, 0x79, 0xe5, 0xdf, 0x8f, 0xc2, 0xd9, 0xaa, 0x65, 0x3a, + 0x3c, 0x8f, 0xc4, 0x8d, 0x00, 0x4b, 0x13, 0x1f, 0xa1, 0x6b, 0x63, 0xb3, 0x5c, 0xe7, 0xbe, 0xf8, + 0xd6, 0xd2, 0x19, 0x66, 0xb8, 0x06, 0x29, 0xe4, 0xe1, 0x44, 0xd7, 0x4d, 0x28, 0x92, 0x85, 0x5a, + 0xb7, 0xcc, 0xaf, 0x30, 0xcf, 0x95, 0xb7, 0x3a, 0x2d, 0xde, 0xdc, 0x5b, 0x98, 0xcc, 0xa9, 0xa2, + 0x89, 0xef, 0x84, 0x70, 0x63, 0xf7, 0x87, 0x6b, 0xe2, 0x3b, 0x01, 0x5c, 0x7f, 0x47, 0x3d, 0x1e, + 0xda, 0x51, 0xbf, 0x02, 0x31, 0x62, 0x5b, 0x13, 0x27, 0x30, 0x44, 0x84, 0x21, 0xb0, 0x5c, 0x36, + 0xe0, 0x2c, 0xcf, 0x45, 0x38, 0xdb, 0xfb, 0x54, 0xdc, 0x98, 0x76, 0xe8, 0x65, 0x7c, 0x74, 0xdf, + 0x89, 0x89, 0x0b, 0x3f, 0x1b, 0x01, 0xf0, 0xf3, 0x75, 0xe8, 0x49, 0x38, 0x53, 0xd9, 0xde, 0x5a, + 0x53, 0x1b, 0xcd, 0x72, 0x73, 0xb7, 0x11, 0xfe, 0xd3, 0x2a, 0xe2, 0x92, 0x27, 0xa7, 0x87, 0x75, + 0x63, 0xdf, 0xc0, 0x2d, 0xf4, 0x28, 0xcc, 0x87, 0xa9, 0xc9, 0x53, 0x6d, 0x4d, 0x8a, 0x94, 0x72, + 0x77, 0xef, 0x2d, 0xa7, 0x59, 0x9c, 0x82, 0x5b, 0xe8, 0x3c, 0x9c, 0x1a, 0xa6, 0xab, 0x6f, 0xad, + 0x4b, 0xd1, 0x52, 0xfe, 0xee, 0xbd, 0xe5, 0x8c, 0x17, 0xd0, 0x20, 0x19, 0x50, 0x90, 0x92, 0xe3, + 0xc5, 0x4a, 0x70, 0xf7, 0xde, 0x72, 0x92, 0xcd, 0xad, 0x52, 0xfc, 0x43, 0x3f, 0xbc, 0x38, 0x73, + 0xe1, 0xeb, 0x00, 0xea, 0xe6, 0xbe, 0xad, 0xe9, 0xd4, 0xaa, 0x94, 0xe0, 0x74, 0x7d, 0xeb, 0x9a, + 0x52, 0xae, 0x36, 0xeb, 0xdb, 0x5b, 0x03, 0x7f, 0x11, 0x26, 0x5c, 0xb7, 0xb6, 0xbd, 0x5b, 0xd9, + 0xa8, 0xa9, 0x8d, 0xfa, 0xfa, 0x16, 0x3b, 0x18, 0x10, 0xaa, 0x7b, 0x65, 0xab, 0x59, 0xdf, 0xac, + 0x49, 0xd1, 0xca, 0xb5, 0xb1, 0x1b, 0x4f, 0x4f, 0x1e, 0x3b, 0x6b, 0xfd, 0xa5, 0x2e, 0xb4, 0xfb, + 0xf4, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x54, 0x93, 0x14, 0xcd, 0x65, 0xa2, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -2326,6 +2448,9 @@ func (this *Params) Equal(that interface{}) bool { if !this.MinCommissionRate.Equal(that1.MinCommissionRate) { return false } + if !this.KeyRotationFee.Equal(&that1.KeyRotationFee) { + return false + } return true } func (this *RedelegationEntryResponse) Equal(that interface{}) bool { @@ -3219,6 +3344,16 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.KeyRotationFee.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a { size := m.MinCommissionRate.Size() i -= size @@ -3251,12 +3386,12 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x10 } - n12, err12 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingTime):]) - if err12 != nil { - return 0, err12 + n13, err13 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingTime):]) + if err13 != nil { + return 0, err13 } - i -= n12 - i = encodeVarintStaking(dAtA, i, uint64(n12)) + i -= n13 + i = encodeVarintStaking(dAtA, i, uint64(n13)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -3475,6 +3610,107 @@ func (m *ValidatorUpdates) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ConsPubKeyRotationHistory) 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 *ConsPubKeyRotationHistory) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConsPubKeyRotationHistory) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Fee.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + if m.Height != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x20 + } + if m.NewConsPubkey != nil { + { + size, err := m.NewConsPubkey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.OldConsPubkey != nil { + { + size, err := m.OldConsPubkey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.OperatorAddress) > 0 { + i -= len(m.OperatorAddress) + copy(dAtA[i:], m.OperatorAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.OperatorAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ValAddrsOfRotatedConsKeys) 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 *ValAddrsOfRotatedConsKeys) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValAddrsOfRotatedConsKeys) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintStaking(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintStaking(dAtA []byte, offset int, v uint64) int { offset -= sovStaking(v) base := offset @@ -3831,6 +4067,8 @@ func (m *Params) Size() (n int) { } l = m.MinCommissionRate.Size() n += 1 + l + sovStaking(uint64(l)) + l = m.KeyRotationFee.Size() + n += 1 + l + sovStaking(uint64(l)) return n } @@ -3905,6 +4143,47 @@ func (m *ValidatorUpdates) Size() (n int) { return n } +func (m *ConsPubKeyRotationHistory) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.OperatorAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + if m.OldConsPubkey != nil { + l = m.OldConsPubkey.Size() + n += 1 + l + sovStaking(uint64(l)) + } + if m.NewConsPubkey != nil { + l = m.NewConsPubkey.Size() + n += 1 + l + sovStaking(uint64(l)) + } + if m.Height != 0 { + n += 1 + sovStaking(uint64(m.Height)) + } + l = m.Fee.Size() + n += 1 + l + sovStaking(uint64(l)) + return n +} + +func (m *ValAddrsOfRotatedConsKeys) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovStaking(uint64(l)) + } + } + return n +} + func sovStaking(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -6565,6 +6844,39 @@ func (m *Params) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KeyRotationFee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.KeyRotationFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -7138,6 +7450,294 @@ func (m *ValidatorUpdates) Unmarshal(dAtA []byte) error { } return nil } +func (m *ConsPubKeyRotationHistory) 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 ErrIntOverflowStaking + } + 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: ConsPubKeyRotationHistory: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConsPubKeyRotationHistory: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OperatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OperatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OldConsPubkey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.OldConsPubkey == nil { + m.OldConsPubkey = &types1.Any{} + } + if err := m.OldConsPubkey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewConsPubkey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NewConsPubkey == nil { + m.NewConsPubkey = &types1.Any{} + } + if err := m.NewConsPubkey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + } + m.Height = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Height |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Fee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Fee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValAddrsOfRotatedConsKeys) 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 ErrIntOverflowStaking + } + 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: ValAddrsOfRotatedConsKeys: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValAddrsOfRotatedConsKeys: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipStaking(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/staking/types/tx.pb.go b/x/staking/types/tx.pb.go index bfbf16fc1b52..9929daa236c3 100644 --- a/x/staking/types/tx.pb.go +++ b/x/staking/types/tx.pb.go @@ -649,6 +649,87 @@ func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo +// MsgRotateConsPubKey is the Msg/RotateConsPubKey request type. +// +// Since: cosmos-sdk 0.48 +type MsgRotateConsPubKey struct { + ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty"` + NewPubkey *types.Any `protobuf:"bytes,3,opt,name=new_pubkey,json=newPubkey,proto3" json:"new_pubkey,omitempty"` +} + +func (m *MsgRotateConsPubKey) Reset() { *m = MsgRotateConsPubKey{} } +func (m *MsgRotateConsPubKey) String() string { return proto.CompactTextString(m) } +func (*MsgRotateConsPubKey) ProtoMessage() {} +func (*MsgRotateConsPubKey) Descriptor() ([]byte, []int) { + return fileDescriptor_0926ef28816b35ab, []int{14} +} +func (m *MsgRotateConsPubKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRotateConsPubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRotateConsPubKey.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 *MsgRotateConsPubKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRotateConsPubKey.Merge(m, src) +} +func (m *MsgRotateConsPubKey) XXX_Size() int { + return m.Size() +} +func (m *MsgRotateConsPubKey) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRotateConsPubKey.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRotateConsPubKey proto.InternalMessageInfo + +// MsgRotateConsPubKeyResponse defines the response structure for executing a +// MsgRotateConsPubKey message. +// +// Since: cosmos-sdk 0.48 +type MsgRotateConsPubKeyResponse struct { +} + +func (m *MsgRotateConsPubKeyResponse) Reset() { *m = MsgRotateConsPubKeyResponse{} } +func (m *MsgRotateConsPubKeyResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRotateConsPubKeyResponse) ProtoMessage() {} +func (*MsgRotateConsPubKeyResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_0926ef28816b35ab, []int{15} +} +func (m *MsgRotateConsPubKeyResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRotateConsPubKeyResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRotateConsPubKeyResponse.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 *MsgRotateConsPubKeyResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRotateConsPubKeyResponse.Merge(m, src) +} +func (m *MsgRotateConsPubKeyResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRotateConsPubKeyResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRotateConsPubKeyResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRotateConsPubKeyResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgCreateValidator)(nil), "cosmos.staking.v1beta1.MsgCreateValidator") proto.RegisterType((*MsgCreateValidatorResponse)(nil), "cosmos.staking.v1beta1.MsgCreateValidatorResponse") @@ -664,83 +745,90 @@ func init() { proto.RegisterType((*MsgCancelUnbondingDelegationResponse)(nil), "cosmos.staking.v1beta1.MsgCancelUnbondingDelegationResponse") proto.RegisterType((*MsgUpdateParams)(nil), "cosmos.staking.v1beta1.MsgUpdateParams") proto.RegisterType((*MsgUpdateParamsResponse)(nil), "cosmos.staking.v1beta1.MsgUpdateParamsResponse") + proto.RegisterType((*MsgRotateConsPubKey)(nil), "cosmos.staking.v1beta1.MsgRotateConsPubKey") + proto.RegisterType((*MsgRotateConsPubKeyResponse)(nil), "cosmos.staking.v1beta1.MsgRotateConsPubKeyResponse") } func init() { proto.RegisterFile("cosmos/staking/v1beta1/tx.proto", fileDescriptor_0926ef28816b35ab) } var fileDescriptor_0926ef28816b35ab = []byte{ - // 1128 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x57, 0x4d, 0x6f, 0x1b, 0x45, - 0x18, 0xf6, 0xda, 0x8d, 0x21, 0x13, 0xf2, 0xb5, 0x49, 0x5a, 0x7b, 0x69, 0xed, 0xb2, 0x0d, 0x4d, - 0x14, 0xf0, 0x9a, 0x06, 0xc4, 0x87, 0xa9, 0x50, 0xe3, 0xba, 0x85, 0x82, 0x8c, 0xa2, 0x0d, 0xe1, - 0x80, 0x90, 0xac, 0xf1, 0xee, 0x64, 0xbd, 0x8a, 0x77, 0x67, 0xb3, 0x33, 0x8e, 0xea, 0x1b, 0xe2, - 0x04, 0x08, 0x89, 0xfe, 0x81, 0x4a, 0xe5, 0x06, 0xb7, 0x1c, 0xf2, 0x07, 0x38, 0x20, 0x55, 0x9c, - 0xaa, 0x9c, 0x10, 0x87, 0x82, 0x92, 0x43, 0xfa, 0x33, 0xd0, 0xee, 0xce, 0x7e, 0xfa, 0x33, 0x81, - 0x5e, 0x7a, 0x89, 0x9d, 0x99, 0xe7, 0x7d, 0xde, 0x8f, 0xe7, 0x7d, 0x67, 0xc6, 0xa0, 0xa8, 0x60, - 0x62, 0x60, 0x52, 0x26, 0x14, 0xee, 0xea, 0xa6, 0x56, 0xde, 0xbf, 0xd1, 0x44, 0x14, 0xde, 0x28, - 0xd3, 0xfb, 0x92, 0x65, 0x63, 0x8a, 0xf9, 0x8b, 0x1e, 0x40, 0x62, 0x00, 0x89, 0x01, 0x84, 0xbc, - 0x86, 0xb1, 0xd6, 0x46, 0x65, 0x17, 0xd5, 0xec, 0xec, 0x94, 0xa1, 0xd9, 0xf5, 0x4c, 0x84, 0x62, - 0x72, 0x8b, 0xea, 0x06, 0x22, 0x14, 0x1a, 0x16, 0x03, 0x2c, 0x6a, 0x58, 0xc3, 0xee, 0xd7, 0xb2, - 0xf3, 0x8d, 0xad, 0xe6, 0x3d, 0x4f, 0x0d, 0x6f, 0x83, 0xb9, 0xf5, 0xb6, 0x0a, 0x2c, 0xca, 0x26, - 0x24, 0x28, 0x08, 0x51, 0xc1, 0xba, 0xc9, 0xf6, 0x97, 0x07, 0x64, 0xe1, 0x07, 0xed, 0xa1, 0x2e, - 0x31, 0x94, 0x41, 0x1c, 0x84, 0xf3, 0xc1, 0x36, 0xe6, 0xa1, 0xa1, 0x9b, 0xb8, 0xec, 0xfe, 0xf5, - 0x96, 0xc4, 0x1f, 0x27, 0x00, 0x5f, 0x27, 0xda, 0x6d, 0x1b, 0x41, 0x8a, 0xbe, 0x84, 0x6d, 0x5d, - 0x85, 0x14, 0xdb, 0xfc, 0x26, 0x98, 0x52, 0x11, 0x51, 0x6c, 0xdd, 0xa2, 0x3a, 0x36, 0x73, 0xdc, - 0x55, 0x6e, 0x75, 0x6a, 0xfd, 0x9a, 0xd4, 0xbf, 0x46, 0x52, 0x2d, 0x84, 0x56, 0x27, 0x1f, 0x3f, - 0x2d, 0xa6, 0x7e, 0x39, 0x3d, 0x58, 0xe3, 0xe4, 0x28, 0x05, 0x2f, 0x03, 0xa0, 0x60, 0xc3, 0xd0, - 0x09, 0x71, 0x08, 0xd3, 0x2e, 0xe1, 0xca, 0x20, 0xc2, 0xdb, 0x01, 0x52, 0x86, 0x14, 0x91, 0x28, - 0x69, 0x84, 0x85, 0xdf, 0x03, 0x0b, 0x86, 0x6e, 0x36, 0x08, 0x6a, 0xef, 0x34, 0x54, 0xd4, 0x46, - 0x1a, 0x74, 0xa3, 0xcd, 0x5c, 0xe5, 0x56, 0x27, 0xab, 0x1b, 0x8e, 0xcd, 0x5f, 0x4f, 0x8b, 0xd7, - 0x35, 0x9d, 0xb6, 0x3a, 0x4d, 0x49, 0xc1, 0x06, 0x2b, 0x36, 0xfb, 0x28, 0x11, 0x75, 0xb7, 0x4c, - 0xbb, 0x16, 0x22, 0xd2, 0x3d, 0x93, 0x1e, 0x1d, 0x96, 0x00, 0x8b, 0xe6, 0x9e, 0x49, 0x3d, 0x5f, - 0xf3, 0x86, 0x6e, 0x6e, 0xa1, 0xf6, 0x4e, 0x2d, 0xe0, 0xe6, 0x3f, 0x06, 0xf3, 0xcc, 0x13, 0xb6, - 0x1b, 0x50, 0x55, 0x6d, 0x44, 0x48, 0xee, 0x82, 0xeb, 0x50, 0x38, 0x3a, 0x2c, 0x2d, 0x32, 0x8a, - 0x0d, 0x6f, 0x67, 0x8b, 0xda, 0xba, 0xa9, 0xe5, 0x38, 0x79, 0x2e, 0x30, 0x62, 0x3b, 0xfc, 0xe7, - 0x60, 0x7e, 0xdf, 0x2f, 0x77, 0x40, 0x34, 0xe1, 0x12, 0xbd, 0x76, 0x74, 0x58, 0xba, 0xc2, 0x88, - 0x02, 0x49, 0x62, 0x8c, 0xf2, 0xdc, 0x7e, 0x62, 0x9d, 0xbf, 0x0b, 0xb2, 0x56, 0xa7, 0xb9, 0x8b, - 0xba, 0xb9, 0xac, 0x5b, 0xdb, 0x45, 0xc9, 0xeb, 0x4e, 0xc9, 0xef, 0x4e, 0x69, 0xc3, 0xec, 0x56, - 0x73, 0x7f, 0x84, 0x31, 0x2a, 0x76, 0xd7, 0xa2, 0x58, 0xda, 0xec, 0x34, 0x3f, 0x43, 0x5d, 0x99, - 0x59, 0xf3, 0x15, 0x30, 0xb1, 0x0f, 0xdb, 0x1d, 0x94, 0x7b, 0xc9, 0xa5, 0xc9, 0xfb, 0x12, 0x39, - 0x2d, 0x19, 0xd1, 0x47, 0x8f, 0x29, 0xed, 0x99, 0x54, 0x6e, 0x7d, 0xf7, 0xa8, 0x98, 0x7a, 0xf6, - 0xa8, 0x98, 0xfa, 0xf6, 0xf4, 0x60, 0xad, 0x37, 0xbd, 0x1f, 0x4e, 0x0f, 0xd6, 0xae, 0x44, 0x6a, - 0xdf, 0xdb, 0x77, 0xe2, 0x65, 0x20, 0xf4, 0xae, 0xca, 0x88, 0x58, 0xd8, 0x24, 0x48, 0xfc, 0x2d, - 0x03, 0xe6, 0xea, 0x44, 0xbb, 0xa3, 0xea, 0xf4, 0x79, 0xb6, 0x6a, 0x5f, 0x69, 0xd2, 0xe7, 0x97, - 0x06, 0x82, 0xd9, 0xb0, 0x69, 0x1b, 0x36, 0xa4, 0x88, 0xb5, 0xe8, 0xfb, 0x63, 0xb6, 0x67, 0x0d, - 0x29, 0x91, 0xf6, 0xac, 0x21, 0x45, 0x9e, 0x51, 0x62, 0x13, 0xc2, 0xb7, 0xfa, 0x4f, 0xc2, 0x85, - 0x33, 0xb9, 0xe9, 0x99, 0x82, 0x3e, 0x03, 0x50, 0xf9, 0x68, 0xb4, 0xc6, 0xaf, 0xc6, 0x35, 0x8e, - 0xc9, 0x25, 0x0a, 0x20, 0x97, 0x5c, 0x0b, 0xf4, 0x7d, 0x98, 0x06, 0x53, 0x75, 0xa2, 0x31, 0x6f, - 0x88, 0xbf, 0xd3, 0x6f, 0xd8, 0x38, 0x37, 0xa7, 0xdc, 0xa0, 0x61, 0x1b, 0x77, 0xd4, 0xfe, 0x83, - 0x9e, 0x37, 0x41, 0x16, 0x1a, 0xb8, 0x63, 0x52, 0x57, 0xc6, 0x71, 0x67, 0x84, 0xd9, 0x54, 0x3e, - 0x88, 0x15, 0xb0, 0x27, 0x3f, 0xa7, 0x80, 0x17, 0xe3, 0x05, 0xf4, 0xeb, 0x21, 0x2e, 0x81, 0x85, - 0xc8, 0xbf, 0x41, 0xd9, 0xbe, 0xcf, 0xb8, 0x67, 0x78, 0x15, 0x69, 0xba, 0x29, 0x23, 0xf5, 0x7f, - 0xae, 0xde, 0x36, 0x58, 0x0a, 0xab, 0x47, 0x6c, 0xe5, 0xec, 0x15, 0x5c, 0x08, 0xec, 0xb7, 0x6c, - 0xa5, 0x2f, 0xad, 0x4a, 0x68, 0x40, 0x9b, 0x39, 0x3b, 0x6d, 0x8d, 0xd0, 0x5e, 0x6d, 0x2e, 0x9c, - 0x43, 0x9b, 0x5b, 0xa3, 0xb5, 0x49, 0x1c, 0x60, 0x89, 0xa2, 0x8b, 0x96, 0x7b, 0x80, 0x25, 0x56, - 0x7d, 0xa5, 0x78, 0xd9, 0x3d, 0x09, 0xac, 0x36, 0x72, 0x46, 0xa9, 0xe1, 0x3c, 0x17, 0xd8, 0x79, - 0x25, 0xf4, 0x9c, 0xd6, 0x5f, 0xf8, 0x6f, 0x89, 0xea, 0xb4, 0x13, 0xe7, 0x83, 0xbf, 0x8b, 0x9c, - 0x17, 0xeb, 0x4c, 0xc8, 0xe0, 0x60, 0xc4, 0x9f, 0xd3, 0x60, 0xba, 0x4e, 0xb4, 0x6d, 0x53, 0x7d, - 0xa1, 0xc7, 0xe6, 0xc3, 0xd1, 0xd2, 0xe4, 0xe2, 0xd2, 0x84, 0x15, 0x11, 0x7f, 0xe5, 0xc0, 0x52, - 0x6c, 0xe5, 0x79, 0x2a, 0x12, 0x49, 0x34, 0x7d, 0xf6, 0x44, 0xc5, 0x67, 0x69, 0x70, 0xd9, 0xb9, - 0x03, 0xa1, 0xa9, 0xa0, 0xf6, 0xb6, 0xd9, 0xc4, 0xa6, 0xaa, 0x9b, 0x5a, 0xe4, 0x09, 0xf2, 0x22, - 0xca, 0xcb, 0xaf, 0x80, 0x59, 0xc5, 0xb9, 0xf5, 0x1d, 0x15, 0x5a, 0x48, 0xd7, 0x5a, 0xde, 0x00, - 0x67, 0xe4, 0x19, 0x7f, 0xf9, 0x13, 0x77, 0xb5, 0xf2, 0xe9, 0xe8, 0x3e, 0x58, 0x49, 0xbc, 0x31, - 0x06, 0x55, 0x52, 0xbc, 0x0e, 0x96, 0x87, 0xed, 0x07, 0x07, 0xec, 0xef, 0x1c, 0x98, 0x75, 0xda, - 0xc7, 0x52, 0x21, 0x45, 0x9b, 0xd0, 0x86, 0x06, 0xe1, 0xdf, 0x05, 0x93, 0xb0, 0x43, 0x5b, 0xd8, - 0xd6, 0x69, 0x77, 0x64, 0xf5, 0x43, 0x28, 0xbf, 0x01, 0xb2, 0x96, 0xcb, 0xc0, 0x9a, 0xa3, 0x30, - 0xe8, 0xa5, 0xe2, 0xf9, 0x89, 0xd5, 0xca, 0x33, 0xac, 0xbc, 0xe7, 0xa4, 0x1e, 0x52, 0x3a, 0x29, - 0x2f, 0x47, 0x52, 0xbe, 0x1f, 0xfc, 0x3c, 0x48, 0xc4, 0x2c, 0xe6, 0xc1, 0xa5, 0xc4, 0x92, 0x9f, - 0xe2, 0xfa, 0xc3, 0x2c, 0xc8, 0xd4, 0x89, 0xc6, 0xef, 0x81, 0xd9, 0xe4, 0x6f, 0x81, 0xb5, 0x41, - 0x11, 0xf6, 0xbe, 0xd4, 0x84, 0xf5, 0xf1, 0xb1, 0xc1, 0x08, 0xee, 0x82, 0xe9, 0xf8, 0x8b, 0x6e, - 0x75, 0x08, 0x49, 0x0c, 0x29, 0xbc, 0x35, 0x2e, 0x32, 0x70, 0xf6, 0x35, 0x78, 0x39, 0x78, 0x5e, - 0x5c, 0x1b, 0x62, 0xed, 0x83, 0x84, 0x37, 0xc6, 0x00, 0x05, 0xec, 0x7b, 0x60, 0x36, 0x79, 0x0b, - 0x0f, 0xab, 0x5e, 0x02, 0x3b, 0xb4, 0x7a, 0x83, 0xae, 0x94, 0x26, 0x00, 0x91, 0xa3, 0xff, 0xf5, - 0x21, 0x0c, 0x21, 0x4c, 0x28, 0x8d, 0x05, 0x0b, 0x7c, 0xfc, 0xc4, 0x81, 0xfc, 0xe0, 0xf3, 0xe8, - 0x9d, 0x61, 0x9a, 0x0f, 0xb2, 0x12, 0x6e, 0x9e, 0xc7, 0x2a, 0x88, 0xa8, 0x05, 0x5e, 0x89, 0x4d, - 0xe3, 0xca, 0xb0, 0x84, 0x22, 0x40, 0xa1, 0x3c, 0x26, 0xd0, 0xf7, 0x24, 0x4c, 0x7c, 0xe3, 0xcc, - 0x5e, 0xf5, 0xee, 0xe3, 0xe3, 0x02, 0xf7, 0xe4, 0xb8, 0xc0, 0xfd, 0x73, 0x5c, 0xe0, 0x1e, 0x9c, - 0x14, 0x52, 0x4f, 0x4e, 0x0a, 0xa9, 0x3f, 0x4f, 0x0a, 0xa9, 0xaf, 0xde, 0x1c, 0xfa, 0xb2, 0x0e, - 0x87, 0xd1, 0x7d, 0x63, 0x37, 0xb3, 0xee, 0x75, 0xf2, 0xf6, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, - 0x4a, 0x8f, 0x88, 0xf2, 0x90, 0x10, 0x00, 0x00, + // 1204 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x57, 0xcf, 0x6f, 0xdc, 0xc4, + 0x17, 0x5f, 0xef, 0x36, 0xe9, 0x37, 0xd3, 0x6f, 0x7e, 0x39, 0x49, 0xbb, 0x71, 0x9b, 0xdd, 0xe2, + 0x86, 0x26, 0x0a, 0xc4, 0x4b, 0x53, 0xc4, 0x8f, 0xa5, 0x42, 0xcd, 0x26, 0x2d, 0x14, 0xb4, 0x28, + 0x72, 0x08, 0x07, 0x84, 0xb4, 0x9a, 0xb5, 0x27, 0x5e, 0x2b, 0xeb, 0x19, 0xc7, 0x33, 0x9b, 0x76, + 0x6f, 0x88, 0x13, 0x20, 0x24, 0x2a, 0x71, 0x46, 0x2a, 0x37, 0xb8, 0xe5, 0x90, 0x7f, 0x80, 0x03, + 0x52, 0xc5, 0xa9, 0xca, 0x09, 0x71, 0x28, 0x28, 0x39, 0xa4, 0xff, 0x01, 0x57, 0x64, 0x7b, 0xec, + 0xb5, 0xbd, 0x3f, 0x13, 0xda, 0x4b, 0x2f, 0x59, 0x67, 0xe6, 0x33, 0x9f, 0x37, 0xef, 0x7d, 0xde, + 0x7b, 0x7e, 0x06, 0x79, 0x8d, 0x50, 0x8b, 0xd0, 0x02, 0x65, 0x70, 0xc7, 0xc4, 0x46, 0x61, 0xef, + 0x46, 0x15, 0x31, 0x78, 0xa3, 0xc0, 0x1e, 0x28, 0xb6, 0x43, 0x18, 0x11, 0x2f, 0xfa, 0x00, 0x85, + 0x03, 0x14, 0x0e, 0x90, 0x66, 0x0d, 0x42, 0x8c, 0x3a, 0x2a, 0x78, 0xa8, 0x6a, 0x63, 0xbb, 0x00, + 0x71, 0xd3, 0x3f, 0x22, 0xe5, 0x93, 0x5b, 0xcc, 0xb4, 0x10, 0x65, 0xd0, 0xb2, 0x39, 0x60, 0xda, + 0x20, 0x06, 0xf1, 0x1e, 0x0b, 0xee, 0x13, 0x5f, 0x9d, 0xf5, 0x2d, 0x55, 0xfc, 0x0d, 0x6e, 0xd6, + 0xdf, 0xca, 0xf1, 0x5b, 0x56, 0x21, 0x45, 0xe1, 0x15, 0x35, 0x62, 0x62, 0xbe, 0x3f, 0xdf, 0xc5, + 0x8b, 0xe0, 0xd2, 0x3e, 0xea, 0x12, 0x47, 0x59, 0xd4, 0x45, 0xb8, 0x3f, 0x7c, 0x63, 0x12, 0x5a, + 0x26, 0x26, 0x05, 0xef, 0xaf, 0xbf, 0x24, 0x7f, 0x37, 0x04, 0xc4, 0x32, 0x35, 0xd6, 0x1c, 0x04, + 0x19, 0xfa, 0x0c, 0xd6, 0x4d, 0x1d, 0x32, 0xe2, 0x88, 0x1b, 0xe0, 0x82, 0x8e, 0xa8, 0xe6, 0x98, + 0x36, 0x33, 0x09, 0xce, 0x0a, 0x57, 0x85, 0xc5, 0x0b, 0x2b, 0xd7, 0x94, 0xce, 0x31, 0x52, 0xd6, + 0x5b, 0xd0, 0xd2, 0xc8, 0xe3, 0xa7, 0xf9, 0xd4, 0xcf, 0x27, 0xfb, 0x4b, 0x82, 0x1a, 0xa5, 0x10, + 0x55, 0x00, 0x34, 0x62, 0x59, 0x26, 0xa5, 0x2e, 0x61, 0xda, 0x23, 0x5c, 0xe8, 0x46, 0xb8, 0x16, + 0x22, 0x55, 0xc8, 0x10, 0x8d, 0x92, 0x46, 0x58, 0xc4, 0x5d, 0x30, 0x65, 0x99, 0xb8, 0x42, 0x51, + 0x7d, 0xbb, 0xa2, 0xa3, 0x3a, 0x32, 0xa0, 0x77, 0xdb, 0xcc, 0x55, 0x61, 0x71, 0xa4, 0xb4, 0xea, + 0x9e, 0xf9, 0xf3, 0x69, 0xfe, 0xba, 0x61, 0xb2, 0x5a, 0xa3, 0xaa, 0x68, 0xc4, 0xe2, 0xc1, 0xe6, + 0x3f, 0xcb, 0x54, 0xdf, 0x29, 0xb0, 0xa6, 0x8d, 0xa8, 0x72, 0x0f, 0xb3, 0xc3, 0x83, 0x65, 0xc0, + 0x6f, 0x73, 0x0f, 0x33, 0xdf, 0xd6, 0xa4, 0x65, 0xe2, 0x4d, 0x54, 0xdf, 0x5e, 0x0f, 0xb9, 0xc5, + 0x0f, 0xc0, 0x24, 0xb7, 0x44, 0x9c, 0x0a, 0xd4, 0x75, 0x07, 0x51, 0x9a, 0x3d, 0xe7, 0x19, 0x94, + 0x0e, 0x0f, 0x96, 0xa7, 0x39, 0xc5, 0xaa, 0xbf, 0xb3, 0xc9, 0x1c, 0x13, 0x1b, 0x59, 0x41, 0x9d, + 0x08, 0x0f, 0xf1, 0x1d, 0xf1, 0x13, 0x30, 0xb9, 0x17, 0x84, 0x3b, 0x24, 0x1a, 0xf2, 0x88, 0x5e, + 0x39, 0x3c, 0x58, 0x9e, 0xe3, 0x44, 0xa1, 0x24, 0x31, 0x46, 0x75, 0x62, 0x2f, 0xb1, 0x2e, 0xde, + 0x05, 0xc3, 0x76, 0xa3, 0xba, 0x83, 0x9a, 0xd9, 0x61, 0x2f, 0xb6, 0xd3, 0x8a, 0x9f, 0x9d, 0x4a, + 0x90, 0x9d, 0xca, 0x2a, 0x6e, 0x96, 0xb2, 0xbf, 0xb7, 0xee, 0xa8, 0x39, 0x4d, 0x9b, 0x11, 0x65, + 0xa3, 0x51, 0xfd, 0x18, 0x35, 0x55, 0x7e, 0x5a, 0x2c, 0x82, 0xa1, 0x3d, 0x58, 0x6f, 0xa0, 0xec, + 0x79, 0x8f, 0x66, 0x36, 0x90, 0xc8, 0x4d, 0xc9, 0x88, 0x3e, 0x66, 0x4c, 0x69, 0xff, 0x48, 0xf1, + 0xf6, 0xd7, 0x8f, 0xf2, 0xa9, 0x67, 0x8f, 0xf2, 0xa9, 0xaf, 0x4e, 0xf6, 0x97, 0xda, 0xdd, 0xfb, + 0xf6, 0x64, 0x7f, 0x69, 0x2e, 0x12, 0xfb, 0xf6, 0xbc, 0x93, 0xaf, 0x00, 0xa9, 0x7d, 0x55, 0x45, + 0xd4, 0x26, 0x98, 0x22, 0xf9, 0xd7, 0x0c, 0x98, 0x28, 0x53, 0xe3, 0x8e, 0x6e, 0xb2, 0x17, 0x99, + 0xaa, 0x1d, 0xa5, 0x49, 0x9f, 0x5d, 0x1a, 0x08, 0xc6, 0x5b, 0x49, 0x5b, 0x71, 0x20, 0x43, 0x3c, + 0x45, 0xdf, 0x19, 0x30, 0x3d, 0xd7, 0x91, 0x16, 0x49, 0xcf, 0x75, 0xa4, 0xa9, 0x63, 0x5a, 0xac, + 0x42, 0xc4, 0x5a, 0xe7, 0x4a, 0x38, 0x77, 0x2a, 0x33, 0x6d, 0x55, 0xd0, 0xa1, 0x00, 0x8a, 0xef, + 0xf7, 0xd7, 0xf8, 0x72, 0x5c, 0xe3, 0x98, 0x5c, 0xb2, 0x04, 0xb2, 0xc9, 0xb5, 0x50, 0xdf, 0x1f, + 0xd3, 0xe0, 0x42, 0x99, 0x1a, 0xdc, 0x1a, 0x12, 0xef, 0x74, 0x2a, 0x36, 0xc1, 0xf3, 0x29, 0xdb, + 0xad, 0xd8, 0x06, 0x2d, 0xb5, 0xff, 0xa0, 0xe7, 0x2d, 0x30, 0x0c, 0x2d, 0xd2, 0xc0, 0xcc, 0x93, + 0x71, 0xd0, 0x1a, 0xe1, 0x67, 0x8a, 0xef, 0xc6, 0x02, 0xd8, 0xe6, 0x9f, 0x1b, 0xc0, 0x8b, 0xf1, + 0x00, 0x06, 0xf1, 0x90, 0x67, 0xc0, 0x54, 0xe4, 0xdf, 0x30, 0x6c, 0xdf, 0x64, 0xbc, 0x1e, 0x5e, + 0x42, 0x86, 0x89, 0x55, 0xa4, 0x3f, 0xe7, 0xe8, 0x6d, 0x81, 0x99, 0x56, 0xf4, 0xa8, 0xa3, 0x9d, + 0x3e, 0x82, 0x53, 0xe1, 0xf9, 0x4d, 0x47, 0xeb, 0x48, 0xab, 0x53, 0x16, 0xd2, 0x66, 0x4e, 0x4f, + 0xbb, 0x4e, 0x59, 0xbb, 0x36, 0xe7, 0xce, 0xa0, 0xcd, 0xed, 0xfe, 0xda, 0x24, 0x1a, 0x58, 0x22, + 0xe8, 0xb2, 0xed, 0x35, 0xb0, 0xc4, 0x6a, 0xa0, 0x94, 0xa8, 0x7a, 0x9d, 0xc0, 0xae, 0x23, 0xb7, + 0x94, 0x2a, 0xee, 0xb8, 0xc0, 0xfb, 0x95, 0xd4, 0xd6, 0xad, 0x3f, 0x0d, 0x66, 0x89, 0xd2, 0xa8, + 0x7b, 0xcf, 0x87, 0x7f, 0xe5, 0x05, 0xff, 0xae, 0x63, 0x2d, 0x06, 0x17, 0x23, 0xff, 0x94, 0x06, + 0xa3, 0x65, 0x6a, 0x6c, 0x61, 0xfd, 0xa5, 0x2e, 0x9b, 0xf7, 0xfa, 0x4b, 0x93, 0x8d, 0x4b, 0xd3, + 0x8a, 0x88, 0xfc, 0x8b, 0x00, 0x66, 0x62, 0x2b, 0x2f, 0x52, 0x91, 0x88, 0xa3, 0xe9, 0xd3, 0x3b, + 0x2a, 0x3f, 0x4b, 0x83, 0x2b, 0xee, 0x3b, 0x10, 0x62, 0x0d, 0xd5, 0xb7, 0x70, 0x95, 0x60, 0xdd, + 0xc4, 0x46, 0x64, 0x04, 0x79, 0x19, 0xe5, 0x15, 0x17, 0xc0, 0xb8, 0xe6, 0xbe, 0xf5, 0x5d, 0x15, + 0x6a, 0xc8, 0x34, 0x6a, 0x7e, 0x01, 0x67, 0xd4, 0xb1, 0x60, 0xf9, 0x43, 0x6f, 0xb5, 0xf8, 0x51, + 0xff, 0x3c, 0x58, 0x48, 0xcc, 0x18, 0xdd, 0x22, 0x29, 0x5f, 0x07, 0xf3, 0xbd, 0xf6, 0xc3, 0x06, + 0xfb, 0x9b, 0x00, 0xc6, 0xdd, 0xf4, 0xb1, 0x75, 0xc8, 0xd0, 0x06, 0x74, 0xa0, 0x45, 0xc5, 0xb7, + 0xc0, 0x08, 0x6c, 0xb0, 0x1a, 0x71, 0x4c, 0xd6, 0xec, 0x1b, 0xfd, 0x16, 0x54, 0x5c, 0x05, 0xc3, + 0xb6, 0xc7, 0xc0, 0x93, 0x23, 0xd7, 0x6d, 0x52, 0xf1, 0xed, 0xc4, 0x62, 0xe5, 0x1f, 0x2c, 0xbe, + 0xed, 0xba, 0xde, 0xa2, 0x74, 0x5d, 0x9e, 0x8f, 0xb8, 0xfc, 0x20, 0xfc, 0x3c, 0x48, 0xdc, 0x59, + 0x9e, 0x05, 0x97, 0x12, 0x4b, 0xa1, 0x8b, 0xff, 0x08, 0xde, 0xbb, 0x45, 0x25, 0x0c, 0x32, 0xb4, + 0x46, 0x30, 0xf5, 0xc7, 0xc2, 0xe7, 0x9e, 0x25, 0x65, 0x00, 0x30, 0xba, 0x5f, 0xe1, 0xa3, 0x6a, + 0xe6, 0x4c, 0xa3, 0xea, 0x08, 0x46, 0xf7, 0x37, 0x3c, 0x82, 0xe2, 0x6a, 0xff, 0x69, 0x24, 0x17, + 0xcf, 0x86, 0xa4, 0x87, 0xf2, 0x1c, 0xb8, 0xdc, 0x61, 0x39, 0x08, 0xcc, 0xca, 0x0f, 0xe7, 0x41, + 0xa6, 0x4c, 0x0d, 0x71, 0x17, 0x8c, 0x27, 0x3f, 0x92, 0x96, 0xba, 0x49, 0xd7, 0x3e, 0xc2, 0x4a, + 0x2b, 0x83, 0x63, 0xc3, 0xde, 0xb4, 0x03, 0x46, 0xe3, 0xa3, 0xee, 0x62, 0x0f, 0x92, 0x18, 0x52, + 0x7a, 0x63, 0x50, 0x64, 0x68, 0xec, 0x0b, 0xf0, 0xbf, 0x70, 0xee, 0xba, 0xd6, 0xe3, 0x74, 0x00, + 0x92, 0x5e, 0x1b, 0x00, 0x14, 0xb2, 0xef, 0x82, 0xf1, 0xe4, 0x78, 0xd2, 0x2b, 0x7a, 0x09, 0x6c, + 0xcf, 0xe8, 0x75, 0x7b, 0xd7, 0x56, 0x01, 0x88, 0xbc, 0x13, 0x5f, 0xed, 0xc1, 0xd0, 0x82, 0x49, + 0xcb, 0x03, 0xc1, 0x42, 0x1b, 0xdf, 0x0b, 0x60, 0xb6, 0x7b, 0xa3, 0x7e, 0xb3, 0x97, 0xe6, 0xdd, + 0x4e, 0x49, 0xb7, 0xce, 0x72, 0x2a, 0xbc, 0x51, 0x0d, 0xfc, 0x3f, 0xd6, 0xa6, 0x16, 0x7a, 0x39, + 0x14, 0x01, 0x4a, 0x85, 0x01, 0x81, 0xa1, 0x25, 0x06, 0x26, 0xda, 0xba, 0x45, 0xaf, 0x9c, 0x48, + 0x82, 0xa5, 0x9b, 0xa7, 0x00, 0x07, 0x56, 0xa5, 0xa1, 0x2f, 0xdd, 0x56, 0x58, 0xba, 0xfb, 0xf8, + 0x28, 0x27, 0x3c, 0x39, 0xca, 0x09, 0x7f, 0x1f, 0xe5, 0x84, 0x87, 0xc7, 0xb9, 0xd4, 0x93, 0xe3, + 0x5c, 0xea, 0x8f, 0xe3, 0x5c, 0xea, 0xf3, 0xd7, 0x7b, 0x7e, 0xe8, 0xb4, 0x7a, 0xa3, 0xf7, 0xc9, + 0x53, 0x1d, 0xf6, 0x5a, 0xce, 0xcd, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x65, 0xc4, 0xd1, 0x56, + 0x1f, 0x12, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -777,6 +865,10 @@ type MsgClient interface { // parameters. // Since: cosmos-sdk 0.47 UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) + // RotateConsPubKey defines an operation for rotating the consensus keys + // of a validator. + // Since: cosmos-sdk 0.48 + RotateConsPubKey(ctx context.Context, in *MsgRotateConsPubKey, opts ...grpc.CallOption) (*MsgRotateConsPubKeyResponse, error) } type msgClient struct { @@ -850,6 +942,15 @@ func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts return out, nil } +func (c *msgClient) RotateConsPubKey(ctx context.Context, in *MsgRotateConsPubKey, opts ...grpc.CallOption) (*MsgRotateConsPubKeyResponse, error) { + out := new(MsgRotateConsPubKeyResponse) + err := c.cc.Invoke(ctx, "/cosmos.staking.v1beta1.Msg/RotateConsPubKey", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // CreateValidator defines a method for creating a new validator. @@ -874,6 +975,10 @@ type MsgServer interface { // parameters. // Since: cosmos-sdk 0.47 UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) + // RotateConsPubKey defines an operation for rotating the consensus keys + // of a validator. + // Since: cosmos-sdk 0.48 + RotateConsPubKey(context.Context, *MsgRotateConsPubKey) (*MsgRotateConsPubKeyResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -901,6 +1006,9 @@ func (*UnimplementedMsgServer) CancelUnbondingDelegation(ctx context.Context, re func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") } +func (*UnimplementedMsgServer) RotateConsPubKey(ctx context.Context, req *MsgRotateConsPubKey) (*MsgRotateConsPubKeyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RotateConsPubKey not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -1032,6 +1140,24 @@ func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _Msg_RotateConsPubKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRotateConsPubKey) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RotateConsPubKey(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosmos.staking.v1beta1.Msg/RotateConsPubKey", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RotateConsPubKey(ctx, req.(*MsgRotateConsPubKey)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "cosmos.staking.v1beta1.Msg", HandlerType: (*MsgServer)(nil), @@ -1064,6 +1190,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "UpdateParams", Handler: _Msg_UpdateParams_Handler, }, + { + MethodName: "RotateConsPubKey", + Handler: _Msg_RotateConsPubKey_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "cosmos/staking/v1beta1/tx.proto", @@ -1649,6 +1779,71 @@ func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *MsgRotateConsPubKey) 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 *MsgRotateConsPubKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRotateConsPubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.NewPubkey != nil { + { + size, err := m.NewPubkey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if len(m.ValidatorAddress) > 0 { + i -= len(m.ValidatorAddress) + copy(dAtA[i:], m.ValidatorAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.ValidatorAddress))) + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *MsgRotateConsPubKeyResponse) 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 *MsgRotateConsPubKeyResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRotateConsPubKeyResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -1879,6 +2074,32 @@ func (m *MsgUpdateParamsResponse) Size() (n int) { return n } +func (m *MsgRotateConsPubKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ValidatorAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.NewPubkey != nil { + l = m.NewPubkey.Size() + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgRotateConsPubKeyResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -3558,6 +3779,174 @@ func (m *MsgUpdateParamsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgRotateConsPubKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgRotateConsPubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRotateConsPubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewPubkey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NewPubkey == nil { + m.NewPubkey = &types.Any{} + } + if err := m.NewPubkey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRotateConsPubKeyResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgRotateConsPubKeyResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRotateConsPubKeyResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0